]> git.donarmstrong.com Git - roundcube.git/commitdiff
Imported Upstream version 0.2~alpha
authorJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:02:10 +0000 (17:02 +0200)
committerJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:02:10 +0000 (17:02 +0200)
586 files changed:
._INSTALL [new file with mode: 0644]
._README [new file with mode: 0644]
._UPGRADING [new file with mode: 0644]
CHANGELOG
INSTALL
README
SQL/mysql.initial.sql
SQL/mysql.update.sql
SQL/mysql5.initial.sql
SQL/postgres.initial.sql
SQL/postgres.update.sql
SQL/sqlite.initial.sql
SQL/sqlite.update.sql
UPGRADING
bin/html2text.php
bin/modcss.php
bin/msgexport.sh [new file with mode: 0755]
bin/msgimport [deleted file]
bin/msgimport.sh [new file with mode: 0755]
config/main.inc.php.dist
index.php
installer/._config.php [new file with mode: 0644]
installer/check.php
installer/config.php
installer/index.php
installer/rcube_install.php
installer/test.php
installer/welcome.html
program/include/._main.inc [new file with mode: 0644]
program/include/bugs.inc
program/include/html.php [new file with mode: 0644]
program/include/iniset.php [new file with mode: 0755]
program/include/main.inc
program/include/rcmail.php [new file with mode: 0644]
program/include/rcmail_template.inc [deleted file]
program/include/rcube_browser.php [new file with mode: 0644]
program/include/rcube_config.php [new file with mode: 0644]
program/include/rcube_contacts.inc [deleted file]
program/include/rcube_contacts.php [new file with mode: 0644]
program/include/rcube_db.inc [deleted file]
program/include/rcube_db.php [new file with mode: 0644]
program/include/rcube_html.inc [deleted file]
program/include/rcube_html_page.php [new file with mode: 0644]
program/include/rcube_imap.inc [deleted file]
program/include/rcube_imap.php [new file with mode: 0644]
program/include/rcube_json_output.php [new file with mode: 0644]
program/include/rcube_ldap.inc [deleted file]
program/include/rcube_ldap.php [new file with mode: 0644]
program/include/rcube_mail_mime.php [new file with mode: 0644]
program/include/rcube_mdb2.inc [deleted file]
program/include/rcube_mdb2.php [new file with mode: 0644]
program/include/rcube_message.php [new file with mode: 0644]
program/include/rcube_result_set.php [new file with mode: 0644]
program/include/rcube_shared.inc
program/include/rcube_smtp.inc
program/include/rcube_template.php [new file with mode: 0755]
program/include/rcube_user.inc [deleted file]
program/include/rcube_user.php [new file with mode: 0644]
program/include/session.inc
program/js/app.js
program/js/common.js
program/js/editor.js
program/js/list.js
program/js/tiny_mce/blank.htm [deleted file]
program/js/tiny_mce/langs/en.js
program/js/tiny_mce/langs/readme.txt [deleted file]
program/js/tiny_mce/license.txt
program/js/tiny_mce/plugins/cleanup/editor_plugin.js [deleted file]
program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js [deleted file]
program/js/tiny_mce/plugins/cleanup/readme.txt [deleted file]
program/js/tiny_mce/plugins/compat2x/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/compat2x/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/contextmenu/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/directionality/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/directionality/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/editor_plugin.js
program/js/tiny_mce/plugins/emotions/editor_plugin_src.js
program/js/tiny_mce/plugins/emotions/emotions.htm
program/js/tiny_mce/plugins/emotions/images/emotions.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/readme.txt [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif [deleted file]
program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif [deleted file]
program/js/tiny_mce/plugins/emotions/img/smiley-cool.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-frown.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-wink.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/img/smiley-yell.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/js/emotions.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/jscripts/functions.js [deleted file]
program/js/tiny_mce/plugins/emotions/langs/en.js [deleted file]
program/js/tiny_mce/plugins/emotions/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/readme.txt [deleted file]
program/js/tiny_mce/plugins/media/css/content.css
program/js/tiny_mce/plugins/media/css/media.css
program/js/tiny_mce/plugins/media/editor_plugin.js
program/js/tiny_mce/plugins/media/editor_plugin_src.js
program/js/tiny_mce/plugins/media/images/flash.gif [deleted file]
program/js/tiny_mce/plugins/media/images/media.gif [deleted file]
program/js/tiny_mce/plugins/media/images/quicktime.gif [deleted file]
program/js/tiny_mce/plugins/media/images/realmedia.gif [deleted file]
program/js/tiny_mce/plugins/media/images/shockwave.gif [deleted file]
program/js/tiny_mce/plugins/media/images/windowsmedia.gif [deleted file]
program/js/tiny_mce/plugins/media/img/flash.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/img/flv_player.swf [new file with mode: 0644]
program/js/tiny_mce/plugins/media/img/quicktime.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/img/realmedia.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/img/shockwave.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/img/trans.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/img/windowsmedia.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/js/embed.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/js/media.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/jscripts/embed.js [deleted file]
program/js/tiny_mce/plugins/media/jscripts/media.js [deleted file]
program/js/tiny_mce/plugins/media/langs/en.js [deleted file]
program/js/tiny_mce/plugins/media/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/media.htm
program/js/tiny_mce/plugins/nonbreaking/editor_plugin.js
program/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif [deleted file]
program/js/tiny_mce/plugins/nonbreaking/langs/en.js [deleted file]
program/js/tiny_mce/plugins/paste/blank.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/css/blank.css [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/css/pasteword.css [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/js/pastetext.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/js/pasteword.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/pastetext.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/pasteword.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/readme.txt [deleted file]
program/js/tiny_mce/plugins/searchreplace/css/searchreplace.css
program/js/tiny_mce/plugins/searchreplace/editor_plugin.js
program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
program/js/tiny_mce/plugins/searchreplace/images/replace.gif [deleted file]
program/js/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif [deleted file]
program/js/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif [deleted file]
program/js/tiny_mce/plugins/searchreplace/images/search.gif [deleted file]
program/js/tiny_mce/plugins/searchreplace/js/searchreplace.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js [deleted file]
program/js/tiny_mce/plugins/searchreplace/langs/en.js [deleted file]
program/js/tiny_mce/plugins/searchreplace/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/readme.txt [deleted file]
program/js/tiny_mce/plugins/searchreplace/searchreplace.htm
program/js/tiny_mce/plugins/spellchecker/changelog [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/config.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/css/content.css
program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css [deleted file]
program/js/tiny_mce/plugins/spellchecker/editor_plugin.js
program/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js
program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif [deleted file]
program/js/tiny_mce/plugins/spellchecker/images/wline.gif [deleted file]
program/js/tiny_mce/plugins/spellchecker/img/wline.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/langs/en.js [deleted file]
program/js/tiny_mce/plugins/spellchecker/tinyspell.php [deleted file]
program/js/tiny_mce/plugins/table/cell.htm
program/js/tiny_mce/plugins/table/css/cell.css
program/js/tiny_mce/plugins/table/css/row.css
program/js/tiny_mce/plugins/table/css/table.css
program/js/tiny_mce/plugins/table/editor_plugin.js
program/js/tiny_mce/plugins/table/editor_plugin_src.js
program/js/tiny_mce/plugins/table/images/buttons.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_cell_props.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_delete.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_delete_col.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_delete_row.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_merge_cells.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_row_props.gif [deleted file]
program/js/tiny_mce/plugins/table/images/table_split_cells.gif [deleted file]
program/js/tiny_mce/plugins/table/js/cell.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/js/merge_cells.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/js/row.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/js/table.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/jscripts/cell.js [deleted file]
program/js/tiny_mce/plugins/table/jscripts/merge_cells.js [deleted file]
program/js/tiny_mce/plugins/table/jscripts/row.js [deleted file]
program/js/tiny_mce/plugins/table/jscripts/table.js [deleted file]
program/js/tiny_mce/plugins/table/langs/en.js [deleted file]
program/js/tiny_mce/plugins/table/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/merge_cells.htm
program/js/tiny_mce/plugins/table/readme.txt [deleted file]
program/js/tiny_mce/plugins/table/row.htm
program/js/tiny_mce/plugins/table/table.htm
program/js/tiny_mce/plugins/visualchars/editor_plugin.js
program/js/tiny_mce/plugins/visualchars/editor_plugin_src.js
program/js/tiny_mce/plugins/visualchars/images/visualchars.gif [deleted file]
program/js/tiny_mce/plugins/visualchars/langs/en.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/abbr.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/acronym.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/attributes.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/cite.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/css/popup.css [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/del.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/ins.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/cite.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/del.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/js/ins.js [new file with mode: 0644]
program/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/about.htm
program/js/tiny_mce/themes/advanced/anchor.htm
program/js/tiny_mce/themes/advanced/charmap.htm
program/js/tiny_mce/themes/advanced/color_picker.htm
program/js/tiny_mce/themes/advanced/css/editor_content.css [deleted file]
program/js/tiny_mce/themes/advanced/css/editor_popup.css [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/about.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/index.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm [deleted file]
program/js/tiny_mce/themes/advanced/docs/en/style.css [deleted file]
program/js/tiny_mce/themes/advanced/editor_template.js
program/js/tiny_mce/themes/advanced/editor_template_src.js
program/js/tiny_mce/themes/advanced/image.htm
program/js/tiny_mce/themes/advanced/images/anchor.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/backcolor.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bold.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bold_de_se.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bold_es.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bold_fr.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bold_ru.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bold_tw.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/browse.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/bullist.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/button_menu.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/buttons.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/charmap.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/cleanup.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/close.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/code.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/color.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/colors.jpg [deleted file]
program/js/tiny_mce/themes/advanced/images/copy.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/custom_1.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/cut.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/forecolor.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/help.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/hr.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/image.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/indent.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/italic.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/italic_de_se.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/italic_es.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/italic_ru.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/italic_tw.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/justifycenter.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/justifyfull.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/justifyleft.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/justifyright.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/link.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/menu_check.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/newdocument.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/numlist.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/opacity.png [deleted file]
program/js/tiny_mce/themes/advanced/images/outdent.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/paste.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/redo.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/removeformat.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/separator.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/spacer.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/strikethrough.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/sub.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/sup.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/underline.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/underline_es.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/underline_fr.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/underline_ru.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/underline_tw.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/undo.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/unlink.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/visualaid.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif [deleted file]
program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif [deleted file]
program/js/tiny_mce/themes/advanced/img/colorpicker.jpg [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/img/icons.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/about.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/anchor.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/charmap.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/color_picker.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/image.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/link.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/js/source_editor.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/about.js [deleted file]
program/js/tiny_mce/themes/advanced/jscripts/anchor.js [deleted file]
program/js/tiny_mce/themes/advanced/jscripts/charmap.js [deleted file]
program/js/tiny_mce/themes/advanced/jscripts/color_picker.js [deleted file]
program/js/tiny_mce/themes/advanced/jscripts/image.js [deleted file]
program/js/tiny_mce/themes/advanced/jscripts/link.js [deleted file]
program/js/tiny_mce/themes/advanced/jscripts/source_editor.js [deleted file]
program/js/tiny_mce/themes/advanced/langs/en.js
program/js/tiny_mce/themes/advanced/langs/en_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/link.htm
program/js/tiny_mce/themes/advanced/skins/default/content.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/dialog.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/img/buttons.png [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/img/items.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/img/progress.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/default/ui.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/content.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/ui.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/source_editor.htm
program/js/tiny_mce/themes/simple/editor_template.js [new file with mode: 0644]
program/js/tiny_mce/themes/simple/editor_template_src.js [new file with mode: 0644]
program/js/tiny_mce/themes/simple/img/icons.gif [new file with mode: 0644]
program/js/tiny_mce/themes/simple/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/themes/simple/skins/default/content.css [new file with mode: 0644]
program/js/tiny_mce/themes/simple/skins/default/ui.css [new file with mode: 0644]
program/js/tiny_mce/themes/simple/skins/o2k7/content.css [new file with mode: 0644]
program/js/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png [new file with mode: 0644]
program/js/tiny_mce/themes/simple/skins/o2k7/ui.css [new file with mode: 0644]
program/js/tiny_mce/tiny_mce.js
program/js/tiny_mce/tiny_mce_popup.js
program/js/tiny_mce/tiny_mce_src.js
program/js/tiny_mce/utils/editable_selects.js
program/js/tiny_mce/utils/form_utils.js
program/js/tiny_mce/utils/mclayer.js [deleted file]
program/js/tiny_mce/utils/mctabs.js
program/js/tiny_mce/utils/validate.js
program/lib/._enriched.inc [new file with mode: 0644]
program/lib/._utf7.inc [new file with mode: 0644]
program/lib/._washtml.php [new file with mode: 0644]
program/lib/html2text.inc [deleted file]
program/lib/html2text.php [new file with mode: 0644]
program/lib/imap.inc
program/lib/magic [deleted file]
program/lib/rc_mail_mime.inc [deleted file]
program/lib/washtml.php [new file with mode: 0644]
program/localization/am/labels.inc [deleted file]
program/localization/am/messages.inc [deleted file]
program/localization/ar/labels.inc [deleted file]
program/localization/ar/messages.inc [deleted file]
program/localization/ar_SA/labels.inc [new file with mode: 0644]
program/localization/ar_SA/messages.inc [new file with mode: 0644]
program/localization/bg/labels.inc [deleted file]
program/localization/bg/messages.inc [deleted file]
program/localization/bg_BG/labels.inc [new file with mode: 0644]
program/localization/bg_BG/messages.inc [new file with mode: 0644]
program/localization/ca/labels.inc [deleted file]
program/localization/ca/messages.inc [deleted file]
program/localization/ca_ES/labels.inc [new file with mode: 0644]
program/localization/ca_ES/messages.inc [new file with mode: 0644]
program/localization/cs_CZ/labels.inc [new file with mode: 0644]
program/localization/cs_CZ/messages.inc [new file with mode: 0644]
program/localization/cz/labels.inc [deleted file]
program/localization/cz/messages.inc [deleted file]
program/localization/da/labels.inc [deleted file]
program/localization/da/messages.inc [deleted file]
program/localization/da_DK/labels.inc [new file with mode: 0644]
program/localization/da_DK/messages.inc [new file with mode: 0644]
program/localization/de_CH/labels.inc
program/localization/de_CH/messages.inc
program/localization/de_DE/labels.inc
program/localization/de_DE/messages.inc
program/localization/el/labels.inc [deleted file]
program/localization/el/messages.inc [deleted file]
program/localization/el_GR/labels.inc [new file with mode: 0644]
program/localization/el_GR/messages.inc [new file with mode: 0644]
program/localization/en_GB/labels.inc
program/localization/en_US/labels.inc
program/localization/en_US/messages.inc
program/localization/es/labels.inc [deleted file]
program/localization/es/messages.inc [deleted file]
program/localization/es_ES/labels.inc [new file with mode: 0644]
program/localization/es_ES/messages.inc [new file with mode: 0644]
program/localization/et_EE/labels.inc
program/localization/et_EE/messages.inc
program/localization/eu/labels.inc [deleted file]
program/localization/eu/messages.inc [deleted file]
program/localization/eu_ES/labels.inc [new file with mode: 0644]
program/localization/eu_ES/messages.inc [new file with mode: 0644]
program/localization/fi/labels.inc [deleted file]
program/localization/fi/messages.inc [deleted file]
program/localization/fi_FI/labels.inc [new file with mode: 0644]
program/localization/fi_FI/messages.inc [new file with mode: 0644]
program/localization/fr/labels.inc [deleted file]
program/localization/fr/messages.inc [deleted file]
program/localization/fr_FR/labels.inc [new file with mode: 0644]
program/localization/fr_FR/messages.inc [new file with mode: 0644]
program/localization/ge/labels.inc [deleted file]
program/localization/ge/messages.inc [deleted file]
program/localization/gl/labels.inc [deleted file]
program/localization/gl/messages.inc [deleted file]
program/localization/gl_ES/labels.inc [new file with mode: 0644]
program/localization/gl_ES/messages.inc [new file with mode: 0644]
program/localization/he/labels.inc [deleted file]
program/localization/he/messages.inc [deleted file]
program/localization/he_IL/labels.inc [new file with mode: 0644]
program/localization/he_IL/messages.inc [new file with mode: 0644]
program/localization/hi/labels.inc [deleted file]
program/localization/hi/messages.inc [deleted file]
program/localization/hi_IN/labels.inc [new file with mode: 0644]
program/localization/hi_IN/messages.inc [new file with mode: 0644]
program/localization/hu/labels.inc [deleted file]
program/localization/hu/messages.inc [deleted file]
program/localization/hu_HU/labels.inc [new file with mode: 0644]
program/localization/hu_HU/messages.inc [new file with mode: 0644]
program/localization/hy_AM/labels.inc [new file with mode: 0644]
program/localization/hy_AM/messages.inc [new file with mode: 0644]
program/localization/index.inc
program/localization/is/labels.inc [deleted file]
program/localization/is/messages.inc [deleted file]
program/localization/is_IS/labels.inc [new file with mode: 0644]
program/localization/is_IS/messages.inc [new file with mode: 0644]
program/localization/it/labels.inc [deleted file]
program/localization/it/messages.inc [deleted file]
program/localization/it_IT/labels.inc [new file with mode: 0644]
program/localization/it_IT/messages.inc [new file with mode: 0644]
program/localization/ja/labels.inc [deleted file]
program/localization/ja/messages.inc [deleted file]
program/localization/ja_JP/labels.inc [new file with mode: 0644]
program/localization/ja_JP/messages.inc [new file with mode: 0644]
program/localization/ka_GE/labels.inc [new file with mode: 0755]
program/localization/ka_GE/messages.inc [new file with mode: 0755]
program/localization/ko_KR/labels.inc [new file with mode: 0644]
program/localization/ko_KR/messages.inc [new file with mode: 0644]
program/localization/kr/labels.inc [deleted file]
program/localization/kr/messages.inc [deleted file]
program/localization/lt/labels.inc [deleted file]
program/localization/lt/messages.inc [deleted file]
program/localization/lt_LT/labels.inc [new file with mode: 0644]
program/localization/lt_LT/messages.inc [new file with mode: 0644]
program/localization/lv/labels.inc [deleted file]
program/localization/lv/messages.inc [deleted file]
program/localization/lv_LV/labels.inc [new file with mode: 0644]
program/localization/lv_LV/messages.inc [new file with mode: 0644]
program/localization/mk/labels.inc [deleted file]
program/localization/mk/messages.inc [deleted file]
program/localization/mk_MK/labels.inc [new file with mode: 0755]
program/localization/mk_MK/messages.inc [new file with mode: 0755]
program/localization/ms_MY/labels.inc
program/localization/ms_MY/messages.inc
program/localization/nb_NO/labels.inc
program/localization/ne/labels.inc [deleted file]
program/localization/ne/messages.inc [deleted file]
program/localization/ne_NP/labels.inc [new file with mode: 0644]
program/localization/ne_NP/messages.inc [new file with mode: 0644]
program/localization/nl_NL/labels.inc
program/localization/pl/labels.inc [deleted file]
program/localization/pl/messages.inc [deleted file]
program/localization/pl_PL/labels.inc [new file with mode: 0644]
program/localization/pl_PL/messages.inc [new file with mode: 0644]
program/localization/pt_PT/labels.inc
program/localization/ro/labels.inc [deleted file]
program/localization/ro/messages.inc [deleted file]
program/localization/ro_RO/labels.inc [new file with mode: 0644]
program/localization/ro_RO/messages.inc [new file with mode: 0644]
program/localization/ru/labels.inc [deleted file]
program/localization/ru/messages.inc [deleted file]
program/localization/ru_RU/labels.inc [new file with mode: 0644]
program/localization/ru_RU/messages.inc [new file with mode: 0644]
program/localization/se/labels.inc [deleted file]
program/localization/se/messages.inc [deleted file]
program/localization/si/labels.inc [deleted file]
program/localization/si/messages.inc [deleted file]
program/localization/si_LK/labels.inc [new file with mode: 0644]
program/localization/si_LK/messages.inc [new file with mode: 0644]
program/localization/sk/labels.inc [deleted file]
program/localization/sk/messages.inc [deleted file]
program/localization/sk_SK/labels.inc [new file with mode: 0644]
program/localization/sk_SK/messages.inc [new file with mode: 0644]
program/localization/sl/labels.inc [deleted file]
program/localization/sl/messages.inc [deleted file]
program/localization/sl_SI/labels.inc [new file with mode: 0644]
program/localization/sl_SI/messages.inc [new file with mode: 0644]
program/localization/sr_CS/labels.inc [new file with mode: 0644]
program/localization/sr_CS/messages.inc [new file with mode: 0644]
program/localization/sr_cyrillic/labels.inc [deleted file]
program/localization/sr_cyrillic/messages.inc [deleted file]
program/localization/sr_latin/labels.inc [deleted file]
program/localization/sr_latin/messages.inc [deleted file]
program/localization/sv_SE/labels.inc [new file with mode: 0644]
program/localization/sv_SE/messages.inc [new file with mode: 0644]
program/localization/tr/labels.inc [deleted file]
program/localization/tr/messages.inc [deleted file]
program/localization/tr_TR/labels.inc [new file with mode: 0644]
program/localization/tr_TR/messages.inc [new file with mode: 0644]
program/localization/uk/labels.inc [deleted file]
program/localization/uk/messages.inc [deleted file]
program/localization/uk_UA/labels.inc [new file with mode: 0644]
program/localization/uk_UA/messages.inc [new file with mode: 0644]
program/localization/vi_VN/labels.inc [new file with mode: 0644]
program/localization/vi_VN/messages.inc [new file with mode: 0644]
program/localization/vn/labels.inc [deleted file]
program/localization/vn/messages.inc [deleted file]
program/localization/zh_CN/labels.inc
program/localization/zh_CN/messages.inc
program/localization/zh_TW/labels.inc
program/steps/addressbook/delete.inc
program/steps/addressbook/edit.inc
program/steps/addressbook/func.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/mark.inc
program/steps/mail/move_del.inc
program/steps/mail/quotadisplay.inc [deleted file]
program/steps/mail/sendmail.inc
program/steps/mail/sendmdn.inc
program/steps/mail/show.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/identities.inc
program/steps/settings/manage_folders.inc
program/steps/settings/save_identity.inc
program/steps/settings/save_prefs.inc
skins/default/common.css
skins/default/editor_ui.css [deleted file]
skins/default/includes/settingstabs.html
skins/default/mail.css
skins/default/settings.css
skins/default/templates/compose.html
skins/default/templates/mail.html
skins/default/templates/message.html
skins/default/templates/messagepart.html
skins/default/templates/settings.html

diff --git a/._INSTALL b/._INSTALL
new file mode 100644 (file)
index 0000000..9293550
Binary files /dev/null and b/._INSTALL differ
diff --git a/._README b/._README
new file mode 100644 (file)
index 0000000..7cc650c
Binary files /dev/null and b/._README differ
diff --git a/._UPGRADING b/._UPGRADING
new file mode 100644 (file)
index 0000000..64a3886
Binary files /dev/null and b/._UPGRADING differ
index 8093ccc69359b08d4aaf983e6586cadc2897a1fe..d0fa0e4eb6813c8ec5acc18a4e254d1a663e1c6b 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,57 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+- Added option to disable autocompletion from selected LDAP address books (#1484922)
+- TLS support in LDAP connections: 'use_tls' property (#1485104)
+- Fixed removing messages from search set after deleting them (#1485106)
+- imap.inc: Fixed iil_C_FetchStructureString() to handle many 
+  literal strings in response (#1484969)
+- Support for subfolders in default/protected folders (#1484665)
+- Disallowed delimiter in folder name (#1484803)
+- Support " and \ in folder names
+- Escape \ in login (#1484614)
+- Better HTML sanitization with the DOM-based washtml script (#1484701)
+- Fixed sorting of folders with non-ascii characters
+- Fixed Mysql DDL for default identities creation (#1485070)
+- In Preferences added possibility to configure 'read_when_deleted',
+  'mdn_requests', 'flag_for_deletion' options
+- Made IMAP auth type configurable (#1483825)
+- Fixed empty values with FROM_UNIXTIME() in rcube_mdb2 (#1485055)
+- Fixed attachment list on IE 6/7 (#1484807)
+- Fixed JavaScript in compose.html that shows cc/bcc fields if populated
+- Make password input fields of type password in installer (#1484886)
+- Don't attempt to delete cache entries if enable_caching is FALSE (#1485051)
+- Optimized messages sorting on servers without sort capability (#1485049)
+- Corrected message headers decoding when charset isn't specified and improved
+  support for native languages (#1485050, #1485048)
+- Expanded LDAP configuration options to support LDAP server writes.
+- Installer: encode special characters in DB username/password (#1485042)
+- Fixed management of folders with national characters in names (#1485036, #1485001)
+- Fixed identities saving when using MDB2 pgsql driver (#1485032)
+- Fixed BCC header reset (#1484997)
+- Improved messages list performance - patch from Justin Heesemann
+- Append skin_path to images location only when it starts with '/' sign (#1484859)
+- Fix IMAP response in message body when message has no body (#1484964)
+- Fixed non-RFC dates formatting (#1484901)
+- Fixed typo in set_charset() (#1484991)
+- Decode entities when inserting HTML signature to plain text message (#1484990)
+- HTML editing is now working with PHP5 updates and TinyMCE v3.0.6
+- Fixed signature loading on Windows (#1484545)
+- Added language support to HTML editing (#1484862)
+- Fixed remove signature when replying (#1333167)
+- Fixed problem with line with a space at the end (#1484916)
+- Fixed <!DOCTYPE> tag filtering (#1484391)
+- Fixed <?xml> tag filtering (#1484403)
+- Added sections (fieldset+label) in Settings interface
+- Mark as read in one action with message preview (#1484972)
+- Deleted redundant quota reads (#1484972)
+- Added options for empty trash and expunge inbox on logout (#1483863)
+- Removed lines wrapping when displaying message
+- Fixed month localization
+- Changed codebase to PHP5 with autoloader
+
+RELEASE 0.1.1
+
 - Clear selection when selecting single item (#1484942)
 - Remove hard-coded image size in skin templates (#1484893)
 - Database schema improvements (dropped unnecessary indexes)
diff --git a/INSTALL b/INSTALL
index 2b8fb2efaac4b184b4c745124ccaf9ad0bec95e8..e2f9a4e9419eb68a8ed35f2eecb530954058f91b 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -11,7 +11,7 @@ REQUIREMENTS
 
 * The Apache or Lighttpd Webserver
 * .htaccess support allowing overrides for DirectoryIndex
-* PHP Version 4.3.1 or greater including
+* PHP Version 5.2 or greater including
    - PCRE (perl compatible regular expression)
    - Libiconv
    - Multibyte String (mbstring)
diff --git a/README b/README
index 7aae054a0ca825689b3b1de8d9d66add79c07453..e23c494dc8710fe0e4008075e12cd52f558866d5 100644 (file)
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 RoundCube Webmail (http://roundcube.net)
-
+=================
 
 Introduction:
 -------------
@@ -43,6 +43,9 @@ records. If you have 'auto_create_user' set to FALSE only IMAP logins which
 already have a corresponding entry in the user's table (username and hostname)
 will be allowed.
 
+Read more at http://trac.roundcube.net/wiki/Howto_Config
+and http://trac.roundcube.net/wiki/Dev_Docs
+
 
 Contact:
 --------
index ae195e4387ec8ac0d87df78041d3c51dc47b440c..fadc072800094728b6901cde268263d14fa8c41b 100644 (file)
@@ -50,12 +50,12 @@ CREATE TABLE `identities` (
   `user_id` int(10) unsigned NOT NULL default '0',
   `del` tinyint(1) NOT NULL default '0',
   `standard` tinyint(1) NOT NULL default '0',
-  `name` varchar(128) NOT NULL default '',
+  `name` varchar(128) NOT NULL,
   `organization` varchar(128) NOT NULL default '',
-  `email` varchar(128) NOT NULL default '',
+  `email` varchar(128) NOT NULL,
   `reply-to` varchar(128) NOT NULL default '',
   `bcc` varchar(128) NOT NULL default '',
-  `signature` text NOT NULL,
+  `signature` text NOT NULL default '',
   `html_signature` tinyint(1) NOT NULL default '0',
   PRIMARY KEY  (`identity_id`),
   KEY `user_id` (`user_id`)
@@ -91,7 +91,9 @@ CREATE TABLE `users` (
   `last_login` datetime NOT NULL default '0000-00-00 00:00:00',
   `language` varchar(5) NOT NULL default 'en',
   `preferences` text,
-  PRIMARY KEY  (`user_id`)
+  PRIMARY KEY  (`user_id`),
+  INDEX `username_index` (`username`),
+  INDEX `alias_index` (`alias`)
 );
 
 -- --------------------------------------------------------
index 11e744cfa2a984cdefebfb3c4b95d951b9dc3c38..2a9603f3e005a72b6afc6aa865761cede76c2a63 100644 (file)
@@ -5,7 +5,7 @@ TRUNCATE TABLE `messages`;
 
 ALTER TABLE `messages`
   DROP INDEX `idx`,
-  DROP INDEX `uid`
+  DROP INDEX `uid`;
 
 ALTER TABLE `cache`
   DROP INDEX `cache_key`,
@@ -15,3 +15,13 @@ ALTER TABLE `cache`
 ALTER TABLE `users`
     ADD INDEX `username_index` (`username`),
     ADD INDEX `alias_index` (`alias`);
+
+-- Updates from version 0.1.1
+
+ALTER TABLE `identities`
+    MODIFY `signature` text NOT NULL DEFAULT '', 
+    MODIFY `bcc` varchar(128) NOT NULL DEFAULT '', 
+    MODIFY `reply-to` varchar(128) NOT NULL DEFAULT '', 
+    MODIFY `organization` varchar(128) NOT NULL DEFAULT '',
+    MODIFY `name` varchar(128) NOT NULL, 
+    MODIFY `email` varchar(128) NOT NULL; 
index 881344b985eecbace7d878b77194ea5c3a9e21fb..546eecd296cc95b4437c29c76ce5518bb6354697 100644 (file)
@@ -107,11 +107,11 @@ CREATE TABLE `identities` (
  `del` tinyint(1) NOT NULL DEFAULT '0',
  `standard` tinyint(1) NOT NULL DEFAULT '0',
  `name` varchar(128) NOT NULL,
- `organization` varchar(128) NOT NULL,
+ `organization` varchar(128) NOT NULL DEFAULT '',
  `email` varchar(128) NOT NULL,
- `reply-to` varchar(128) NOT NULL,
- `bcc` varchar(128) NOT NULL,
- `signature` text NOT NULL,
+ `reply-to` varchar(128) NOT NULL DEFAULT '',
+ `bcc` varchar(128) NOT NULL DEFAULT '',
+ `signature` text NOT NULL DEFAULT '',
  `html_signature` tinyint(1) NOT NULL DEFAULT '0',
  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY(`identity_id`),
index ff239cbf80aecd4e3f839c769a805c0c1cd5a316..05c61924aa0a1033c188bc7c334ef3e3e4d8a7fe 100644 (file)
@@ -25,7 +25,10 @@ CREATE TABLE users (
     preferences text DEFAULT ''::text NOT NULL
 );
 
+CREATE INDEX users_username_id_idx ON users (username);
+CREATE INDEX users_alias_id_idx ON users (alias);
 
+  
 --
 -- Table "session"
 -- Name: session; Type: TABLE; Schema: public; Owner: postgres
index ff1ce12e404b1e64cb1fb22319b6588b72aa30be..e0afa61ca258b460ac58d2e2b558dd747b2fb048 100644 (file)
@@ -5,6 +5,9 @@ CREATE INDEX cache_user_id_idx ON cache (user_id, cache_key);
 CREATE INDEX contacts_user_id_idx ON contacts (user_id);
 CREATE INDEX identities_user_id_idx ON identities (user_id);
 
+CREATE INDEX users_username_id_idx ON users (username);
+CREATE INDEX users_alias_id_idx ON users (alias);
+
 -- added ON DELETE/UPDATE actions
 ALTER TABLE messages DROP CONSTRAINT messages_user_id_fkey;
 ALTER TABLE messages ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE;
index 041696b1d878b4d365e2af38e4f49b86f3b21378..6adcf4dff908f07f38423f5791a30278058398b5 100644 (file)
@@ -80,6 +80,9 @@ CREATE TABLE users (
   preferences text NOT NULL default ''
 );
 
+CREATE INDEX ix_users_username ON users(username);
+CREATE INDEX ix_users_alias ON users(alias);
+
 -- --------------------------------------------------------
 
 -- 
index f609a3693db6d82647bd20a4256f02045ba15f19..047fe6731777bd0f743641057f6c830db712384d 100644 (file)
@@ -22,3 +22,6 @@ CREATE TABLE messages (
 );
 
 CREATE INDEX ix_messages_user_cache_uid ON messages(user_id,cache_key,uid);
+
+CREATE INDEX ix_users_username ON users(username);
+CREATE INDEX ix_users_alias ON users(alias);
index 9b5ac453264856071d04ddc19619088abf056119..996b4f258592e0dbcd4ed6db2994c6ee28862dc3 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,9 +1,25 @@
 UPDATE instructions
 ===================
 
-Follow these instructions if upgrading from a previous version
+First you should remove all subfolders from /program/localization/
+because most language codes have changed in 0.2-alpha. This way you
+can make sure that no old localization files remain on your disk.
+
+Then follow these instructions if upgrading from a previous version
 of RoundCube Webmail.
 
+from version 0.1.1
+----------------------------------------
+* replace index.php
+* replace all files in folder /bin/
+* replace all files in folder /program/
+* replace all files in folder /skins/default/
+* run all commands in SQL/[yourdbtype].update.sql
+  below the line "-- Updates from version 0.1.1"
+* check the config/main.inc.php.dist for new configuration 
+  options and add them to your config 
+
+
 from version 0.1-stable
 ----------------------------------------
 * replace index.php
@@ -11,6 +27,8 @@ from version 0.1-stable
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
 * run all commands in SQL/[yourdbtype].update.sql
+* check the config/main.inc.php.dist for new configuration options
+  and add them to your config 
 
 
 from version 0.1-rc2
@@ -28,7 +46,6 @@ from version 0.1-rc1
 * replace all files in folder /bin/
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql
 * If you have LDAP servers configured you should re-configure
   the config entries using the template given in /config/main.inc.php.dist
 
@@ -39,7 +56,8 @@ from version 0.1-beta2
 * replace all files in folder /bin/
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
-* re-initalize the database with [yourdbtype].initial.sql
+* run all commands in SQL/[yourdbtype].update.sql or
+  re-initalize the database with [yourdbtype].initial.sql
 * add these lines to /config/main.inc.php
    $rcmail_config['draft_autosave'] = 300;
    $rcmail_config['date_today'] = 'H:i';
@@ -53,7 +71,8 @@ form version 0.1-beta
 * replace all files in folder /bin/
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
-* re-initalize the database with [yourdbtype].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
index 7f74ac622cfb8532dba063a0ac396068352a64a8..0f0e6ae14de9ffb59ea151574f53185d5d0e710f 100644 (file)
@@ -1,21 +1,11 @@
 <?php
 
-require_once('../program/lib/html2text.inc');
+define('INSTALL_PATH', realpath('./../') . '/');
+require INSTALL_PATH.'program/include/iniset.php';
 
-$htmlText = $HTTP_RAW_POST_DATA;
-$converter = new html2text($htmlText);
+$converter = new html2text($HTTP_RAW_POST_DATA);
 
 header('Content-Type: text/plain; charset=UTF-8');
-$plaintext = $converter->get_text();
-
-$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;
+print html_entity_decode($converter->get_text(), ENT_COMPAT, 'UTF-8');
 
 ?>
index e482389a89d0004d9e869dfd2651cbf1b8c6b018..e97b8ec9c3a70ec121f10d874c0b9a59a9056af9 100644 (file)
 
 */
 
-$INSTALL_PATH = realpath("./../") . "/";
-ini_set('include_path', $INSTALL_PATH.PATH_SEPARATOR.$INSTALL_PATH.'program'.PATH_SEPARATOR.ini_get('include_path'));
-
-require 'include/main.inc';
+define('INSTALL_PATH', realpath('./../') . '/');
+require INSTALL_PATH.'program/include/iniset.php';
 
 $source = "";
 if ($url = preg_replace('/[^a-z0-9.-_\?\$&=%]/i', '', $_GET['u']))
diff --git a/bin/msgexport.sh b/bin/msgexport.sh
new file mode 100755 (executable)
index 0000000..890d48a
--- /dev/null
@@ -0,0 +1,147 @@
+#!/usr/bin/php -qC 
+<?php
+
+define('INSTALL_PATH', preg_replace('/bin\/$/', '', getcwd()) . '/');
+ini_set('memory_limit', -1);
+
+require_once INSTALL_PATH.'program/include/iniset.php';
+
+/**
+ * Parse commandline arguments into a hash array
+ */
+function get_opt($aliases=array())
+{
+       $args = array();
+       for ($i=1; $i<count($_SERVER['argv']); $i++)
+       {
+               $arg = $_SERVER['argv'][$i];
+               if (substr($arg, 0, 2) == '--')
+               {
+                       $sp = strpos($arg, '=');
+                       $key = substr($arg, 2, $sp - 2);
+                       $value = substr($arg, $sp+1);
+               }
+               else if ($arg{0} == '-')
+               {
+                       $key = substr($arg, 1);
+                       $value = $_SERVER['argv'][++$i];
+               }
+               else
+                       continue;
+
+               $args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
+               
+               if ($alias = $aliases[$key])
+                       $args[$alias] = $args[$key];
+       }
+
+       return $args;
+}
+
+function print_usage()
+{
+       print "Usage:  msgexport -h imap-host -u user-name -m mailbox name\n";
+       print "--host   IMAP host\n";
+       print "--user   IMAP user name\n";
+       print "--mbox   Mailbox/folder name\n";
+       print "--file   Mailbox/folder name\n";
+}
+
+function vputs($str)
+{
+       $out = $GLOBALS['args']['file'] ? STDOUT : STDERR;
+       fwrite($out, $str);
+}
+
+function progress_update($pos, $max)
+{
+       $percent = round(100 * $pos / $max);
+       vputs(sprintf("%3d%% [%-51s] %d/%d\033[K\r", $percent, @str_repeat('=', $percent / 2) . '>', $pos, $max));
+}
+
+
+// get arguments
+$args = get_opt(array('h' => 'host', 'u' => 'user', 'p' => 'pass', 'm' => 'mbox', 'f' => 'file')) + array('host' => 'localhost', 'mbox' => 'INBOX');
+
+if ($_SERVER['argv'][1] == 'help')
+{
+       print_usage();
+       exit;
+}
+else if (!$args['host'])
+{
+       vputs("Missing required parameters.\n");
+       print_usage();
+       exit;
+}
+
+// prompt for username if not set
+if (empty($args['user']))
+{
+       vputs("IMAP user: ");
+       $args['user'] = trim(fgets(STDIN));
+}
+
+// prompt for password
+vputs("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))
+{
+       vputs("IMAP login successful.\n");
+       
+       $IMAP->set_mailbox($args['mbox']);
+       
+       vputs("Getting message list of {$args['mbox']}...");
+       vputs($IMAP->messagecount()." messages\n");
+       
+       if ($args['file'])
+       {
+               if (!($out = fopen($args['file'], 'w')))
+               {
+                       vputs("Cannot write to output file\n");
+                       exit;
+               }
+       }
+       else
+               $out = STDOUT;
+       
+       for ($count = $IMAP->messagecount(), $i=1; $i <= $count; $i++)
+       {
+               $headers = $IMAP->get_headers($i, null, false);
+               $from = current($IMAP->decode_address_list($headers->from, 1, false));
+               
+               fwrite($out, sprintf("From %s %s UID %d\n", $from['mailto'], $headers->date, $headers->uid));
+               fwrite($out, iil_C_FetchPartHeader($IMAP->conn, $IMAP->mailbox, $i, null));
+               fwrite($out, iil_C_HandlePartBody($IMAP->conn, $IMAP->mailbox, $i, null, 1));
+               fwrite($out, "\n\n\n");
+               
+               progress_update($i, $count);
+       }
+       vputs("\ncomplete.\n");
+}
+else
+{
+       vputs("IMAP login failed.\n");
+}
+
+?>
\ No newline at end of file
diff --git a/bin/msgimport b/bin/msgimport
deleted file mode 100755 (executable)
index 0ed268f..0000000
+++ /dev/null
@@ -1,123 +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));
-
-// clear password input
-echo chr(8)."\rPassword: ".str_repeat("*", strlen($args['pass']))."\n";
-
-// 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
diff --git a/bin/msgimport.sh b/bin/msgimport.sh
new file mode 100755 (executable)
index 0000000..98a0389
--- /dev/null
@@ -0,0 +1,120 @@
+#!/usr/bin/php -qC 
+<?php
+
+define('INSTALL_PATH', preg_replace('/bin\/$/', '', getcwd()) . '/');
+ini_set('memory_limit', -1);
+
+require_once INSTALL_PATH.'program/include/iniset.php';
+
+/**
+ * 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));
+
+// clear password input
+echo chr(8)."\rPassword: ".str_repeat("*", strlen($args['pass']))."\n";
+
+// 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 962fb4e2f32f83ce2c312a6a05f37d1d6b79af7d..67d82c8693a06e55b27023ab43340527b343ded5 100644 (file)
@@ -40,6 +40,10 @@ $rcmail_config['default_host'] = '';
 // TCP port used for IMAP connections
 $rcmail_config['default_port'] = 143;
 
+// IMAP auth type. Can be "auth" (CRAM-MD5), "plain" (PLAIN) or "check" to auto detect.
+// Optional, defaults to "check"
+$rcmail_config['imap_auth_type'] = null;
+
 // Automatically add this domain to user names for login
 // Only for IMAP servers that require full e-mail addresses for login
 // Specify an array with 'host' => 'domain' values to support multiple hosts
@@ -118,7 +122,7 @@ $rcmail_config['double_auth'] = false;
 $rcmail_config['des_key'] = 'rcmail-!24ByteDESkey*Str';
 
 // the default locale setting
-$rcmail_config['locale_string'] = 'en';
+$rcmail_config['language'] = 'en';
 
 // use this format for short date display
 $rcmail_config['date_short'] = 'D H:i';
@@ -130,7 +134,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';
+$rcmail_config['useragent'] = 'RoundCube Webmail/0.2a';
 
 // use this name to compose page titles
 $rcmail_config['product_name'] = 'RoundCube Webmail';
@@ -213,9 +217,29 @@ $rcmail_config['mail_header_delimiter'] = NULL;
 // session domain: .example.org
 $rcmail_config['session_domain'] = '';
 
-// in order to enable public ldap search, create a config array
-// like the Verisign example below. if you would like to test, 
-// simply uncomment the Verisign example.
+// This indicates which type of address book to use. Possible choises:
+// 'sql' (default) and 'ldap'.
+// If set to 'ldap' then it will look at using the first writable LDAP
+// address book as the primary address book and it will not display the
+// SQL address book in the 'Address Book' view.
+$rcmail_config['address_book_type'] = 'sql';
+
+// In order to enable public ldap search, configure an array like the Verisign
+// example further below. if you would like to test, simply uncomment the example.
+//
+// If you are going to use LDAP for individual address books, you will need to 
+// set 'user_specific' to true and use the variables to generate the appropriate DNs to access it.
+//
+// The recommended directory structure for LDAP is to store all the address book entries
+// under the users main entry, e.g.:
+//
+//  o=root
+//   ou=people
+//    uid=user@domain
+//     mail=contact@contactdomain
+//     
+// So the base_dn would be uid=%fu,ou=people,o=root
+// The bind_dn would be the same as based_dn or some super user login.
 /** 
  * example config for Verisign directory
  *
@@ -223,34 +247,57 @@ $rcmail_config['session_domain'] = '';
  *  'name'          => 'Verisign.com',
  *  'hosts'         => array('directory.verisign.com'),
  *  'port'          => 389,
+ *  'use_tls'      => false,
+ *  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
+ *  // %fu - The full username provided, assumes the username is an email
+ *  //       address, uses the username_domain value if not an email address.
+ *  // %u  - The username prior to the '@'.
+ *  // %d  - The domain name after the '@'.
  *  'base_dn'       => '',
  *  'bind_dn'       => '',
  *  'bind_pass'     => '',
+ *  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
+ *  // If writable is true then these fields need to be populated:
+ *  // LDAP_Object_Classes, required_fields, LDAP_rdn
+ *  'LDAP_Object_Classes' => array("top", "inetOrgPerson"), // To create a new contact these are the object classes to specify (or any other classes you wish to use).
+ *  'required_fields'     => array("cn", "sn", "mail"),     // The required fields needed to build a new contact as required by the object classes (can include additional fields not required by the object classes).
+ *  'LDAP_rdn'      => 'mail', // The RDN field that is used for new entries, this field needs to be one of the search_fields, the base of base_dn is appended to the RDN to insert into the LDAP directory.
  *  '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
+ *  'sort'          => 'cn',    // The field to sort the listing by.
  *  'scope'         => 'sub',   // search mode: sub|base|list
  *  'filter'        => '',      // used for basic listing (if not empty) and will be &'d with search queries. example: status=act
+ *  'global_search' => true,    // perform a global search for address auto-completion on compose
  *  'fuzzy_search'  => true);   // server allows wildcard search
  */
 
 // don't allow these settings to be overriden by the user
 $rcmail_config['dont_override'] = array();
 
-// list of configuration option names that need to be available in Javascript.
-$rcmail_config['javascript_config'] = array('read_when_deleted', 'flag_for_deletion');
-
 // try to load host-specific configuration
+// see http://trac.roundcube.net/wiki/Howto_Config for more details
 $rcmail_config['include_host_config'] = false;
 
+// don't let users set pagesize to more than this value if set
+$rcmail_config['max_pagesize'] = 200;
+
+// mime magic database
+$rcmail_config['mime_magic'] = '/usr/share/misc/magic';
+
+// default sort col
+$rcmail_config['message_sort_col'] = 'date';
+
+// default sort order
+$rcmail_config['message_sort_order'] = 'DESC';
+
 // THIS OPTION WILL ALLOW THE INSTALLER TO RUN AND CAN EXPOSE SENSITIVE CONFIG DATA.
 // ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING!
 $rcmail_config['enable_installer'] = false;
 
-
 /***** these settings can be overwritten by user's preferences *****/
 
 // show up to X items in list view
@@ -271,23 +318,32 @@ $rcmail_config['htmleditor'] = FALSE;
 // show pretty dates as standard
 $rcmail_config['prettydate'] = TRUE;
 
-// default sort col
-$rcmail_config['message_sort_col'] = 'date';
-
-// default sort order
-$rcmail_config['message_sort_order'] = 'DESC';
-
 // save compose message every 300 seconds (5min)
 $rcmail_config['draft_autosave'] = 300;
 
 // default setting if preview pane is enabled
 $rcmail_config['preview_pane'] = FALSE;
 
-// don't let users set pagesize to more than this value if set
-$rcmail_config['max_pagesize'] = 200;
+// Clear Trash on logout
+$rcmail_config['logout_purge'] = FALSE;
 
-// mime magic database
-$rcmail_config['mime_magic'] = '/usr/share/misc/magic';
+// Compact INBOX on logout
+$rcmail_config['logout_expunge'] = FALSE;
+
+/**
+ * 'Delete always'
+ * This setting reflects if mail should be always marked as deleted,
+ * even if moving to "Trash" fails. This is necessary in some setups
+ * because a) people may not have a Trash folder or b) they are over
+ * quota (and Trash is included in the quota).
+ *
+ * This is a failover setting for iil_C_Move when a message is moved
+ * to the Trash, and not the same as "delete_right_away".
+ */
+$rcmail_config['delete_always'] = false;
+
+// Log successful logins
+$rcmail_config['log_logins'] = false;
 
 // end of config file
 ?>
index 02a6201b78473f73b88ffa516082375fdab48ff3..f40f701d83dcf3124a930e7bea364f118036dc9f 100644 (file)
--- a/index.php
+++ b/index.php
 <?php
 /*
- +-----------------------------------------------------------------------+
- | RoundCube Webmail IMAP Client                                         |
- | Version 0.1.1                                                         |
- |                                                                       |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | Redistribution and use in source and binary forms, with or without    |
- | modification, are permitted provided that the following conditions    |
- | are met:                                                              |
- |                                                                       |
- | o Redistributions of source code must retain the above copyright      |
- |   notice, this list of conditions and the following disclaimer.       |
- | o Redistributions in binary form must reproduce the above copyright   |
- |   notice, this list of conditions and the following disclaimer in the |
- |   documentation and/or other materials provided with the distribution.|
- | o The names of the authors may not be used to endorse or promote      |
- |   products derived from this software without specific prior written  |
- |   permission.                                                         |
- |                                                                       |
- | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
- | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
- | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
- | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
- | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
- | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: index.php 1255 2008-04-05 12:49:21Z thomasb $
+ +-------------------------------------------------------------------------+
+ | RoundCube Webmail IMAP Client                                           |
+ | Version 0.2-alpha                                                       |
+ |                                                                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                   |
+ |                                                                         |
+ | This program is free software; you can redistribute it and/or modify    |
+ | it under the terms of the GNU General Public License version 2          |
+ | as published by the Free Software Foundation.                           |
+ |                                                                         |
+ | This program is distributed in the hope that it will be useful,         |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of          |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           |
+ | GNU General Public License for more details.                            |
+ |                                                                         |
+ | You should have received a copy of the GNU General Public License along |
+ | with this program; if not, write to the Free Software Foundation, Inc., |
+ | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.             |
+ |                                                                         |
+ +-------------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                          |
+ +-------------------------------------------------------------------------+
+
+ $Id: index.php 1499 2008-06-09 20:57:53Z thomasb $
 
 */
 
-// application constants
-define('RCMAIL_VERSION', '0.1.1');
-define('RCMAIL_CHARSET', 'UTF-8');
-define('JS_OBJECT_NAME', 'rcmail');
+// include environment
+require_once 'program/include/iniset.php';
 
 // define global vars
 $OUTPUT_TYPE = 'html';
-$INSTALL_PATH = dirname(__FILE__);
-$MAIN_TASKS = array('mail','settings','addressbook','logout');
-
-if (empty($INSTALL_PATH))
-  $INSTALL_PATH = './';
-else
-  $INSTALL_PATH .= '/';
-
-
-// make sure path_separator is defined
-if (!defined('PATH_SEPARATOR'))
-  define('PATH_SEPARATOR', (eregi('win', PHP_OS) ? ';' : ':'));
-
-
-// RC include folders MUST be included FIRST to avoid other
-// possible not compatible libraries (i.e PEAR) to be included
-// 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', '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)
-if (!ini_get('safe_mode')) @set_time_limit(120);
-
-// include base files
-require_once('include/rcube_shared.inc');
-require_once('include/rcube_imap.inc');
-require_once('include/bugs.inc');
-require_once('include/main.inc');
-require_once('PEAR.php');
-
-
-// set PEAR error handling
-// PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_NOTICE);
-
-
-// catch some url/post parameters
-$_task = strip_quotes(get_input_value('_task', RCUBE_INPUT_GPC));
-$_action = strip_quotes(get_input_value('_action', RCUBE_INPUT_GPC));
-$_framed = (!empty($_GET['_framed']) || !empty($_POST['_framed']));
-
-// use main task if empty or invalid value
-if (empty($_task) || !in_array($_task, $MAIN_TASKS))
-  $_task = 'mail';
-
 
 // set output buffering
-if ($_action != 'get' && $_action != 'viewsource')
-{
+if ($RCMAIL->action != 'get' && $RCMAIL->action != 'viewsource') {
   // use gzip compression if supported
   if (function_exists('ob_gzhandler')
-    && !ini_get('zlib.output_compression')
-    && ini_get('output_handler') != 'ob_gzhandler')
-  {
+      && !ini_get('zlib.output_compression')
+      && ini_get('output_handler') != 'ob_gzhandler') {
     ob_start('ob_gzhandler');
   }
-  else
+  else {
     ob_start();
+  }
 }
 
 
-// start session with requested task
-rcmail_startup($_task);
+// init application and start session with requested task
+$RCMAIL = rcmail::get_instance();
 
-// set session related variables
-$COMM_PATH = sprintf('./?_task=%s', $_task);
-$SESS_HIDDEN_FIELD = '';
-
-
-// add framed parameter
-if ($_framed)
-{
-  $COMM_PATH .= '&_framed=1';
-  $SESS_HIDDEN_FIELD .= "\n".'<input type="hidden" name="_framed" value="1" />';
-}
-
-
-// init necessary objects for GUI
-rcmail_load_gui();
+// init output class
+$OUTPUT = (!empty($_GET['_remote']) || !empty($_POST['_remote'])) ? $RCMAIL->init_json() : $RCMAIL->load_gui((!empty($_GET['_framed']) || !empty($_POST['_framed'])));
 
 
 // check DB connections and exit on failure
-if ($err_str = $DB->is_error())
-{
+if ($err_str = $DB->is_error()) {
   raise_error(array(
     'code' => 603,
     'type' => 'db',
@@ -145,116 +64,102 @@ if ($err_str = $DB->is_error())
 
 
 // error steps
-if ($_action=='error' && !empty($_GET['_code']))
+if ($RCMAIL->action=='error' && !empty($_GET['_code'])) {
   raise_error(array('code' => hexdec($_GET['_code'])), FALSE, TRUE);
-
+}
 
 // try to log in
-if ($_action=='login' && $_task=='mail')
-{
-  $host = rcmail_autoselect_host();
+if ($RCMAIL->action=='login' && $RCMAIL->task=='mail') {
+  $host = $RCMAIL->autoselect_host();
   
   // check if client supports cookies
-  if (empty($_COOKIE))
-  {
+  if (empty($_COOKIE)) {
     $OUTPUT->show_message("cookiesdisabled", 'warning');
   }
   else if ($_SESSION['temp'] && !empty($_POST['_user']) && isset($_POST['_pass']) &&
-           rcmail_login(trim(get_input_value('_user', RCUBE_INPUT_POST), ' '),
-              get_input_value('_pass', RCUBE_INPUT_POST, true, 'ISO-8859-1'), $host))
-  {
+           $RCMAIL->login(trim(get_input_value('_user', RCUBE_INPUT_POST), ' '),
+              get_input_value('_pass', RCUBE_INPUT_POST, true, 'ISO-8859-1'), $host)) {
     // create new session ID
     unset($_SESSION['temp']);
     sess_regenerate_id();
 
     // send auth cookie if necessary
-    rcmail_authenticate_session();
+    $RCMAIL->authenticate_session();
+
+    // log successful login
+    if ($RCMAIL->config->get('log_logins') && $RCMAIL->config->get('debug_level') & 1)
+      console(sprintf('Successful login for %s (id %d) from %s',
+                      trim(get_input_value('_user', RCUBE_INPUT_POST), ' '),
+                      $_SESSION['user_id'],
+                      $_SERVER['REMOTE_ADDR']));
 
     // send redirect
-    header("Location: $COMM_PATH");
+    header("Location: {$RCMAIL->comm_path}");
     exit;
   }
-  else
-  {
+  else {
     $OUTPUT->show_message($IMAP->error_code == -1 ? 'imaperror' : 'loginfailed', 'warning');
-    rcmail_kill_session();
+    $RCMAIL->kill_session();
   }
 }
 
 // end session
-else if (($_task=='logout' || $_action=='logout') && isset($_SESSION['user_id']))
-{
+else if (($RCMAIL->task=='logout' || $RCMAIL->action=='logout') && isset($_SESSION['user_id'])) {
   $OUTPUT->show_message('loggedout');
-  rcmail_kill_session();
+  $RCMAIL->logout_actions();
+  $RCMAIL->kill_session();
 }
 
 // check session and auth cookie
-else if ($_action != 'login' && $_SESSION['user_id'] && $_action != 'send')
-{
-  if (!rcmail_authenticate_session())
-  {
+else if ($RCMAIL->action != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') {
+  if (!$RCMAIL->authenticate_session()) {
     $OUTPUT->show_message('sessionerror', 'error');
-    rcmail_kill_session();
+    $RCMAIL->kill_session();
   }
 }
 
 
 // log in to imap server
-if (!empty($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($IMAP->error_code == -1 ? 'imaperror' : 'sessionerror', 'error');
-    rcmail_kill_session();
+if (!empty($RCMAIL->user->ID) && $RCMAIL->task == 'mail') {
+  if (!$RCMAIL->imap_connect()) {
+    $RCMAIL->kill_session();
   }
-  else
-    rcmail_set_imap_prop();
 }
 
 
 // not logged in -> set task to 'login
-if (empty($USER->ID))
-{
+if (empty($RCMAIL->user->ID)) {
   if ($OUTPUT->ajax_call)
     $OUTPUT->remote_response("setTimeout(\"location.href='\"+this.env.comm_path+\"'\", 2000);");
   
-  $_task = 'login';
+  $RCMAIL->set_task('login');
 }
 
 
 // check client X-header to verify request origin
-if ($OUTPUT->ajax_call)
-{
-  if (empty($CONFIG['devel_mode']) && !rc_request_header('X-RoundCube-Referer'))
-  {
+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);
-if (!empty($_action))
-  $OUTPUT->set_env('action', $_action);
-
-
-
 // not logged in -> show login page
-if (empty($USER->ID))
-{
+if (empty($RCMAIL->user->ID)) {
   // check if installer is still active
-  if ($CONFIG['enable_installer'] && is_readable('./installer/index.php'))
-    $OUTPUT->add_footer('
-  <div style="background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em">
-  <h2 style="margin-top:0.2em">Installer script is still accessible</h2>
-  <p>The install script of your RoundCube installation is still stored in its default location!</p>
-  <p>Please <b>remove</b> the whole <tt>installer</tt> folder from the RoundCube directory because
-  these files may expose sensitive configuration data like server passwords and encryption keys
-  to the public. Make sure you cannot access the <a href="./installer/">installer script</a> from your browser.</p>
-  </div>');
+  if ($CONFIG['enable_installer'] && is_readable('./installer/index.php')) {
+    $OUTPUT->add_footer(html::div(array('style' => "background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em"),
+      html::tag('h2', array('style' => "margin-top:0.2em"), "Installer script is still accessible") .
+      html::p(null, "The install script of your RoundCube installation is still stored in its default location!") .
+      html::p(null, "Please <b>remove</b> the whole <tt>installer</tt> folder from the RoundCube directory because .
+        these files may expose sensitive configuration data like server passwords and encryption keys
+        to the public. Make sure you cannot access the <a href=\"./installer/\">installer script</a> from your browser.")
+      )
+    );
+  }
   
+  $OUTPUT->set_env('task', 'login');
   $OUTPUT->task = 'login';
   $OUTPUT->send('login');
   exit;
@@ -262,138 +167,129 @@ if (empty($USER->ID))
 
 
 // handle keep-alive signal
-if ($_action=='keep-alive')
-{
+if ($RCMAIL->action=='keep-alive') {
   $OUTPUT->reset();
   $OUTPUT->send('');
   exit;
 }
 
 // include task specific files
-if ($_task=='mail')
-{
+if ($RCMAIL->task=='mail') {
   include_once('program/steps/mail/func.inc');
   
-  if ($_action=='show' || $_action=='preview' || $_action=='print')
+  if ($RCMAIL->action=='show' || $RCMAIL->action=='preview' || $RCMAIL->action=='print')
     include('program/steps/mail/show.inc');
 
-  if ($_action=='get')
+  if ($RCMAIL->action=='get')
     include('program/steps/mail/get.inc');
 
-  if ($_action=='moveto' || $_action=='delete')
+  if ($RCMAIL->action=='moveto' || $RCMAIL->action=='delete')
     include('program/steps/mail/move_del.inc');
 
-  if ($_action=='mark')
+  if ($RCMAIL->action=='mark')
     include('program/steps/mail/mark.inc');
 
-  if ($_action=='viewsource')
+  if ($RCMAIL->action=='viewsource')
     include('program/steps/mail/viewsource.inc');
 
-  if ($_action=='sendmdn')
+  if ($RCMAIL->action=='sendmdn')
     include('program/steps/mail/sendmdn.inc');
 
-  if ($_action=='send')
+  if ($RCMAIL->action=='send')
     include('program/steps/mail/sendmail.inc');
 
-  if ($_action=='upload')
+  if ($RCMAIL->action=='upload')
     include('program/steps/mail/upload.inc');
 
-  if ($_action=='compose' || $_action=='remove-attachment' || $_action=='display-attachment')
+  if ($RCMAIL->action=='compose' || $RCMAIL->action=='remove-attachment' || $RCMAIL->action=='display-attachment')
     include('program/steps/mail/compose.inc');
 
-  if ($_action=='addcontact')
+  if ($RCMAIL->action=='addcontact')
     include('program/steps/mail/addcontact.inc');
 
-  if ($_action=='expunge' || $_action=='purge')
+  if ($RCMAIL->action=='expunge' || $RCMAIL->action=='purge')
     include('program/steps/mail/folders.inc');
 
-  if ($_action=='check-recent')
+  if ($RCMAIL->action=='check-recent')
     include('program/steps/mail/check_recent.inc');
 
-  if ($_action=='getunread')
+  if ($RCMAIL->action=='getunread')
     include('program/steps/mail/getunread.inc');
     
-  if ($_action=='list' && isset($_REQUEST['_remote']))
+  if ($RCMAIL->action=='list' && isset($_REQUEST['_remote']))
     include('program/steps/mail/list.inc');
 
-   if ($_action=='search')
+   if ($RCMAIL->action=='search')
      include('program/steps/mail/search.inc');
      
-  if ($_action=='spell')
+  if ($RCMAIL->action=='spell')
     include('program/steps/mail/spell.inc');
 
-  if ($_action=='rss')
+  if ($RCMAIL->action=='rss')
     include('program/steps/mail/rss.inc');
     
-  if ($_action=='quotadisplay')
-    include('program/steps/mail/quotadisplay.inc');
-
-
   // make sure the message count is refreshed
-  $IMAP->messagecount($_SESSION['mbox'], 'ALL', TRUE);
+  $IMAP->messagecount($_SESSION['mbox'], 'ALL', true);
 }
 
 
 // include task specific files
-if ($_task=='addressbook')
-{
+if ($RCMAIL->task=='addressbook') {
   include_once('program/steps/addressbook/func.inc');
 
-  if ($_action=='save')
+  if ($RCMAIL->action=='save')
     include('program/steps/addressbook/save.inc');
   
-  if ($_action=='edit' || $_action=='add')
+  if ($RCMAIL->action=='edit' || $RCMAIL->action=='add')
     include('program/steps/addressbook/edit.inc');
   
-  if ($_action=='delete')
+  if ($RCMAIL->action=='delete')
     include('program/steps/addressbook/delete.inc');
 
-  if ($_action=='show')
+  if ($RCMAIL->action=='show')
     include('program/steps/addressbook/show.inc');  
 
-  if ($_action=='list' && $_REQUEST['_remote'])
+  if ($RCMAIL->action=='list' && $_REQUEST['_remote'])
     include('program/steps/addressbook/list.inc');
 
-  if ($_action=='search')
+  if ($RCMAIL->action=='search')
     include('program/steps/addressbook/search.inc');
 
-  if ($_action=='copy')
+  if ($RCMAIL->action=='copy')
     include('program/steps/addressbook/copy.inc');
 
-  if ($_action=='mailto')
+  if ($RCMAIL->action=='mailto')
     include('program/steps/addressbook/mailto.inc');
 }
 
 
 // include task specific files
-if ($_task=='settings')
-{
+if ($RCMAIL->task=='settings') {
   include_once('program/steps/settings/func.inc');
 
-  if ($_action=='save-identity')
+  if ($RCMAIL->action=='save-identity')
     include('program/steps/settings/save_identity.inc');
 
-  if ($_action=='add-identity' || $_action=='edit-identity')
+  if ($RCMAIL->action=='add-identity' || $RCMAIL->action=='edit-identity')
     include('program/steps/settings/edit_identity.inc');
 
-  if ($_action=='delete-identity')
+  if ($RCMAIL->action=='delete-identity')
     include('program/steps/settings/delete_identity.inc');
   
-  if ($_action=='identities')
+  if ($RCMAIL->action=='identities')
     include('program/steps/settings/identities.inc');  
 
-  if ($_action=='save-prefs')
+  if ($RCMAIL->action=='save-prefs')
     include('program/steps/settings/save_prefs.inc');  
 
-  if ($_action=='folders' || $_action=='subscribe' || $_action=='unsubscribe' ||
-      $_action=='create-folder' || $_action=='rename-folder' || $_action=='delete-folder')
+  if ($RCMAIL->action=='folders' || $RCMAIL->action=='subscribe' || $RCMAIL->action=='unsubscribe' ||
+      $RCMAIL->action=='create-folder' || $RCMAIL->action=='rename-folder' || $RCMAIL->action=='delete-folder')
     include('program/steps/settings/manage_folders.inc');
-
 }
 
 
 // parse main template
-$OUTPUT->send($_task);
+$OUTPUT->send($RCMAIL->task);
 
 
 // if we arrive here, something went wrong
@@ -402,6 +298,6 @@ raise_error(array(
   'type' => 'php',
   'line' => __LINE__,
   'file' => __FILE__,
-  'message' => "Invalid request"), TRUE, TRUE);
+  'message' => "Invalid request"), true, true);
                       
 ?>
diff --git a/installer/._config.php b/installer/._config.php
new file mode 100644 (file)
index 0000000..4ee59dc
Binary files /dev/null and b/installer/._config.php differ
index e671c06bd901b5da2901b79657fe3465f237d2a8..3b64af3b03342bc2658d48f9852928e84c23255c 100644 (file)
@@ -1,13 +1,16 @@
 <form action="index.php" method="get">
 <?php
 
-$required_php_exts = array('PCRE' => 'pcre', 'Session' => 'session');
+$required_php_exts = array('PCRE' => 'pcre', 'Session' => 'session',
+    'DOM XML' => 'dom');
 
 $optional_php_exts = array('FileInfo' => 'fileinfo', 'Libiconv' => 'iconv',
-    'Multibyte' => 'mbstring', 'OpenSSL' => 'openssl', 'Mcrypt' => 'mcrypt', 'GD' => 'gd');
+    'Multibyte' => 'mbstring', 'OpenSSL' => 'openssl', 'Mcrypt' => 'mcrypt',
+    'GD' => 'gd');
 
 $required_libs = array('PEAR' => 'PEAR.php', 'DB' => 'DB.php', 'MDB2' => 'MDB2.php',
-    'Net_SMTP' => 'Net/SMTP.php', 'Mail_mime' => 'Mail/mime.php', 'iilConnection' => 'lib/imap.inc');
+    'Net_SMTP' => 'Net/SMTP.php', 'Mail_mime' => 'Mail/mime.php',
+    'iilConnection' => 'lib/imap.inc');
 
 $supported_dbs = array('MySQL' => 'mysql', 'MySQLi' => 'mysqli',
     'PostgreSQL' => 'pgsql', 'SQLite (v2)' => 'sqlite');
@@ -37,11 +40,10 @@ echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) .
 <h3>Checking PHP version</h3>
 <?php
 
-define('MIN_PHP_VERSION', '4.3.1');
+define('MIN_PHP_VERSION', '5.2.0');
 if (version_compare(PHP_VERSION, MIN_PHP_VERSION, '>=')) {
     $RCI->pass('Version', 'PHP ' . PHP_VERSION . ' detected');
-}
-else {
+} else {
     $RCI->fail('Version', 'PHP Version ' . MIN_PHP_VERSION . ' or greater is required ' . PHP_VERSION . ' detected');
 }
 ?>
@@ -54,8 +56,7 @@ $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
 foreach ($required_php_exts AS $name => $ext) {
     if (extension_loaded($ext)) {
         $RCI->pass($name);
-    }
-    else {
+    } else {
         $_ext = $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
         $msg = @dl($_ext) ? 'Could be loaded. Please add in php.ini' : '';
         $RCI->fail($name, $msg, $source_urls[$name]);
index dc85faa6cee0b7d8ce51300f4ee15b12dab4c7a1..04683b9c45a4601be37e7f449b50e156a9052c20 100644 (file)
@@ -2,9 +2,6 @@
 <input type="hidden" name="_step" value="2" />
 <?php
 
-ini_set('display_errors', 1);
-require_once 'include/rcube_html.inc';
-
 // also load the default config to fill in the fields
 $RCI->load_defaults();
 
@@ -25,16 +22,16 @@ $_SESSION['allowinstaller'] = true;
 
 if (!empty($_POST['submit'])) {
   
-  echo '<p class="notice">Copy the following configurations and save them in two files (names above the text box)';
-  echo ' within the <tt>config/</tt> directory of your RoundCube installation.<br/>';
+  echo '<p class="notice">Copy or download the following configurations and save them in two files';
+  echo ' (names above the text box) within the <tt>config/</tt> directory of your RoundCube installation.<br/>';
   echo ' Make sure that there are no characters outside the <tt>&lt;?php ?&gt;</tt> brackets when saving the files.</p>';
   
-  $textbox = new textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile"));
+  $textbox = new html_textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile"));
   
-  echo '<div><em>main.inc.php</em></div>';
+  echo '<div><em>main.inc.php (<a href="index.php?_getfile=main">download</a>)</em></div>';
   echo $textbox->show($RCI->create_config('main'));
   
-  echo '<div style="margin-top:1em"><em>db.inc.php</em></div>';
+  echo '<div style="margin-top:1em"><em>db.inc.php (<a href="index.php?_getfile=db">download</a>)</em></div>';
   echo $textbox->show($RCI->create_config('db'));
 
   echo '<p class="hint">Of course there are more options to configure.
@@ -56,7 +53,7 @@ if (!empty($_POST['submit'])) {
 <?php
 /*
 $value = $RCI->getprop('debug_level');
-$check_debug = new checkbox(array('name' => '_debug_level[]'));
+$check_debug = new html_checkbox(array('name' => '_debug_level[]'));
 echo $check_debug->show(($value & 1) ? 1 : 0 , array('value' => 1, 'id' => 'cfgdebug1'));
 echo '<label for="cfgdebug1">Log errors</label><br />';
 
@@ -74,7 +71,7 @@ echo '<label for="cfgdebug8">Verbose display</label><br />';
 <dd>
 <?php
 
-$input_prodname = new textfield(array('name' => '_product_name', 'size' => 30, 'id' => "cfgprodname"));
+$input_prodname = new html_inputfield(array('name' => '_product_name', 'size' => 30, 'id' => "cfgprodname"));
 echo $input_prodname->show($RCI->getprop('product_name'));
 
 ?>
@@ -85,7 +82,7 @@ echo $input_prodname->show($RCI->getprop('product_name'));
 <dd>
 <?php
 
-$input_skinpath = new textfield(array('name' => '_skin_path', 'size' => 30, 'id' => "cfgskinpath"));
+$input_skinpath = new html_inputfield(array('name' => '_skin_path', 'size' => 30, 'id' => "cfgskinpath"));
 echo $input_skinpath->show($RCI->getprop('skin_path'));
 
 ?>
@@ -96,7 +93,7 @@ echo $input_skinpath->show($RCI->getprop('skin_path'));
 <dd>
 <?php
 
-$input_tempdir = new textfield(array('name' => '_temp_dir', 'size' => 30, 'id' => "cfgtempdir"));
+$input_tempdir = new html_inputfield(array('name' => '_temp_dir', 'size' => 30, 'id' => "cfgtempdir"));
 echo $input_tempdir->show($RCI->getprop('temp_dir'));
 
 ?>
@@ -107,7 +104,7 @@ echo $input_tempdir->show($RCI->getprop('temp_dir'));
 <dd>
 <?php
 
-$input_logdir = new textfield(array('name' => '_log_dir', 'size' => 30, 'id' => "cfglogdir"));
+$input_logdir = new html_inputfield(array('name' => '_log_dir', 'size' => 30, 'id' => "cfglogdir"));
 echo $input_logdir->show($RCI->getprop('log_dir'));
 
 ?>
@@ -118,7 +115,7 @@ echo $input_logdir->show($RCI->getprop('log_dir'));
 <dd>
 <?php
 
-$check_ipcheck = new checkbox(array('name' => '_ip_check', 'id' => "cfgipcheck"));
+$check_ipcheck = new html_checkbox(array('name' => '_ip_check', 'id' => "cfgipcheck"));
 echo $check_ipcheck->show(intval($RCI->getprop('ip_check')), array('value' => 1));
 
 ?>
@@ -131,7 +128,7 @@ echo $check_ipcheck->show(intval($RCI->getprop('ip_check')), array('value' => 1)
 <dd>
 <?php
 
-$input_deskey = new textfield(array('name' => '_des_key', 'size' => 30, 'id' => "cfgdeskey"));
+$input_deskey = new html_inputfield(array('name' => '_des_key', 'size' => 30, 'id' => "cfgdeskey"));
 echo $input_deskey->show($RCI->getprop('des_key'));
 
 ?>
@@ -144,7 +141,7 @@ If you enter it manually please provide a string of exactly 24 chars.</p>
 <dd>
 <?php
 
-$check_caching = new checkbox(array('name' => '_enable_caching', 'id' => "cfgcache"));
+$check_caching = new html_checkbox(array('name' => '_enable_caching', 'id' => "cfgcache"));
 echo $check_caching->show(intval($RCI->getprop('enable_caching')), array('value' => 1));
 
 ?>
@@ -155,7 +152,7 @@ echo $check_caching->show(intval($RCI->getprop('enable_caching')), array('value'
 <dd>
 <?php
 
-$check_caching = new checkbox(array('name' => '_enable_spellcheck', 'id' => "cfgspellcheck"));
+$check_caching = new html_checkbox(array('name' => '_enable_spellcheck', 'id' => "cfgspellcheck"));
 echo $check_caching->show(intval($RCI->getprop('enable_spellcheck')), array('value' => 1));
 
 ?>
@@ -168,7 +165,7 @@ echo $check_caching->show(intval($RCI->getprop('enable_spellcheck')), array('val
 <dd>
 <?php
 
-$select_mdnreq = new select(array('name' => '_mdn_requests', 'id' => "cfgmdnreq"));
+$select_mdnreq = new html_select(array('name' => '_mdn_requests', 'id' => "cfgmdnreq"));
 $select_mdnreq->add(array('ask the user', 'send automatically', 'ignore'), array(0, 1, 2));
 echo $select_mdnreq->show(intval($RCI->getprop('mdn_requests')));
 
@@ -187,24 +184,24 @@ echo $select_mdnreq->show(intval($RCI->getprop('mdn_requests')));
 <p>Database settings for read/write operations:</p>
 <?php
 
-require_once 'DB.php';
+require_once 'MDB2.php';
 
 $supported_dbs = array('MySQL' => 'mysql', 'MySQLi' => 'mysqli',
     'PgSQL' => 'pgsql', 'SQLite' => 'sqlite');
 
-$select_dbtype = new select(array('name' => '_dbtype', 'id' => "cfgdbtype"));
+$select_dbtype = new html_select(array('name' => '_dbtype', 'id' => "cfgdbtype"));
 foreach ($supported_dbs AS $database => $ext) {
     if (extension_loaded($ext)) {
         $select_dbtype->add($database, $ext);
     }
 }
 
-$input_dbhost = new textfield(array('name' => '_dbhost', 'size' => 20, 'id' => "cfgdbhost"));
-$input_dbname = new textfield(array('name' => '_dbname', 'size' => 20, 'id' => "cfgdbname"));
-$input_dbuser = new textfield(array('name' => '_dbuser', 'size' => 20, 'id' => "cfgdbuser"));
-$input_dbpass = new textfield(array('name' => '_dbpass', 'size' => 20, 'id' => "cfgdbpass"));
+$input_dbhost = new html_inputfield(array('name' => '_dbhost', 'size' => 20, 'id' => "cfgdbhost"));
+$input_dbname = new html_inputfield(array('name' => '_dbname', 'size' => 20, 'id' => "cfgdbname"));
+$input_dbuser = new html_inputfield(array('name' => '_dbuser', 'size' => 20, 'id' => "cfgdbuser"));
+$input_dbpass = new html_passwordfield(array('name' => '_dbpass', 'size' => 20, 'id' => "cfgdbpass"));
 
-$dsnw = DB::parseDSN($RCI->getprop('db_dsnw'));
+$dsnw = MDB2::parseDSN($RCI->getprop('db_dsnw'));
 
 echo $select_dbtype->show($RCI->is_post ? $_POST['_dbtype'] : $dsnw['phptype']);
 echo '<label for="cfgdbtype">Database type</label><br />';
@@ -228,7 +225,7 @@ echo '<label for="cfgdbpass">Database password</label><br />';
 @include_once 'DB.php';
 @include_once 'MDB2.php';
 
-$select_dbba = new select(array('name' => '_db_backend', 'id' => "cfgdbba"));
+$select_dbba = new html_select(array('name' => '_db_backend', 'id' => "cfgdbba"));
 
 if (class_exists('DB'))
   $select_dbba->add('DB', 'db');
@@ -254,7 +251,7 @@ echo $select_dbba->show($RCI->getprop('db_backend'));
 <div id="defaulthostlist">
 <?php
 
-$text_imaphost = new textfield(array('name' => '_default_host[]', 'size' => 30));
+$text_imaphost = new html_inputfield(array('name' => '_default_host[]', 'size' => 30));
 $default_hosts = $RCI->get_hostlist();
 
 if (empty($default_hosts))
@@ -279,7 +276,7 @@ foreach ($default_hosts as $host) {
 <dd>
 <?php
 
-$text_imapport = new textfield(array('name' => '_default_port', 'size' => 6, 'id' => "cfgimapport"));
+$text_imapport = new html_inputfield(array('name' => '_default_port', 'size' => 6, 'id' => "cfgimapport"));
 echo $text_imapport->show($RCI->getprop('default_port'));
 
 ?>
@@ -290,7 +287,7 @@ echo $text_imapport->show($RCI->getprop('default_port'));
 <dd>
 <?php
 
-$text_userdomain = new textfield(array('name' => '_username_domain', 'size' => 30, 'id' => "cfguserdomain"));
+$text_userdomain = new html_inputfield(array('name' => '_username_domain', 'size' => 30, 'id' => "cfguserdomain"));
 echo $text_userdomain->show($RCI->getprop('username_domain'));
 
 ?>
@@ -303,7 +300,7 @@ echo $text_userdomain->show($RCI->getprop('username_domain'));
 <dd>
 <?php
 
-$check_autocreate = new checkbox(array('name' => '_auto_create_user', 'id' => "cfgautocreate"));
+$check_autocreate = new html_checkbox(array('name' => '_auto_create_user', 'id' => "cfgautocreate"));
 echo $check_autocreate->show(intval($RCI->getprop('auto_create_user')), array('value' => 1));
 
 ?>
@@ -320,7 +317,7 @@ what means that you have to create those records manually or disable this option
 <dd>
 <?php
 
-$text_sentmbox = new textfield(array('name' => '_sent_mbox', 'size' => 20, 'id' => "cfgsentmbox"));
+$text_sentmbox = new html_inputfield(array('name' => '_sent_mbox', 'size' => 20, 'id' => "cfgsentmbox"));
 echo $text_sentmbox->show($RCI->getprop('sent_mbox'));
 
 ?>
@@ -333,7 +330,7 @@ echo $text_sentmbox->show($RCI->getprop('sent_mbox'));
 <dd>
 <?php
 
-$text_trashmbox = new textfield(array('name' => '_trash_mbox', 'size' => 20, 'id' => "cfgtrashmbox"));
+$text_trashmbox = new html_inputfield(array('name' => '_trash_mbox', 'size' => 20, 'id' => "cfgtrashmbox"));
 echo $text_trashmbox->show($RCI->getprop('trash_mbox'));
 
 ?>
@@ -346,7 +343,7 @@ echo $text_trashmbox->show($RCI->getprop('trash_mbox'));
 <dd>
 <?php
 
-$text_draftsmbox = new textfield(array('name' => '_drafts_mbox', 'size' => 20, 'id' => "cfgdraftsmbox"));
+$text_draftsmbox = new html_inputfield(array('name' => '_drafts_mbox', 'size' => 20, 'id' => "cfgdraftsmbox"));
 echo $text_draftsmbox->show($RCI->getprop('drafts_mbox'));
 
 ?>
@@ -364,7 +361,7 @@ echo $text_draftsmbox->show($RCI->getprop('drafts_mbox'));
 <dd>
 <?php
 
-$text_smtphost = new textfield(array('name' => '_smtp_server', 'size' => 30, 'id' => "cfgsmtphost"));
+$text_smtphost = new html_inputfield(array('name' => '_smtp_server', 'size' => 30, 'id' => "cfgsmtphost"));
 echo $text_smtphost->show($RCI->getprop('smtp_server'));
 
 ?>
@@ -377,7 +374,7 @@ echo $text_smtphost->show($RCI->getprop('smtp_server'));
 <dd>
 <?php
 
-$text_smtpport = new textfield(array('name' => '_smtp_port', 'size' => 6, 'id' => "cfgsmtpport"));
+$text_smtpport = new html_inputfield(array('name' => '_smtp_port', 'size' => 6, 'id' => "cfgsmtpport"));
 echo $text_smtpport->show($RCI->getprop('smtp_port'));
 
 ?>
@@ -388,8 +385,8 @@ echo $text_smtpport->show($RCI->getprop('smtp_port'));
 <dd>
 <?php
 
-$text_smtpuser = new textfield(array('name' => '_smtp_user', 'size' => 20, 'id' => "cfgsmtpuser"));
-$text_smtppass = new textfield(array('name' => '_smtp_pass', 'size' => 20, 'id' => "cfgsmtppass"));
+$text_smtpuser = new html_inputfield(array('name' => '_smtp_user', 'size' => 20, 'id' => "cfgsmtpuser"));
+$text_smtppass = new html_passwordfield(array('name' => '_smtp_pass', 'size' => 20, 'id' => "cfgsmtppass"));
 echo $text_smtpuser->show($RCI->getprop('smtp_user'));
 echo $text_smtppass->show($RCI->getprop('smtp_pass'));
 
@@ -398,7 +395,7 @@ echo $text_smtppass->show($RCI->getprop('smtp_pass'));
 <p>
 <?php
 
-$check_smtpuser = new checkbox(array('name' => '_smtp_user_u', 'id' => "cfgsmtpuseru"));
+$check_smtpuser = new html_checkbox(array('name' => '_smtp_user_u', 'id' => "cfgsmtpuseru"));
 echo $check_smtpuser->show($RCI->getprop('smtp_user') == '%u' || $_POST['_smtp_user_u'] ? 1 : 0, array('value' => 1));
 
 ?>
@@ -410,7 +407,7 @@ echo $check_smtpuser->show($RCI->getprop('smtp_user') == '%u' || $_POST['_smtp_u
 <dd>
 <?php
 /*
-$select_smtpauth = new select(array('name' => '_smtp_auth_type', 'id' => "cfgsmtpauth"));
+$select_smtpauth = new html_select(array('name' => '_smtp_auth_type', 'id' => "cfgsmtpauth"));
 $select_smtpauth->add(array('(auto)', 'PLAIN', 'DIGEST-MD5', 'CRAM-MD5', 'LOGIN'), array('0', 'PLAIN', 'DIGEST-MD5', 'CRAM-MD5', 'LOGIN'));
 echo $select_smtpauth->show(intval($RCI->getprop('smtp_auth_type')));
 */
@@ -422,7 +419,7 @@ echo $select_smtpauth->show(intval($RCI->getprop('smtp_auth_type')));
 <dd>
 <?php
 
-$check_smtplog = new checkbox(array('name' => '_smtp_log', 'id' => "cfgsmtplog"));
+$check_smtplog = new html_checkbox(array('name' => '_smtp_log', 'id' => "cfgsmtplog"));
 echo $check_smtplog->show(intval($RCI->getprop('smtp_log')), array('value' => 1));
 
 ?>
@@ -441,7 +438,7 @@ echo $check_smtplog->show(intval($RCI->getprop('smtp_log')), array('value' => 1)
 <dd>
 <?php
 
-$input_locale = new textfield(array('name' => '_locale_string', 'size' => 6, 'id' => "cfglocale"));
+$input_locale = new html_inputfield(array('name' => '_locale_string', 'size' => 6, 'id' => "cfglocale"));
 echo $input_locale->show($RCI->getprop('locale_string'));
 
 ?>
@@ -453,7 +450,7 @@ echo $input_locale->show($RCI->getprop('locale_string'));
 <dd>
 <?php
 
-$input_pagesize = new textfield(array('name' => '_pagesize', 'size' => 6, 'id' => "cfgpagesize"));
+$input_pagesize = new html_inputfield(array('name' => '_pagesize', 'size' => 6, 'id' => "cfgpagesize"));
 echo $input_pagesize->show($RCI->getprop('pagesize'));
 
 ?>
@@ -464,7 +461,7 @@ echo $input_pagesize->show($RCI->getprop('pagesize'));
 <dd>
 <?php
 
-$check_htmlview = new checkbox(array('name' => '_prefer_html', 'id' => "cfghtmlview", 'value' => 1));
+$check_htmlview = new html_checkbox(array('name' => '_prefer_html', 'id' => "cfghtmlview", 'value' => 1));
 echo $check_htmlview->show(intval($RCI->getprop('prefer_html')));
 
 ?>
@@ -475,7 +472,7 @@ echo $check_htmlview->show(intval($RCI->getprop('prefer_html')));
 <dd>
 <?php
 
-$check_prevpane = new checkbox(array('name' => '_preview_pane', 'id' => "cfgprevpane", 'value' => 1));
+$check_prevpane = new html_checkbox(array('name' => '_preview_pane', 'id' => "cfgprevpane", 'value' => 1));
 echo $check_prevpane->show(intval($RCI->getprop('preview_pane')));
 
 ?>
@@ -486,7 +483,7 @@ echo $check_prevpane->show(intval($RCI->getprop('preview_pane')));
 <dd>
 <?php
 
-$check_htmlcomp = new checkbox(array('name' => '_htmleditor', 'id' => "cfghtmlcompose", 'value' => 1));
+$check_htmlcomp = new html_checkbox(array('name' => '_htmleditor', 'id' => "cfghtmlcompose", 'value' => 1));
 echo $check_htmlcomp->show(intval($RCI->getprop('htmleditor')));
 
 ?>
@@ -498,7 +495,7 @@ echo $check_htmlcomp->show(intval($RCI->getprop('htmleditor')));
 <label for="cfgautosave">Save compose message every</label>
 <?php
 
-$select_autosave = new select(array('name' => '_draft_autosave', 'id' => 'cfgautosave'));
+$select_autosave = new html_select(array('name' => '_draft_autosave', 'id' => 'cfgautosave'));
 $select_autosave->add('never', 0);
 foreach (array(3, 5, 10) as $i => $min)
   $select_autosave->add("$min min", $min*60);
index 69e33f87021a579df4de06312cd082182cc885c0..4bd37f3ca2979409839aa395d67c20380e51b62c 100644 (file)
@@ -1,3 +1,31 @@
+<?php
+ini_set('error_reporting', E_ALL&~E_NOTICE);
+ini_set('display_errors', 1);
+
+define('INSTALL_PATH', realpath(dirname(__FILE__) . '/../').'/');
+$include_path  = INSTALL_PATH . 'program/lib' . PATH_SEPARATOR;
+$include_path .= INSTALL_PATH . 'program' . PATH_SEPARATOR;
+$include_path .= INSTALL_PATH . 'program/include' . PATH_SEPARATOR;
+$include_path .= ini_get('include_path');
+
+set_include_path($include_path);
+
+session_start();
+
+/**
+ * Use PHP5 autoload for dynamic class loading
+ * (copy from program/incllude/iniset.php)
+ */
+function __autoload($classname)
+{
+  $filename = preg_replace(
+      array('/MDB2_(.+)/', '/Mail_(.+)/', '/^html_.+/', '/^utf8$/'),
+      array('MDB2/\\1', 'Mail/\\1', 'html', 'utf8.class'),
+      $classname
+  );
+  include_once $filename. '.php';
+}
+?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <div id="content">
 
 <?php
-  ini_set('error_reporting', E_ALL&~E_NOTICE);
-  ini_set('display_errors', 1);
-  
-  session_start();
-
-  $docroot = realpath(dirname(__FILE__) . '/../');
-  $include_path  = $docroot . '/program/lib' . PATH_SEPARATOR . $docroot . '/program' . PATH_SEPARATOR . ini_get('include_path');
-  set_include_path($include_path);
 
-  require_once 'rcube_install.php';
   $RCI = rcube_install::get_instance();
   $RCI->load_config();
 
   // exit if installation is complete
   if ($RCI->configured && !$RCI->getprop('enable_installer') && !$_SESSION['allowinstaller']) {
-    header("HTTP/1.0 404 Not Found");
+    // header("HTTP/1.0 404 Not Found");
     echo '<h2 class="error">The installer is disabled!</h2>';
     echo '<p>To enable it again, set <tt>$rcmail_config[\'enable_installer\'] = true;</tt> in config/main.inc.php</p>';
     echo '</div></body></html>';
index 12cd5c10d4957242f354bd05f734ff1c8bcb673e..0240467554b721383d7ffacf79d81291a30b6814 100644 (file)
@@ -102,7 +102,7 @@ class rcube_install
   {
     $value = $this->is_post && (isset($_POST["_$name"]) || $this->config_props[$name]) ? $_POST["_$name"] : $this->config[$name];
     
-    if ($name == 'des_key' && !isset($_REQUEST["_$name"]))
+    if ($name == 'des_key' && !$this->configured && !isset($_REQUEST["_$name"]))
       $value = rcube_install::random_key(24);
     
     return $value !== null && $value !== '' ? $value : $default;
@@ -137,7 +137,9 @@ class rcube_install
         if ($_POST['_dbtype'] == 'sqlite')
           $value = sprintf('%s://%s?mode=0646', $_POST['_dbtype'], $_POST['_dbname']{0} == '/' ? '/' . $_POST['_dbname'] : $_POST['_dbname']);
         else
-          $value = sprintf('%s://%s:%s@%s/%s', $_POST['_dbtype'], $_POST['_dbuser'], $_POST['_dbpass'], $_POST['_dbhost'], $_POST['_dbname']);
+          $value = sprintf('%s://%s:%s@%s/%s', $_POST['_dbtype'], 
+                   rawurlencode($_POST['_dbuser']), rawurlencode($_POST['_dbpass']),
+                   $_POST['_dbhost'], $_POST['_dbname']);
       }
       else if ($prop == 'smtp_auth_type' && $value == '0') {
         $value = '';
@@ -147,6 +149,9 @@ class rcube_install
         if (count($value) <= 1)
           $value = $value[0];
       }
+      else if ($prop == 'pagesize') {
+        $value = max(2, intval($value));
+      }
       else if ($prop == 'smtp_user' && !empty($_POST['_smtp_user_u'])) {
         $value = '%u';
       }
index 5be343a318ea13ffebb5f4bfea7dbfb63227274e..bdaf3ee525ef424df16ad4a44691bb26b45222af 100644 (file)
@@ -3,10 +3,8 @@
 <h3>Check config files</h3>
 <?php
 
-require_once 'include/rcube_html.inc';
-
-$read_main = is_readable('../config/main.inc.php');
-$read_db = is_readable('../config/db.inc.php');
+$read_main = is_readable(INSTALL_PATH.'config/main.inc.php');
+$read_db = is_readable(INSTALL_PATH.'config/db.inc.php');
 
 if ($read_main && !empty($RCI->config)) {
   $RCI->pass('main.inc.php');
@@ -38,7 +36,7 @@ else if (!$read_db) {
 if ($RCI->configured) {
     $pass = false;
     foreach (array($RCI->config['temp_dir'],$RCI->config['log_dir']) as $dir) {
-        $dirpath = $dir{0} == '/' ? $dir : $docroot . '/' . $dir;
+        $dirpath = $dir{0} == '/' ? $dir : INSTALL_PATH . $dir;
         if (is_writable(realpath($dirpath))) {
             $RCI->pass($dir);
             $pass = true;
@@ -68,10 +66,9 @@ if ($RCI->configured) {
         echo 'Backend: ';
         echo 'PEAR::' . strtoupper($RCI->config['db_backend']) . '<br />';
 
-        $_class = 'rcube_' . strtolower($RCI->config['db_backend']);
-        require_once 'include/' . $_class . '.inc';
+        $dbclass = 'rcube_' . strtolower($RCI->config['db_backend']);
 
-        $DB = new $_class($RCI->config['db_dsnw'], '', false);
+        $DB = new $dbclass($RCI->config['db_dsnw'], '', false);
         $DB->db_connect('w');
         if (!($db_error_msg = $DB->is_error())) {
             $RCI->pass('DSN (write)');
@@ -164,11 +161,11 @@ if ($RCI->getprop('smtp_server')) {
   $pass = $RCI->getprop('smtp_pass', '(none)');
   
   if ($user == '%u') {
-    $user_field = new textfield(array('name' => '_smtp_user'));
+    $user_field = new html_inputfield(array('name' => '_smtp_user'));
     $user = $user_field->show($_POST['_smtp_user']);
   }
   if ($pass == '%p') {
-    $pass_field = new passwordfield(array('name' => '_smtp_pass'));
+    $pass_field = new html_passwordfield(array('name' => '_smtp_pass'));
     $pass = $pass_field->show();
   }
   
@@ -176,8 +173,8 @@ if ($RCI->getprop('smtp_server')) {
   echo "Password: $pass<br />";
 }
 
-$from_field = new textfield(array('name' => '_from', 'id' => 'sendmailfrom'));
-$to_field = new textfield(array('name' => '_to', 'id' => 'sendmailto'));
+$from_field = new html_inputfield(array('name' => '_from', 'id' => 'sendmailfrom'));
+$to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
 
 ?>
 </p>
@@ -186,8 +183,7 @@ $to_field = new textfield(array('name' => '_to', 'id' => 'sendmailto'));
 
 if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'])) {
   
-  require_once 'lib/rc_mail_mime.inc';
-  require_once 'include/rcube_smtp.inc';
+  require_once 'rcube_smtp.inc';
   
   echo '<p>Trying to send email...<br />';
   
@@ -214,7 +210,7 @@ if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to']
         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
       }
 
-      $mail_object  = new rc_mail_mime();
+      $mail_object  = new rcube_mail_mime();
       $send_headers = $mail_object->headers($headers);
       
       $status = smtp_mail($headers['From'], $headers['To'],
@@ -271,15 +267,15 @@ echo '</p>';
 
 $default_hosts = $RCI->get_hostlist();
 if (!empty($default_hosts)) {
-  $host_field = new select(array('name' => '_host', 'id' => 'imaphost'));
+  $host_field = new html_select(array('name' => '_host', 'id' => 'imaphost'));
   $host_field->add($default_hosts);
 }
 else {
-  $host_field = new textfield(array('name' => '_host', 'id' => 'imaphost'));
+  $host_field = new html_inputfield(array('name' => '_host', 'id' => 'imaphost'));
 }
 
-$user_field = new textfield(array('name' => '_user', 'id' => 'imapuser'));
-$pass_field = new passwordfield(array('name' => '_pass', 'id' => 'imappass'));
+$user_field = new html_inputfield(array('name' => '_user', 'id' => 'imapuser'));
+$pass_field = new html_passwordfield(array('name' => '_pass', 'id' => 'imappass'));
 
 ?>
 
@@ -308,8 +304,6 @@ $pass_field = new passwordfield(array('name' => '_pass', 'id' => 'imappass'));
 
 if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) {
   
-  require_once 'include/rcube_imap.inc';
-  
   echo '<p>Connecting to ' . Q($_POST['_host']) . '...<br />';
   
   $a_host = parse_url($_POST['_host']);
index 200f680f3580aaca9469eb8d29d6b048e46a99fa..bfec2333766b589480f552c2645f66c2f873a5c3 100644 (file)
@@ -6,7 +6,7 @@
 
 <p>The basic requirements are:</p>
 <ul>
-  <li>PHP Version 4.3.1 or greater including
+  <li>PHP Version 5.2.0 or greater including
     <ul>
       <li>PCRE (perl compatible regular expression)</li>
       <li>Session support</li>
diff --git a/program/include/._main.inc b/program/include/._main.inc
new file mode 100644 (file)
index 0000000..f28074c
Binary files /dev/null and b/program/include/._main.inc differ
index 4a3cdec73b14b8e3abe46dc4dc5016aaf2b011ff..6987a20c7a46ea4e6e459bdf8a8755b3d9cc8b1d 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: bugs.inc 666 2007-08-07 21:02:12Z thomasb $
+ $Id: bugs.inc 1291 2008-04-12 13:54:45Z thomasb $
 
 */
 
@@ -66,7 +66,7 @@ function raise_error($arg=array(), $log=false, $terminate=false)
  */
 function log_bug($arg_arr)
 {
-  global $CONFIG, $INSTALL_PATH;
+  global $CONFIG;
   $program = $arg_arr['type']=='xpath' ? 'XPath' : strtoupper($arg_arr['type']);
 
   // write error to local log file
@@ -81,7 +81,7 @@ function log_bug($arg_arr)
       $arg_arr['line']);
                  
     if (empty($CONFIG['log_dir']))
-      $CONFIG['log_dir'] = $INSTALL_PATH.'logs';
+      $CONFIG['log_dir'] = INSTALL_PATH.'logs';
       
     // try to open specific log file for writing
     if ($fp = @fopen($CONFIG['log_dir'].'/errors', 'a'))
diff --git a/program/include/html.php b/program/include/html.php
new file mode 100644 (file)
index 0000000..d0ab976
--- /dev/null
@@ -0,0 +1,642 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/html.php                                              |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2008, RoundCube Dev, - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Helper class to create valid XHTML code                             |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: $
+
+ */
+
+
+/**
+ * Class for HTML code creation
+ *
+ * @package HTML
+ */
+class html
+{
+    protected $tagname;
+    protected $attrib = array();
+    protected $allowed;
+    protected $content;
+
+    public static $common_attrib = array('id','class','style','title','align');
+    public static $containers = array('div','span','p','h1','h2','h3','form','textarea');
+    public static $lc_tags = true;
+
+    /**
+     * Constructor
+     *
+     * @param array Hash array with tag attributes
+     */
+    public function __construct($attrib = array())
+    {
+        if (is_array($attrib)) {
+            $this->attrib = $attrib;
+        }
+    }
+
+    /**
+     * Return the tag code
+     *
+     * @return string The finally composed HTML tag
+     */
+    public function show()
+    {
+        return self::tag($this->tagname, $this->attrib, $this->content, $this->allowed);
+    }
+
+    /****** STATIC METHODS *******/
+
+    /**
+     * Generic method to create a HTML tag
+     *
+     * @param string Tag name
+     * @param array  Tag attributes as key/value pairs
+     * @param string Optinal Tag content (creates a container tag)
+     * @param array  List with allowed attributes, omit to allow all
+     * @return string The XHTML tag
+     */
+    public static function tag($tagname, $attrib = array(), $content = null, $allowed_attrib = null)
+    {
+        $inline_tags = array('a','span','img');
+        $suffix = $attrib['nl'] || ($content && $attrib['nl'] !== false && !in_array($tagname, $inline_tags)) ? "\n" : '';
+
+        $tagname = self::$lc_tags ? strtolower($tagname) : $tagname;
+        if ($content || in_array($tagname, self::$containers)) {
+            $templ = $attrib['noclose'] ? "<%s%s>%s" : "<%s%s>%s</%s>%s";
+            unset($attrib['noclose']);
+            return sprintf($templ, $tagname, self::attrib_string($attrib, $allowed_attrib), $content, $tagname, $suffix);
+        }
+        else {
+            return sprintf("<%s%s />%s", $tagname, self::attrib_string($attrib, $allowed_attrib), $suffix);
+        }
+    }
+
+    /**
+     * Derrived method for <div> containers
+     *
+     * @param mixed  Hash array with tag attributes or string with class name
+     * @param string Div content
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function div($attr = null, $cont = null)
+    {
+        if (is_string($attr)) {
+            $attr = array('class' => $attr);
+        }
+        return self::tag('div', $attr, $cont, self::$common_attrib);
+    }
+
+    /**
+     * Derrived method for <p> blocks
+     *
+     * @param mixed  Hash array with tag attributes or string with class name
+     * @param string Paragraph content
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function p($attr = null, $cont = null)
+    {
+        if (is_string($attr)) {
+            $attr = array('class' => $attr);
+        }
+        return self::tag('p', $attr, $cont, self::$common_attrib);
+    }
+
+    /**
+     * Derrived method to create <img />
+     *
+     * @param mixed Hash array with tag attributes or string with image source (src)
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function img($attr = null)
+    {
+        if (is_string($attr)) {
+            $attr = array('src' => $attr);
+        }
+        return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib, array('src','alt','width','height','border','usemap')));
+    }
+
+    /**
+     * Derrived method for link tags
+     *
+     * @param mixed  Hash array with tag attributes or string with link location (href)
+     * @param string Link content
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function a($attr, $cont)
+    {
+        if (is_string($attr)) {
+            $attr = array('href' => $attr);
+        }
+        return self::tag('a', $attr, $cont, array_merge(self::$common_attrib, array('href','target','name','onclick','onmouseover','onmouseout')));
+    }
+
+    /**
+     * Derrived method for inline span tags
+     *
+     * @param mixed  Hash array with tag attributes or string with class name
+     * @param string Tag content
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function span($attr, $cont)
+    {
+        if (is_string($attr)) {
+            $attr = array('class' => $attr);
+        }
+        return self::tag('span', $attr, $cont, self::$common_attrib);
+    }
+
+    /**
+     * Derrived method for form element labels
+     *
+     * @param mixed  Hash array with tag attributes or string with 'for' attrib
+     * @param string Tag content
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function label($attr, $cont)
+    {
+        if (is_string($attr)) {
+            $attr = array('for' => $attr);
+        }
+        return self::tag('label', $attr, $cont, array_merge(self::$common_attrib, array('for')));
+    }
+
+    /**
+     * Derrived method for line breaks
+     *
+     * @return string HTML code
+     * @see html::tag()
+     */
+    public static function br()
+    {
+        return self::tag('br');
+    }
+
+    /**
+     * Create string with attributes
+     *
+     * @param array Associative arry with tag attributes
+     * @param array List of allowed attributes
+     * @return string Valid attribute string
+     */
+    public static function attrib_string($attrib = array(), $allowed = null)
+    {
+        if (empty($attrib)) {
+            return '';
+        }
+
+        $allowed_f = array_flip((array)$allowed);
+        $attrib_arr = array();
+        foreach ($attrib as $key => $value) {
+            // skip size if not numeric
+            if (($key=='size' && !is_numeric($value))) {
+                continue;
+            }
+
+            // ignore "internal" or not allowed attributes
+            if ($key == 'nl' || ($allowed && !isset($allowed_f[$key])) || $value === null) {
+                continue;
+            }
+
+            // skip empty eventhandlers
+            if (preg_match('/^on[a-z]+/', $key) && !$value) {
+                continue;
+            }
+
+            // attributes with no value
+            if (in_array($key, array('checked', 'multiple', 'disabled', 'selected'))) {
+                if ($value) {
+                    $attrib_arr[] = sprintf('%s="%s"', $key, $key);
+                }
+            }
+            else if ($key=='value') {
+                $attrib_arr[] = sprintf('%s="%s"', $key, Q($value, 'strict', false));
+            }
+            else {
+                $attrib_arr[] = sprintf('%s="%s"', $key, Q($value));
+            }
+        }
+        return count($attrib_arr) ? ' '.implode(' ', $attrib_arr) : '';
+    }
+}
+
+/**
+ * Class to create an HTML input field
+ *
+ * @package HTML
+ */
+class html_inputfield extends html
+{
+    protected $tagname = 'input';
+    protected $type = 'text';
+
+    public function __construct($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 attributes to override
+     * @return string HTML output
+     */
+    public 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;
+        }
+        // set type
+        $this->attrib['type'] = $this->type;
+        return parent::show();
+    }
+}
+
+/**
+ * Class to create an HTML password field
+ *
+ * @package HTML
+ */
+class html_passwordfield extends html_inputfield
+{
+    protected $type = 'password';
+}
+
+/**
+ * Class to create an hidden HTML input field
+ *
+ * @package HTML
+ */
+
+class html_hiddenfield extends html_inputfield
+{
+    protected $type = 'hidden';
+    protected $fields_arr = array();
+    protected $newline = true;
+
+    /**
+     * Constructor
+     *
+     * @param array Named tag attributes
+     */
+    public function __construct($attrib = null)
+    {
+        if (is_array($attrib)) {
+            $this->add($attrib);
+        }
+    }
+
+    /**
+     * Add a hidden field to this instance
+     *
+     * @param array Named tag attributes
+     */
+    public function add($attrib)
+    {
+        $this->fields_arr[] = $attrib;
+    }
+
+    /**
+     * Create HTML code for the hidden fields
+     *
+     * @return string Final HTML code
+     */
+    public function show()
+    {
+        $out = '';
+        foreach ($this->fields_arr as $attrib) {
+            $out .= self::tag($this->tagname, array('type' => $this->type) + $attrib);
+        }
+        return $out;
+    }
+}
+
+/**
+ * Class to create HTML radio buttons
+ *
+ * @package HTML
+ */
+class html_radiobutton extends html_inputfield
+{
+    protected $type = 'radio';
+
+    /**
+     * Get HTML code for this object
+     *
+     * @param string Value of the checked field
+     * @param array Additional attributes to override
+     * @return string HTML output
+     */
+    public function show($value = '', $attrib = null)
+    {
+        // overwrite object attributes
+        if (is_array($attrib)) {
+            $this->attrib = array_merge($this->attrib, $attrib);
+        }
+
+        // set value attribute
+        $this->attrib['checked'] = ((string)$value == (string)$this->attrib['value']);
+
+        return parent::show();
+    }
+}
+
+/**
+ * Class to create HTML checkboxes
+ *
+ * @package HTML
+ */
+class html_checkbox extends html_inputfield
+{
+    protected $type = 'checkbox';
+
+    /**
+     * Get HTML code for this object
+     *
+     * @param string Value of the checked field
+     * @param array Additional attributes to override
+     * @return string HTML output
+     */
+    public function show($value = '', $attrib = null)
+    {
+        // overwrite object attributes
+        if (is_array($attrib)) {
+            $this->attrib = array_merge($this->attrib, $attrib);
+        }
+
+        // set value attribute
+        $this->attrib['checked'] = ((string)$value == (string)$this->attrib['value']);
+
+        return parent::show();
+    }
+}
+
+/**
+ * Class to create an HTML textarea
+ *
+ * @package HTML
+ */
+class html_textarea extends html
+{
+    protected $tagname = 'textarea';
+    protected $allowed_attrib = array('name','rows','cols','wrap','tabindex');
+
+    /**
+     * Get HTML code for this object
+     *
+     * @param string Textbox value
+     * @param array Additional attributes to override
+     * @return string HTML output
+     */
+    public 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 (empty($value) && !empty($this->attrib['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 self::tag($this->tagname, $this->attrib, $value, array_merge(self::$common_attrib, $this->allowed_attrib));
+    }
+}
+
+/**
+ * Builder for HTML drop-down menus
+ * Syntax:<pre>
+ * // create instance. arguments are used to set attributes of select-tag
+ * $select = new html_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 html_select extends html
+{
+    protected $tagname = 'select';
+    protected $options = array();
+    
+    /**
+     * Add a new option to this drop-down
+     *
+     * @param mixed Option name or array with option names
+     * @param mixed Option value or array with option values
+     */
+    public function add($names, $values = null)
+    {
+        if (is_array($names)) {
+            foreach ($names as $i => $text) {
+                $this->options[] = array('text' => $text, 'value' => $values[$i]);
+            }
+        }
+        else {
+            $this->options[] = array('text' => $names, 'value' => $values);
+        }
+    }
+
+
+    /**
+     * Get HTML code for this object
+     *
+     * @param string Value of the selection option
+     * @param array Additional attributes to override
+     * @return string HTML output
+     */
+    public function show($select = array(), $attrib = null)
+    {
+        // overwrite object attributes
+        if (is_array($attrib)) {
+            $this->attrib = array_merge($this->attrib, $attrib);
+        }
+
+        $this->content = "\n";
+        $select = (array)$select;
+        foreach ($this->options as $option) {
+            $attr = array(
+                'value' => $option['value'],
+                'selected' => (in_array($option['value'], $select, true) ||
+            in_array($option['text'], $select, true)) ? 1 : null);
+
+            $this->content .= self::tag('option', $attr, Q($option['text']));
+        }
+        return parent::show();
+    }
+}
+
+
+/**
+ * Class to build an HTML table
+ *
+ * @package HTML
+ */
+class html_table extends html
+{
+    protected $tagname = 'table';
+    protected $allowed = array('id','class','style','width','summary','cellpadding','cellspacing','border');
+    private $header = array();
+    private $rows = array();
+    private $rowindex = 0;
+    private $colindex = 0;
+
+
+    public function __construct($attrib = array())
+    {
+        $this->attrib = array_merge($attrib, array('summary' => '', 'border' => 0));
+    }
+
+    /**
+     * Add a table cell
+     *
+     * @param array Cell attributes
+     * @param string Cell content
+     */
+    public function add($attr, $cont)
+    {
+        if (is_string($attr)) {
+            $attr = array('class' => $attr);
+        }
+
+        $cell = new stdClass;
+        $cell->attrib = $attr;
+        $cell->content = $cont;
+
+        $this->rows[$this->rowindex]->cells[$this->colindex] = $cell;
+        $this->colindex++;
+
+        if ($this->attrib['cols'] && $this->colindex == $this->attrib['cols']) {
+            $this->add_row();
+        }
+    }
+
+    /**
+     * Add a table header cell
+     *
+     * @param array Cell attributes
+     * @param string Cell content
+     */
+    private function add_header($attr, $cont)
+    {
+        if (is_string($attr))
+        $attr = array('class' => $attr);
+
+        $cell = new stdClass;
+        $cell->attrib = $attr;
+        $cell->content = $cont;
+        $this->header[] = $cell;
+    }
+
+    /**
+     * Jump to next row
+     *
+     * @param array Row attributes
+     */
+    private function add_row($attr = array())
+    {
+        $this->rowindex++;
+        $this->colindex = 0;
+        $this->rows[$this->rowindex] = new stdClass;
+        $this->rows[$this->rowindex]->attrib = $attr;
+        $this->rows[$this->rowindex]->cells = array();
+    }
+
+
+    /**
+     * Build HTML output of the table data
+     *
+     * @param array Table attributes
+     * @return string The final table HTML code
+     */
+    public function show($attr = array())
+    {
+        $this->attrib = array_merge($this->attrib, $attr);
+        $thead = $tbody = "";
+
+        // include <thead>
+        if (!empty($this->header)) {
+            $rowcontent = '';
+            foreach ($this->header as $c => $col) {
+                $rowcontent .= self::tag('th', $col->attrib, $col->content);
+            }
+            $thead = self::tag('thead', null, self::tag('tr', null, $rowcontent));
+        }
+
+        foreach ($this->rows as $r => $row) {
+            $rowcontent = '';
+            foreach ($row->cells as $c => $col) {
+                $rowcontent .= self::tag('td', $col->attrib, $col->content);
+            }
+
+            if ($r < $this->rowindex || count($row->cells)) {
+                $tbody .= self::tag('tr', $rows->attrib, $rowcontent);
+            }
+        }
+
+        if ($this->attrib['rowsonly']) {
+            return $tbody;
+        }
+
+        // add <tbody>
+        $this->content = $thead . self::tag('tbody', null, $tbody);
+
+        unset($this->attrib['cols'], $this->attrib['rowsonly']);
+        return parent::show();
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/program/include/iniset.php b/program/include/iniset.php
new file mode 100755 (executable)
index 0000000..b718393
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/iniset.php                                            |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2008, RoundCube Dev, - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Setup the application envoronment required to process               |
+ |   any request.                                                        |
+ +-----------------------------------------------------------------------+
+ | Author: Till Klampaeckel <till@php.net>                               |
+ |         Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: cache.inc 88 2005-12-03 16:54:12Z roundcube $
+
+*/
+
+
+// application constants
+define('RCMAIL_VERSION', '0.2-alpha');
+define('RCMAIL_CHARSET', 'UTF-8');
+define('JS_OBJECT_NAME', 'rcmail');
+
+if (!defined('INSTALL_PATH')) {
+  define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
+}
+
+// make sure path_separator is defined
+if (!defined('PATH_SEPARATOR')) {
+  define('PATH_SEPARATOR', (eregi('win', PHP_OS) ? ';' : ':'));
+}
+
+// RC include folders MUST be included FIRST to avoid other
+// possible not compatible libraries (i.e PEAR) to be included
+// instead the ones provided by RC
+$include_path = INSTALL_PATH . PATH_SEPARATOR;
+$include_path.= INSTALL_PATH . 'program' . PATH_SEPARATOR;
+$include_path.= INSTALL_PATH . 'program/lib' . PATH_SEPARATOR;
+$include_path.= INSTALL_PATH . 'program/include' . PATH_SEPARATOR;
+$include_path.= ini_get('include_path');
+
+if (set_include_path($include_path) === false) {
+  die('Fatal error: ini_set/set_include_path does not work.');
+}
+
+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)
+if (!ini_get('safe_mode')) {
+  set_time_limit(120);
+}
+
+/**
+ * Use PHP5 autoload for dynamic class loading
+ * 
+ * @todo Make Zend, PEAR etc play with this
+ */
+function __autoload($classname)
+{
+  $filename = preg_replace(
+      array('/MDB2_(.+)/', '/Mail_(.+)/', '/^html_.+/', '/^utf8$/'),
+      array('MDB2/\\1', 'Mail/\\1', 'html', 'utf8.class'),
+      $classname
+  );
+  include_once $filename. '.php';
+}
+
+/**
+ * Local callback function for PEAR errors
+ */
+function rcube_pear_error($err)
+{
+  error_log(sprintf("%s (%s): %s",
+    $err->getMessage(),
+    $err->getCode(),
+    $err->getUserinfo()), 0);
+}
+
+// include global functions
+require_once 'include/bugs.inc';
+require_once 'include/main.inc';
+require_once 'include/rcube_shared.inc';
+
+
+// set PEAR error handling (will also load the PEAR main class)
+PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'rcube_pear_error');
+
index 446780cdc798ef59165733642af00974654b34fb..c6b4168d9184e8dc149488dbe77a6eb265f4ff9d 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: main.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: main.inc 1459 2008-05-30 19:55:28Z alec $
 
 */
 
@@ -27,9 +27,7 @@
  */
 
 require_once('lib/utf7.inc');
-require_once('include/rcube_user.inc');
 require_once('include/rcube_shared.inc');
-require_once('include/rcmail_template.inc');
 
 // define constannts for input reading
 define('RCUBE_INPUT_GET', 0x0101);
@@ -37,313 +35,6 @@ define('RCUBE_INPUT_POST', 0x0102);
 define('RCUBE_INPUT_GPC', 0x0103);
 
 
-/**
- * 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;
-  global $CONFIG, $INSTALL_PATH, $BROWSER, $OUTPUT, $_SESSION, $IMAP, $DB, $USER;
-
-  // check client
-  $BROWSER = rcube_browser();
-
-  // load configuration
-  $CONFIG = rcmail_load_config();
-
-  // set session domain
-  if (isset($CONFIG['session_domain']) && !empty($CONFIG['session_domain'])) {
-    ini_set('session.cookie_domain', $CONFIG['session_domain']);
-  }
-
-  // set session garbage collecting time according to session_lifetime
-  if (!empty($CONFIG['session_lifetime']))
-    ini_set('session.gc_maxlifetime', ($CONFIG['session_lifetime']) * 120);
-
-  // prepare DB connection
-  $dbwrapper = empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend'];
-  $dbclass = "rcube_" . $dbwrapper;
-  require_once("include/$dbclass.inc");
-  
-  $DB = new $dbclass($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']);
-  $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql';
-  $DB->set_debug((bool)$CONFIG['sql_debug']);
-  $DB->db_connect('w');
-
-  // use database for storing session data
-  include_once('include/session.inc');
-
-  // init session
-  session_start();
-  $sess_id = session_id();
-
-  // create session and set session vars
-  if (!isset($_SESSION['auth_time']))
-    {
-    $_SESSION['user_lang'] = rcube_language_prop($CONFIG['locale_string']);
-    $_SESSION['auth_time'] = time();
-    $_SESSION['temp'] = true;
-    }
-
-  // set session vars global
-  $sess_user_lang = rcube_language_prop($_SESSION['user_lang']);
-
-  // create user object
-  $USER = new rcube_user($_SESSION['user_id']);
-
-  // overwrite config with user preferences
-  $CONFIG = array_merge($CONFIG, (array)$USER->get_prefs());
-
-
-  // reset some session parameters when changing task
-  if ($_SESSION['task'] != $task)
-    unset($_SESSION['page']);
-
-  // set current task to session
-  $_SESSION['task'] = $task;
-
-  // create IMAP object
-  if ($task=='mail')
-    rcmail_imap_init();
-
-
-  // set localization
-  if ($CONFIG['locale_string'])
-    setlocale(LC_ALL, $CONFIG['locale_string']);
-  else if ($sess_user_lang)
-    setlocale(LC_ALL, $sess_user_lang);
-
-
-  register_shutdown_function('rcmail_shutdown');
-  }
-
-
-/**
- * Load roundcube configuration array
- *
- * @return array Named configuration parameters
- */
-function rcmail_load_config()
-  {
-  global $INSTALL_PATH;
-
-  // load config file
-  include_once('config/main.inc.php');
-  $conf = is_array($rcmail_config) ? $rcmail_config : array();
-
-  // load host-specific configuration
-  rcmail_load_host_config($conf);
-
-  $conf['skin_path'] = $conf['skin_path'] ? unslashify($conf['skin_path']) : 'skins/default';
-
-  // load db conf
-  include_once('config/db.inc.php');
-  $conf = array_merge($conf, $rcmail_config);
-
-  if (empty($conf['log_dir']))
-    $conf['log_dir'] = $INSTALL_PATH.'logs';
-  else
-    $conf['log_dir'] = unslashify($conf['log_dir']);
-
-  // set PHP error logging according to config
-  if ($conf['debug_level'] & 1)
-    {
-    ini_set('log_errors', 1);
-    ini_set('error_log', $conf['log_dir'].'/errors');
-    }
-  if ($conf['debug_level'] & 4)
-    ini_set('display_errors', 1);
-  else
-    ini_set('display_errors', 0);
-
-  return $conf;
-  }
-
-
-/**
- * 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;
-  
-  if (is_array($config['include_host_config']))
-    $fname = $config['include_host_config'][$_SERVER['HTTP_HOST']];
-  else if (!empty($config['include_host_config']))
-    $fname = preg_replace('/[^a-z0-9\.\-_]/i', '', $_SERVER['HTTP_HOST']) . '.inc.php';
-
-   if ($fname && is_file('config/'.$fname))
-     {
-     include('config/'.$fname);
-     $config = array_merge($config, $rcmail_config);
-     }
-  }
-
-
-/**
- * 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;
-  
-  $auth_string = sprintf('rcmail*sess%sR%s*Chk:%s;%s',
-                         $sess_id,
-                         $ts,
-                         $CONFIG['ip_check'] ? $_SERVER['REMOTE_ADDR'] : '***.***.***.***',
-                         $_SERVER['HTTP_USER_AGENT']);
-  
-  if (function_exists('sha1'))
-    return sha1($auth_string);
-  else
-    return md5($auth_string);
-  }
-
-
-/**
- * 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;
-  
-  // advanced session authentication
-  if ($CONFIG['double_auth'])
-  {
-    $now = time();
-    $valid = ($_COOKIE['sessauth'] == rcmail_auth_hash(session_id(), $_SESSION['auth_time']) ||
-              $_COOKIE['sessauth'] == rcmail_auth_hash(session_id(), $_SESSION['last_auth']));
-
-    // renew auth cookie every 5 minutes (only for GET requests)
-    if (!$valid || ($_SERVER['REQUEST_METHOD']!='POST' && $now-$_SESSION['auth_time'] > 300))
-    {
-      $_SESSION['last_auth'] = $_SESSION['auth_time'];
-      $_SESSION['auth_time'] = $now;
-      setcookie('sessauth', rcmail_auth_hash(session_id(), $now));
-    }
-  }
-  else
-    $valid = $CONFIG['ip_check'] ? $_SERVER['REMOTE_ADDR'] == $SESS_CLIENT_IP : true;
-  
-  // check session filetime
-  if (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED)
-      && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < time())
-    $valid = false;
-  
-  return $valid;
-  }
-
-
-/**
- * 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;
-
-  $IMAP = new rcube_imap($DB);
-  $IMAP->debug_level = $CONFIG['debug_level'];
-  $IMAP->skip_deleted = $CONFIG['skip_deleted'];
-
-
-  // connect with stored session data
-  if ($connect)
-    {
-    if (!($conn = $IMAP->connect($_SESSION['imap_host'], $_SESSION['username'], decrypt_passwd($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl'])))
-      $OUTPUT->show_message('imaperror', 'error');
-      
-    rcmail_set_imap_prop();
-    }
-
-  // enable caching of imap data
-  if ($CONFIG['enable_caching']===TRUE)
-    $IMAP->set_caching(TRUE);
-
-  // set pagesize from config
-  if (isset($CONFIG['pagesize']))
-    $IMAP->set_pagesize($CONFIG['pagesize']);
-  }
-
-
-/**
- * Set root dir and last stored mailbox
- * This must be done AFTER connecting to the server!
- */
-function rcmail_set_imap_prop()
-  {
-  global $CONFIG, $IMAP;
-  
-  if (!empty($CONFIG['default_charset']))
-    $IMAP->set_charset($CONFIG['default_charset']);
-
-  // set root dir from config
-  if (!empty($CONFIG['imap_root']))
-    $IMAP->set_rootdir($CONFIG['imap_root']);
-
-  if (is_array($CONFIG['default_imap_folders']))
-    $IMAP->set_default_mailboxes($CONFIG['default_imap_folders']);
-
-  if (!empty($_SESSION['mbox']))
-    $IMAP->set_mailbox($_SESSION['mbox']);
-  if (isset($_SESSION['page']))
-    $IMAP->set_page($_SESSION['page']);
-  }
-
-
-/**
- * Do these things on script shutdown
- */
-function rcmail_shutdown()
-  {
-  global $IMAP, $CONTACTS;
-  
-  if (is_object($IMAP))
-    {
-    $IMAP->close();
-    $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
- */
-function rcmail_kill_session()
-  {
-  global $USER;
-  
-  if ((isset($_SESSION['sort_col']) && $_SESSION['sort_col']!=$a_user_prefs['message_sort_col']) ||
-      (isset($_SESSION['sort_order']) && $_SESSION['sort_order']!=$a_user_prefs['message_sort_order']))
-    {
-    $a_user_prefs = array('message_sort_col' => $_SESSION['sort_col'], 'message_sort_order' => $_SESSION['sort_order']);
-    $USER->save_prefs($a_user_prefs);
-    }
-
-  $_SESSION = array('user_lang' => $GLOBALS['sess_user_lang'], 'auth_time' => time(), 'temp' => true);
-  setcookie('sessauth', '-del-', time()-60);
-  $USER->reset();
-  }
-
 
 /**
  * Return correct name for a specific database table
@@ -354,319 +45,59 @@ function rcmail_kill_session()
 function get_table_name($table)
   {
   global $CONFIG;
-  
+
   // return table name if configured
   $config_key = 'db_table_'.$table;
 
   if (strlen($CONFIG[$config_key]))
     return $CONFIG[$config_key];
-  
+
   return $table;
   }
 
 
 /**
  * Return correct name for a specific database sequence
- * (used for Postres only)
+ * (used for Postgres only)
  *
  * @param string Secuence name
  * @return string Translated sequence name
  */
 function get_sequence_name($sequence)
   {
-  global $CONFIG;
-  
   // return table name if configured
   $config_key = 'db_sequence_'.$sequence;
+  $opt = rcmail::get_instance()->config->get($config_key);
 
-  if (strlen($CONFIG[$config_key]))
-    return $CONFIG[$config_key];
-  
-  return $sequence;
-  }
-
-
-/**
- * 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;
-  static $rcube_languages, $rcube_language_aliases, $rcube_charsets;
-
-  if (empty($rcube_languages))
-    @include($INSTALL_PATH.'program/localization/index.inc');
-    
-  // check if we have an alias for that language
-  if (!isset($rcube_languages[$lang]) && isset($rcube_language_aliases[$lang]))
-    $lang = $rcube_language_aliases[$lang];
-    
-  // try the first two chars
-  if (!isset($rcube_languages[$lang]) && strlen($lang)>2)
+  if (!empty($opt))
     {
-    $lang = substr($lang, 0, 2);
-    $lang = rcube_language_prop($lang);
-    }
-
-  if (!isset($rcube_languages[$lang]))
-    $lang = 'en_US';
-
-  // language has special charset configured
-  if (isset($rcube_charsets[$lang]))
-    $charset = $rcube_charsets[$lang];
-  else
-    $charset = 'UTF-8';    
-
-
-  if ($prop=='charset')
-    return $charset;
-  else
-    return $lang;
-  }
-  
-
-/**
- * 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;
-
-  // init output page
-  $OUTPUT = new rcmail_template($CONFIG, $GLOBALS['_task']);
-  $OUTPUT->set_env('comm_path', $GLOBALS['COMM_PATH']);
-
-  if (is_array($CONFIG['javascript_config']))
-  {
-    foreach ($CONFIG['javascript_config'] as $js_config_var)
-      $OUTPUT->set_env($js_config_var, $CONFIG[$js_config_var]);
-  }
-
-  if (!empty($GLOBALS['_framed']))
-    $OUTPUT->set_env('framed', true);
+    $db = &rcmail::get_instance()->db;
 
-  // set locale setting
-  rcmail_set_locale($sess_user_lang);
-
-  // set user-selected charset
-  if (!empty($CONFIG['charset']))
-    $OUTPUT->set_charset($CONFIG['charset']);
-    
-  // register common UI objects
-  $OUTPUT->add_handlers(array(
-    'loginform' => 'rcmail_login_form',
-    'username'  => 'rcmail_current_username',
-    'message' => 'rcmail_message_container',
-    'charsetselector' => 'rcmail_charset_selector',
-  ));
-
-  // add some basic label to client
-  if (!$OUTPUT->ajax_call)
-    rcube_add_label('loading', 'movingmessage');
-  }
-
-
-/**
- * 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"); 
-  else
-    $MBSTRING = $s_mbstring_loaded = FALSE;
-  
-  if ($MBSTRING)
-    mb_internal_encoding(RCMAIL_CHARSET);
-
-  $OUTPUT->set_charset(rcube_language_prop($lang, 'charset'));
-  }
-
-
-/**
- * Auto-select IMAP host based on the posted login information
- *
- * @return string Selected IMAP host
- */
-function rcmail_autoselect_host()
-  {
-  global $CONFIG;
-  
-  $host = isset($_POST['_host']) ? get_input_value('_host', RCUBE_INPUT_POST) : $CONFIG['default_host'];
-  if (is_array($host))
-    {
-    list($user, $domain) = explode('@', get_input_value('_user', RCUBE_INPUT_POST));
-    if (!empty($domain))
+    if($db->db_provider=='pgsql') // just for sure
       {
-      foreach ($host as $imap_host => $mail_domains)
-        if (is_array($mail_domains) && in_array($domain, $mail_domains))
-          {
-          $host = $imap_host;
-          break;
-          }
-      }
-
-    // take the first entry if $host is still an array
-    if (is_array($host))
-      $host = array_shift($host);
-    }
+      $db->db_handle->setOption('disable_smart_seqname', true);
+      $db->db_handle->setOption('seqname_format', '%s');
+      }              
   
-  return $host;
+    return $CONFIG[$opt];
+    }
+    
+  return $sequence;
   }
 
 
 /**
- * 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.
+ * Get localized text in the desired language
+ * It's a global wrapper for rcmail::gettext()
  *
- * @param string IMAP user name
- * @param string IMAP password
- * @param string IMAP host
- * @return boolean True on success, False on failure
+ * @param mixed Named parameters array or label name
+ * @return string Localized text
+ * @see rcmail::gettext()
  */
-function rcmail_login($user, $pass, $host=NULL)
-  {
-  global $CONFIG, $IMAP, $DB, $USER, $sess_user_lang;
-  $user_id = NULL;
-  
-  if (!$host)
-    $host = $CONFIG['default_host'];
-
-  // Validate that selected host is in the list of configured hosts
-  if (is_array($CONFIG['default_host']))
-    {
-    $allowed = FALSE;
-    foreach ($CONFIG['default_host'] as $key => $host_allowed)
-      {
-      if (!is_numeric($key))
-        $host_allowed = $key;
-      if ($host == $host_allowed)
-        {
-        $allowed = TRUE;
-        break;
-        }
-      }
-    if (!$allowed)
-      return FALSE;
-    }
-  else if (!empty($CONFIG['default_host']) && $host != $CONFIG['default_host'])
-    return FALSE;
-
-  // parse $host URL
-  $a_host = parse_url($host);
-  if ($a_host['host'])
-    {
-    $host = $a_host['host'];
-    $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
-    $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']);
-    }
-  else
-    $imap_port = $CONFIG['default_port'];
-
-
-  /* Modify username with domain if required  
-     Inspired by Marco <P0L0_notspam_binware.org>
-  */
-  // Check if we need to add domain
-  if (!empty($CONFIG['username_domain']) && !strpos($user, '@'))
-    {
-    if (is_array($CONFIG['username_domain']) && isset($CONFIG['username_domain'][$host]))
-      $user .= '@'.$CONFIG['username_domain'][$host];
-    else if (is_string($CONFIG['username_domain']))
-      $user .= '@'.$CONFIG['username_domain'];
-    }
-
-  // try to resolve email address from virtuser table    
-  if (!empty($CONFIG['virtuser_file']) && strpos($user, '@'))
-    $user = rcube_user::email2user($user);
-
-  // lowercase username if it's an e-mail address (#1484473)
-  if (strpos($user, '@'))
-    $user = strtolower($user);
-
-  // query if user already registered
-  if ($existing = rcube_user::query($user, $host))
-    $USER = $existing;
-
-  // user already registered -> overwrite username
-  if ($USER->ID)
-    {
-    $user_id = $USER->ID;
-    $user = $USER->data['username'];
-    }
-
-  // exit if IMAP login failed
-  if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl)))
-    return false;
-
-  // user already registered
-  if ($USER->ID)
-    {
-    // get user prefs
-    $CONFIG = array_merge($CONFIG, (array)$USER->get_prefs());
-
-    // set user specific language
-    if (!empty($USER->data['language']))
-      $sess_user_lang = $_SESSION['user_lang'] = $USER->data['language'];
-      
-    // update user's record
-    $USER->touch();
-    }
-  // create new system user
-  else if ($CONFIG['auto_create_user'])
-    {
-    if ($created = rcube_user::create($user, $host))
-    {
-      $USER = $created;
-      
-      // get existing mailboxes
-      $a_mailboxes = $IMAP->list_mailboxes();
-    }
-    }
-  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)
-    {
-    $_SESSION['user_id']   = $USER->ID;
-    $_SESSION['username']  = $USER->data['username'];
-    $_SESSION['imap_host'] = $host;
-    $_SESSION['imap_port'] = $imap_port;
-    $_SESSION['imap_ssl']  = $imap_ssl;
-    $_SESSION['user_lang'] = $sess_user_lang;
-    $_SESSION['password']  = encrypt_passwd($pass);
-    $_SESSION['login_time'] = mktime();
-
-    // force reloading complete list of subscribed mailboxes
-    rcmail_set_imap_prop();
-    $IMAP->clear_cache('mailboxes');
-
-    if ($CONFIG['create_default_folders'])
-        $IMAP->create_default_folders();
-
-    return TRUE;
-    }
-
-  return FALSE;
-  }
+function rcube_label($p)
+{
+  return rcmail::get_instance()->gettext($p);
+}
 
 
 /**
@@ -721,9 +152,9 @@ function rcmail_findinvirtual($pattern)
  */
 function rcmail_overwrite_action($action)
   {
-  global $OUTPUT;
-  $GLOBALS['_action'] = $action;
-  $OUTPUT->set_env('action', $action);
+  $app = rcmail::get_instance();
+  $app->action = $action;
+  $app->output->set_env('action', $action);
   }
 
 
@@ -737,12 +168,13 @@ function rcmail_overwrite_action($action)
  */
 function rcmail_url($action, $p=array(), $task=null)
 {
-  global $MAIN_TASKS, $COMM_PATH;
+  $app = rcmail::get_instance();
+  
   $qstring = '';
-  $base = $COMM_PATH;
+  $base = $app->comm_path;
   
-  if ($task && in_array($task, $MAIN_TASKS))
-    $base = ereg_replace('_task=[a-z]+', '_task='.$task, $COMM_PATH);
+  if ($task && in_array($task, rcmail::$main_tasks))
+    $base = ereg_replace('_task=[a-z]+', '_task='.$task, $app->comm_path);
   
   if (is_array($p))
     foreach ($p as $key => $val)
@@ -752,126 +184,9 @@ function rcmail_url($action, $p=array(), $task=null)
 }
 
 
-// @deprecated
-function show_message($message, $type='notice', $vars=NULL)
-  {
-  global $OUTPUT;
-  $OUTPUT->show_message($message, $type, $vars);
-  }
-
-
-/**
- * Encrypt IMAP password using DES encryption
- *
- * @param string Password to encrypt
- * @return string Encryprted string
- */
-function encrypt_passwd($pass)
-{
-  if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
-    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
-    mcrypt_generic_init($td, get_des_key(), $iv);
-    $cypher = mcrypt_generic($td, $pass);
-    mcrypt_generic_deinit($td);
-    mcrypt_module_close($td);
-  }
-  else if (function_exists('des')) {
-    $cypher = des(get_des_key(), $pass, 1, 0, NULL);
-  }
-  else {
-    $cypher = $pass;
-    
-    raise_error(array(
-      'code' => 500,
-      'type' => 'php',
-      'file' => __FILE__,
-      'message' => "Could not convert encrypt password. Make sure Mcrypt is installed or lib/des.inc is available"
-      ), true, false);
-  }
-  
-  return base64_encode($cypher);
-}
-
-
-/**
- * Decrypt IMAP password using DES encryption
- *
- * @param string Encrypted password
- * @return string Plain password
- */
-function decrypt_passwd($cypher)
-{
-  if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
-    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
-    mcrypt_generic_init($td, get_des_key(), $iv);
-    $pass = mdecrypt_generic($td, base64_decode($cypher));
-    mcrypt_generic_deinit($td);
-    mcrypt_module_close($td);
-  }
-  else if (function_exists('des')) {
-    $pass = des(get_des_key(), base64_decode($cypher), 0, 0, NULL);
-  }
-  else {
-    $pass = base64_decode($cypher);
-  }
-  
-  return preg_replace('/\x00/', '', $pass);
-  }
-
-
-/**
- * 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';
-  $len = strlen($key);
-  
-  // make sure the key is exactly 24 chars long
-  if ($len<24)
-    $key .= str_repeat('_', 24-$len);
-  else if ($len>24)
-    substr($key, 0, 24);
-  
-  return $key;
-  }
-
-
-/**
- * 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;
-  static $sa_languages = array();
-
-  if (!sizeof($sa_languages))
-    {
-    @include($INSTALL_PATH.'program/localization/index.inc');
-
-    if ($dh = @opendir($INSTALL_PATH.'program/localization'))
-      {
-      while (($name = readdir($dh)) !== false)
-        {
-        if ($name{0}=='.' || !is_dir($INSTALL_PATH.'program/localization/'.$name))
-          continue;
-
-        if ($label = $rcube_languages[$name])
-          $sa_languages[$name] = $label ? $label : $name;
-        }
-      closedir($dh);
-      }
-    }
-  return $sa_languages;
-  }
-
-
 /**
  * Add a localized label to the client environment
+ * @deprecated
  */
 function rcube_add_label()
   {
@@ -879,7 +194,7 @@ function rcube_add_label()
   
   $arg_list = func_get_args();
   foreach ($arg_list as $i => $name)
-    $OUTPUT->command('add_label', $name, rcube_label($name));
+    $OUTPUT->add_label($name);
   }
 
 
@@ -939,8 +254,7 @@ function rcmail_message_cache_gc()
  */
 function rcube_charset_convert($str, $from, $to=NULL)
   {
-  global $MBSTRING;
-  static $convert_warning = false;
+  static $mbstring_loaded = null, $convert_warning = false;
 
   $from = strtoupper($from);
   $to = $to==NULL ? strtoupper(RCMAIL_CHARSET) : strtoupper($to);
@@ -961,11 +275,21 @@ function rcube_charset_convert($str, $from, $to=NULL)
   if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7')
     {
     $aliases['GB2312'] = 'GB18030';
-    return iconv(($aliases[$from] ? $aliases[$from] : $from), ($aliases[$to] ? $aliases[$to] : $to) . "//IGNORE", $str);
+    $_iconv = iconv(($aliases[$from] ? $aliases[$from] : $from), ($aliases[$to] ? $aliases[$to] : $to) . "//IGNORE", $str);
+    if ($_iconv !== false)
+      {
+        return $_iconv;
+      }
     }
 
-  // convert charset using mbstring module  
-  if ($MBSTRING)
+  // settings for mbstring module (by Tadashi Jokagi)
+  if (is_null($mbstring_loaded)) {
+    if ($mbstring_loaded = extension_loaded("mbstring"))
+      mb_internal_encoding(RCMAIL_CHARSET);
+  }
+
+  // convert charset using mbstring module
+  if ($mbstring_loaded)
     {
     $aliases['UTF-7'] = 'UTF7-IMAP';
     $aliases['WINDOWS-1257'] = 'ISO-8859-13';
@@ -1034,9 +358,16 @@ function rcube_charset_convert($str, $from, $to=NULL)
  */
 function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
   {
-  global $OUTPUT_TYPE, $OUTPUT;
-  static $html_encode_arr, $js_rep_table, $xml_rep_table;
-
+  global $OUTPUT;
+  static $html_encode_arr = false;
+  static $js_rep_table = false;
+  static $xml_rep_table = false;
+
+  $charset = $OUTPUT->get_charset();
+  $is_iso_8859_1 = false;
+  if ($charset == 'ISO-8859-1') {
+    $is_iso_8859_1 = true;
+  }
   if (!$enctype)
     $enctype = $GLOBALS['OUTPUT_TYPE'];
 
@@ -1077,7 +408,7 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
     return rawurlencode($str);
 
   // if the replace tables for XML and JS are not yet defined
-  if (!$js_rep_table)
+  if ($js_rep_table===false)
     {
     $js_rep_table = $xml_rep_table = array();
     $xml_rep_table['&'] = '&amp;';
@@ -1086,7 +417,7 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
       {
       $xml_rep_table[Chr($c)] = "&#$c;";
       
-      if ($OUTPUT->get_charset()=='ISO-8859-1')
+      if ($is_iso_8859_1)
         $js_rep_table[Chr($c)] = sprintf("\\u%04x", $c);
       }
 
@@ -1100,10 +431,10 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
   // encode for javascript use
   if ($enctype=='js')
     {
-    if ($OUTPUT->get_charset()!='UTF-8')
-      $str = rcube_charset_convert($str, RCMAIL_CHARSET, $OUTPUT->get_charset());
+    if ($charset!='UTF-8')
+      $str = rcube_charset_convert($str, RCMAIL_CHARSET,$charset);
       
-    return preg_replace(array("/\r?\n/", "/\r/"), array('\n', '\n'), addslashes(strtr($str, $js_rep_table)));
+    return preg_replace(array("/\r?\n/", "/\r/", '/<\\//'), array('\n', '\n', '<\\/'), addslashes(strtr($str, $js_rep_table)));
     }
 
   // no encoding given -> return original string
@@ -1228,16 +559,6 @@ function template_exists($name)
   }
 
 
-/**
- * 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
  *
@@ -1290,7 +611,7 @@ function rcube_table_output($attrib, $table_data, $a_show_cols, $id_col)
       {
       $zebra_class = $c%2 ? 'even' : 'odd';
 
-      $table .= sprintf('<tr id="rcmrow%d" class="contact '.$zebra_class.'">'."\n", $row_data[$id_col]);
+      $table .= sprintf('<tr id="rcmrow%s" class="contact '.$zebra_class.'">'."\n", $row_data[$id_col]);
 
       // format each col
       foreach ($a_show_cols as $col)
@@ -1328,15 +649,15 @@ function rcmail_get_edit_field($col, $value, $attrib, $type='text')
   if ($type=='checkbox')
     {
     $attrib['value'] = '1';
-    $input = new checkbox($attrib);
+    $input = new html_checkbox($attrib);
     }
   else if ($type=='textarea')
     {
     $attrib['cols'] = $attrib['size'];
-    $input = new textarea($attrib);
+    $input = new html_textarea($attrib);
     }
   else
-    $input = new textfield($attrib);
+    $input = new html_inputfield($attrib);
 
   // use value from post
   if (!empty($_POST[$fname]))
@@ -1468,12 +789,14 @@ function create_attrib_string($attrib, $allowed_attribs=array('id', 'class', 'st
 function parse_attrib_string($str)
   {
   $attrib = array();
-  preg_match_all('/\s*([-_a-z]+)=(["\'])([^"]+)\2/Ui', stripslashes($str), $regs, PREG_SET_ORDER);
+  preg_match_all('/\s*([-_a-z]+)=(["\'])??(?(2)([^\2]+)\2|(\S+?))/Ui', stripslashes($str), $regs, PREG_SET_ORDER);
 
   // convert attributes to an associative array (name => value)
   if ($regs)
     foreach ($regs as $attr)
-      $attrib[strtolower($attr[1])] = $attr[3];
+      {
+      $attrib[strtolower($attr[1])] = $attr[3] . $attr[4];
+      }
 
   return $attrib;
   }
@@ -1489,15 +812,25 @@ function parse_attrib_string($str)
  */
 function format_date($date, $format=NULL)
   {
-  global $CONFIG, $sess_user_lang;
+  global $CONFIG;
   
   $ts = NULL;
-  
+
   if (is_numeric($date))
     $ts = $date;
   else if (!empty($date))
-    $ts = @strtotime($date);
-    
+    {
+    while (($ts = @strtotime($date))===false)
+      {
+        // if we have a date in non-rfc format
+        // remove token from the end and try again
+        $d = explode(' ', $date);
+        array_pop($d);
+        if (!$d) break;
+        $date = implode(' ', $d);
+      }
+    }
+
   if (empty($ts))
     return '';
    
@@ -1549,7 +882,7 @@ function format_date($date, $format=NULL)
       $out .= rcube_label(strtolower(date('M', $timestamp)));
     // month name (long)
     else if ($format{$i}=='F')
-      $out .= rcube_label(strtolower(date('F', $timestamp)));
+      $out .= rcube_label('long'.strtolower(date('M', $timestamp)));
     else
       $out .= date($format{$i}, $timestamp);
     }
@@ -1593,7 +926,7 @@ function console($msg)
 
   if (!($GLOBALS['CONFIG']['debug_level'] & 4))
     write_log('console', $msg);
-  else if ($GLOBALS['REMOTE_REQUEST'])
+  else if ($GLOBALS['OUTPUT']->ajax_call)
     print "/*\n $msg \n*/\n";
   else
     {
@@ -1608,12 +941,12 @@ function console($msg)
  * Append a line to a logfile in the logs directory.
  * Date will be added automatically to the line.
  *
- * @param $name Name of logfile
- * @param $line Line to append
+ * @param $name name of log file
+ * @param line Line to append
  */
 function write_log($name, $line)
   {
-  global $CONFIG, $INSTALL_PATH;
+  global $CONFIG;
 
   if (!is_string($line))
     $line = var_export($line, true);
@@ -1623,7 +956,7 @@ function write_log($name, $line)
                  $line);
                  
   if (empty($CONFIG['log_dir']))
-    $CONFIG['log_dir'] = $INSTALL_PATH.'logs';
+    $CONFIG['log_dir'] = INSTALL_PATH.'logs';
       
   // try to open specific log file for writing
   if ($fp = @fopen($CONFIG['log_dir'].'/'.$name, 'a'))    
@@ -1811,7 +1144,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, $maxlength, $
       $class_name = 'junk';
 
     $js_name = htmlspecialchars(JQ($folder['id']));
-    $out .= sprintf('<li id="rcmli%s" class="mailbox %s %s%s%s"><a href="%s"'.
+    $out .= sprintf('<li id="rcmli%s" class="mailbox %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\')"' .
@@ -1819,7 +1152,6 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, $maxlength, $
                     $folder_id,
                     $class_name,
                     $zebra_class,
-                    $unread_count ? ' unread' : '',
                     $folder['id']==$mbox_name ? ' selected' : '',
                     Q(rcmail_url('', array('_mbox' => $folder['id']))),
                     JS_OBJECT_NAME,
@@ -1848,7 +1180,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, $maxlength, $
  * Return html for a flat list <select> for the mailbox tree
  * @access private
  */
-function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, $nestLevel=0)
+function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, $nestLevel=0, $selected='')
   {
   global $IMAP, $OUTPUT;
 
@@ -1867,13 +1199,14 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength,
         $foldername = abbreviate_string($foldername, $maxlength);
       }
 
-    $out .= sprintf('<option value="%s">%s%s</option>'."\n",
+    $out .= sprintf('<option value="%s"%s>%s%s</option>'."\n",
                     htmlspecialchars($folder['id']),
+                   ($selected == $foldername ? ' selected="selected"' : ''),
                     str_repeat('&nbsp;', $nestLevel*4),
                     Q($foldername));
 
     if (!empty($folder['folders']))
-      $out .= rcmail_render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, $nestLevel+1);
+      $out .= rcmail_render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, $nestLevel+1, $selected);
 
     $idx++;
     }
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
new file mode 100644 (file)
index 0000000..0b5bcdb
--- /dev/null
@@ -0,0 +1,825 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcmail.php                                            |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Application class providing core functions and holding              |
+ |   instances of all 'global' objects like db- and imap-connections     |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_browser.php 328 2006-08-30 17:41:21Z thomasb $
+
+*/
+
+
+/**
+ * Application class of RoundCube Webmail
+ * implemented as singleton
+ *
+ * @package Core
+ */
+class rcmail
+{
+  static public $main_tasks = array('mail','settings','addressbook','login','logout');
+  
+  static private $instance;
+  
+  public $config;
+  public $user;
+  public $db;
+  public $imap;
+  public $output;
+  public $task = 'mail';
+  public $action = '';
+  public $comm_path = './';
+  
+  private $texts;
+  
+  
+  /**
+   * This implements the 'singleton' design pattern
+   *
+   * @return object qvert The one and only instance
+   */
+  static function get_instance()
+  {
+    if (!self::$instance) {
+      self::$instance = new rcmail();
+      self::$instance->startup();  // init AFTER object was linked with self::$instance
+    }
+
+    return self::$instance;
+  }
+  
+  
+  /**
+   * Private constructor
+   */
+  private function __construct()
+  {
+    // load configuration
+    $this->config = new rcube_config();
+    
+    register_shutdown_function(array($this, 'shutdown'));
+  }
+  
+  
+  /**
+   * Initial startup function
+   * to register session, create database and imap connections
+   *
+   * @todo Remove global vars $DB, $USER
+   */
+  private function startup()
+  {
+    $config_all = $this->config->all();
+
+    // set task and action properties
+    $this->set_task(strip_quotes(get_input_value('_task', RCUBE_INPUT_GPC)));
+    $this->action = strip_quotes(get_input_value('_action', RCUBE_INPUT_GPC));
+
+    // connect to database
+    $GLOBALS['DB'] = $this->get_dbh();
+
+    // use database for storing session data
+    include_once('include/session.inc');
+
+    // set session domain
+    if (!empty($config_all['session_domain'])) {
+      ini_set('session.cookie_domain', $config_all['session_domain']);
+    }
+    // set session garbage collecting time according to session_lifetime
+    if (!empty($config_all['session_lifetime'])) {
+      ini_set('session.gc_maxlifetime', ($config_all['session_lifetime']) * 120);
+    }
+
+    // start PHP session (if not in CLI mode)
+    if ($_SERVER['REMOTE_ADDR'])
+      session_start();
+
+    // set initial session vars
+    if (!isset($_SESSION['auth_time'])) {
+      $_SESSION['auth_time'] = time();
+      $_SESSION['temp'] = true;
+    }
+
+
+    // create user object
+    $this->set_user(new rcube_user($_SESSION['user_id']));
+
+    // reset some session parameters when changing task
+    if ($_SESSION['task'] != $this->task)
+      unset($_SESSION['page']);
+
+    // set current task to session
+    $_SESSION['task'] = $this->task;
+
+    // create IMAP object
+    if ($this->task == 'mail')
+      $this->imap_init();
+  }
+  
+  
+  /**
+   * Setter for application task
+   *
+   * @param string Task to set
+   */
+  public function set_task($task)
+  {
+    if (!in_array($task, self::$main_tasks))
+      $task = 'mail';
+    
+    $this->task = $task;
+    $this->comm_path = './?_task=' . $task;
+    
+    if ($this->output)
+      $this->output->set_env('task', $task);
+  }
+  
+  
+  /**
+   * Setter for system user object
+   *
+   * @param object rcube_user Current user instance
+   */
+  public function set_user($user)
+  {
+    if (is_object($user)) {
+      $this->user = $user;
+      $GLOBALS['USER'] = $this->user;
+      
+      // overwrite config with user preferences
+      $this->config->merge((array)$this->user->get_prefs());
+    }
+    
+    $_SESSION['language'] = $this->user->language = $this->language_prop($this->config->get('language'));
+
+    // set localization
+    setlocale(LC_ALL, $_SESSION['language'] . '.utf8');
+  }
+  
+  
+  /**
+   * Check the given string and return a valid language code
+   *
+   * @param string Language code
+   * @return string Valid language code
+   */
+  private function language_prop($lang)
+  {
+    static $rcube_languages, $rcube_language_aliases;
+
+    if (empty($rcube_languages)) {
+      @include(INSTALL_PATH . 'program/localization/index.inc');
+    }
+    
+    // check if we have an alias for that language
+    if (!isset($rcube_languages[$lang]) && isset($rcube_language_aliases[$lang])) {
+      $lang = $rcube_language_aliases[$lang];
+    }
+    // try the first two chars
+    else if (!isset($rcube_languages[$lang])) {
+      $short = substr($lang, 0, 2);
+     
+      // check if we have an alias for the short language code
+      if (!isset($rcube_languages[$short]) && isset($rcube_language_aliases[$short])) {
+        $lang = $rcube_language_aliases[$short];
+      }
+      // expand 'nn' to 'nn_NN'
+      else if (!isset($rcube_languages[$short])) {
+        $lang = $short.'_'.strtoupper($short);
+      }
+    }
+
+    if (!isset($rcube_languages[$lang]) || !is_dir(INSTALL_PATH . 'program/localization/' . $lang)) {
+      $lang = 'en_US';
+    }
+
+    return $lang;
+  }
+  
+  
+  /**
+   * Get the current database connection
+   *
+   * @return object rcube_db  Database connection object
+   */
+  public function get_dbh()
+  {
+    if (!$this->db) {
+      $dbclass = "rcube_" . $this->config->get('db_backend', 'mdb2');
+      $config_all = $this->config->all();
+
+      $this->db = new $dbclass($config_all['db_dsnw'], $config_all['db_dsnr'], $config_all['db_persistent']);
+      $this->db->sqlite_initials = INSTALL_PATH . 'SQL/sqlite.initial.sql';
+      $this->db->set_debug((bool)$config_all['sql_debug']);
+      $this->db->db_connect('w');
+    }
+
+    return $this->db;
+  }
+  
+  
+  /**
+   * 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
+   */
+  public function load_gui($framed = false)
+  {
+    // init output page
+    $this->output = new rcube_template($this->task, $framed);
+
+    foreach (array('flag_for_deletion') as $js_config_var) {
+      $this->output->set_env($js_config_var, $this->config->get($js_config_var));
+    }
+
+    if ($framed) {
+      $this->comm_path .= '&_framed=1';
+      $this->output->set_env('framed', true);
+    }
+
+    $this->output->set_env('task', $this->task);
+    $this->output->set_env('action', $this->action);
+    $this->output->set_env('comm_path', $this->comm_path);
+    $this->output->set_charset($this->config->get('charset', RCMAIL_CHARSET));
+
+    // add some basic label to client
+    $this->output->add_label('loading');
+    
+    return $this->output;
+  }
+  
+  
+  /**
+   * Create an output object for JSON responses
+   */
+  public function init_json()
+  {
+    $this->output = new rcube_json_output($this->task);
+    
+    return $this->output;
+  }
+  
+  
+  /**
+   * Create global IMAP object and connect to server
+   *
+   * @param boolean True if connection should be established
+   * @todo Remove global $IMAP
+   */
+  public function imap_init($connect = false)
+  {
+    $this->imap = new rcube_imap($this->db);
+    $this->imap->debug_level = $this->config->get('debug_level');
+    $this->imap->skip_deleted = $this->config->get('skip_deleted');
+
+    // enable caching of imap data
+    if ($this->config->get('enable_caching')) {
+      $this->imap->set_caching(true);
+    }
+
+    // set pagesize from config
+    $this->imap->set_pagesize($this->config->get('pagesize', 50));
+  
+    // set global object for backward compatibility
+    $GLOBALS['IMAP'] = $this->imap;
+    
+    if ($connect)
+      $this->imap_connect();
+  }
+
+
+  /**
+   * Connect to IMAP server with stored session data
+   *
+   * @return bool True on success, false on error
+   */
+  public function imap_connect()
+  {
+    $conn = false;
+    
+    if ($_SESSION['imap_host']) {
+      if (!($conn = $this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt_passwd($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl'], rcmail::get_instance()->config->get('imap_auth_type', 'check')))) {
+        if ($this->output)
+          $this->output->show_message($this->imap->error_code == -1 ? 'imaperror' : 'sessionerror', 'error');
+      }
+
+      $this->set_imap_prop();
+    }
+
+    return $conn;    
+  }
+
+
+  /**
+   * Perfom login to the IMAP server and to the webmail service.
+   * This will also create a new user entry if auto_create_user is configured.
+   *
+   * @param string IMAP user name
+   * @param string IMAP password
+   * @param string IMAP host
+   * @return boolean True on success, False on failure
+   */
+  function login($username, $pass, $host=NULL)
+  {
+    $user = NULL;
+    $config = $this->config->all();
+
+    if (!$host)
+      $host = $config['default_host'];
+
+    // Validate that selected host is in the list of configured hosts
+    if (is_array($config['default_host'])) {
+      $allowed = false;
+      foreach ($config['default_host'] as $key => $host_allowed) {
+        if (!is_numeric($key))
+          $host_allowed = $key;
+        if ($host == $host_allowed) {
+          $allowed = true;
+          break;
+        }
+      }
+      if (!$allowed)
+        return false;
+      }
+    else if (!empty($config['default_host']) && $host != $config['default_host'])
+      return false;
+
+    // parse $host URL
+    $a_host = parse_url($host);
+    if ($a_host['host']) {
+      $host = $a_host['host'];
+      $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
+      $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $config['default_port']);
+    }
+    else
+      $imap_port = $config['default_port'];
+
+
+    /* Modify username with domain if required  
+       Inspired by Marco <P0L0_notspam_binware.org>
+    */
+    // Check if we need to add domain
+    if (!empty($config['username_domain']) && !strpos($username, '@')) {
+      if (is_array($config['username_domain']) && isset($config['username_domain'][$host]))
+        $username .= '@'.$config['username_domain'][$host];
+      else if (is_string($config['username_domain']))
+        $username .= '@'.$config['username_domain'];
+    }
+
+    // try to resolve email address from virtuser table    
+    if (!empty($config['virtuser_file']) && strpos($username, '@'))
+      $username = rcube_user::email2user($username);
+
+    // lowercase username if it's an e-mail address (#1484473)
+    if (strpos($username, '@'))
+      $username = strtolower($username);
+
+    // user already registered -> overwrite username
+    if ($user = rcube_user::query($username, $host))
+      $username = $user->data['username'];
+
+    // exit if IMAP login failed
+    if (!($imap_login  = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl, $config['imap_auth_type'])))
+      return false;
+
+    // user already registered -> update user's record
+    if (is_object($user)) {
+      $user->touch();
+    }
+    // create new system user
+    else if ($config['auto_create_user']) {
+      if ($created = rcube_user::create($username, $host)) {
+        $user = $created;
+
+        // get existing mailboxes (but why?)
+        // $a_mailboxes = $this->imap->list_mailboxes();
+      }
+    }
+    else {
+      raise_error(array(
+        'code' => 600,
+        'type' => 'php',
+        'file' => "config/main.inc.php",
+        'message' => "Acces denied for new user $username. 'auto_create_user' is disabled"
+        ), true, false);
+    }
+
+    // login succeeded
+    if (is_object($user) && $user->ID) {
+      $this->set_user($user);
+
+      // set session vars
+      $_SESSION['user_id']   = $user->ID;
+      $_SESSION['username']  = $user->data['username'];
+      $_SESSION['imap_host'] = $host;
+      $_SESSION['imap_port'] = $imap_port;
+      $_SESSION['imap_ssl']  = $imap_ssl;
+      $_SESSION['password']  = $this->encrypt_passwd($pass);
+      $_SESSION['login_time'] = mktime();
+
+      // force reloading complete list of subscribed mailboxes
+      $this->set_imap_prop();
+      $this->imap->clear_cache('mailboxes');
+
+      if ($config['create_default_folders'])
+          $this->imap->create_default_folders();
+
+      return true;
+    }
+
+    return false;
+  }
+
+
+  /**
+   * Set root dir and last stored mailbox
+   * This must be done AFTER connecting to the server!
+   */
+  public function set_imap_prop()
+  {
+    $this->imap->set_charset($this->config->get('default_charset', RCMAIL_CHARSET));
+
+    // set root dir from config
+    if ($imap_root = $this->config->get('imap_root')) {
+      $this->imap->set_rootdir($imap_root);
+    }
+    if ($default_folders = $this->config->get('default_imap_folders')) {
+      $this->imap->set_default_mailboxes($default_folders);
+    }
+    if (!empty($_SESSION['mbox'])) {
+      $this->imap->set_mailbox($_SESSION['mbox']);
+    }
+    if (isset($_SESSION['page'])) {
+      $this->imap->set_page($_SESSION['page']);
+    }
+  }
+
+
+  /**
+   * Auto-select IMAP host based on the posted login information
+   *
+   * @return string Selected IMAP host
+   */
+  public function autoselect_host()
+  {
+    $default_host = $this->config->get('default_host');
+    $host = !empty($default_host) ? get_input_value('_host', RCUBE_INPUT_POST) : $default_host;
+    
+    if (is_array($host)) {
+      list($user, $domain) = explode('@', get_input_value('_user', RCUBE_INPUT_POST));
+      if (!empty($domain)) {
+        foreach ($host as $imap_host => $mail_domains) {
+          if (is_array($mail_domains) && in_array($domain, $mail_domains)) {
+            $host = $imap_host;
+            break;
+          }
+        }
+      }
+
+      // take the first entry if $host is still an array
+      if (is_array($host))
+        $host = array_shift($host);
+    }
+
+    return $host;
+  }
+
+
+  /**
+   * Get localized text in the desired language
+   *
+   * @param mixed Named parameters array or label name
+   * @return string Localized text
+   */
+  public function gettext($attrib)
+  {
+    // load localization files if not done yet
+    if (empty($this->texts))
+      $this->load_language();
+    
+    // extract attributes
+    if (is_string($attrib))
+      $attrib = array('name' => $attrib);
+
+    $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1;
+    $vars = isset($attrib['vars']) ? $attrib['vars'] : '';
+
+    $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL;
+    $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : '');
+
+    // text does not exist
+    if (!($text_item = $this->texts[$alias])) {
+      /*
+      raise_error(array(
+        'code' => 500,
+        'type' => 'php',
+        'line' => __LINE__,
+        'file' => __FILE__,
+        'message' => "Missing localized text for '$alias' in '$sess_user_lang'"), TRUE, FALSE);
+      */
+      return "[$alias]";
+    }
+
+    // make text item array 
+    $a_text_item = is_array($text_item) ? $text_item : array('single' => $text_item);
+
+    // decide which text to use
+    if ($nr == 1) {
+      $text = $a_text_item['single'];
+    }
+    else if ($nr > 0) {
+      $text = $a_text_item['multiple'];
+    }
+    else if ($nr == 0) {
+      if ($a_text_item['none'])
+        $text = $a_text_item['none'];
+      else if ($a_text_item['single'])
+        $text = $a_text_item['single'];
+      else if ($a_text_item['multiple'])
+        $text = $a_text_item['multiple'];
+    }
+
+    // default text is single
+    if ($text == '') {
+      $text = $a_text_item['single'];
+    }
+
+    // replace vars in text
+    if (is_array($attrib['vars'])) {
+      foreach ($attrib['vars'] as $var_key => $var_value)
+        $a_replace_vars[$var_key{0}=='$' ? 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);
+
+    // format output
+    if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst'])
+      return ucfirst($text);
+    else if ($attrib['uppercase'])
+      return strtoupper($text);
+    else if ($attrib['lowercase'])
+      return strtolower($text);
+
+    return $text;
+  }
+
+
+  /**
+   * Load a localization package
+   *
+   * @param string Language ID
+   */
+  public function load_language($lang = null)
+  {
+    $lang = $lang ? $this->language_prop($lang) : $_SESSION['language'];
+    
+    // load localized texts
+    if (empty($this->texts) || $lang != $_SESSION['language']) {
+      $this->texts = array();
+
+      // get english labels (these should be complete)
+      @include(INSTALL_PATH . 'program/localization/en_US/labels.inc');
+      @include(INSTALL_PATH . 'program/localization/en_US/messages.inc');
+
+      if (is_array($labels))
+        $this->texts = $labels;
+      if (is_array($messages))
+        $this->texts = array_merge($this->texts, $messages);
+
+      // include user language files
+      if ($lang != 'en' && is_dir(INSTALL_PATH . 'program/localization/' . $lang)) {
+        include_once(INSTALL_PATH . 'program/localization/' . $lang . '/labels.inc');
+        include_once(INSTALL_PATH . 'program/localization/' . $lang . '/messages.inc');
+
+        if (is_array($labels))
+          $this->texts = array_merge($this->texts, $labels);
+        if (is_array($messages))
+          $this->texts = array_merge($this->texts, $messages);
+      }
+      
+      $_SESSION['language'] = $lang;
+    }
+  }
+
+
+  /**
+   * Read directory program/localization and return a list of available languages
+   *
+   * @return array List of available localizations
+   */
+  public function list_languages()
+  {
+    static $sa_languages = array();
+
+    if (!sizeof($sa_languages)) {
+      @include(INSTALL_PATH . 'program/localization/index.inc');
+
+      if ($dh = @opendir(INSTALL_PATH . 'program/localization')) {
+        while (($name = readdir($dh)) !== false) {
+          if ($name{0}=='.' || !is_dir(INSTALL_PATH . 'program/localization/' . $name))
+            continue;
+
+          if ($label = $rcube_languages[$name])
+            $sa_languages[$name] = $label ? $label : $name;
+        }
+        closedir($dh);
+      }
+    }
+
+    return $sa_languages;
+  }
+
+
+  /**
+   * Check the auth hash sent by the client against the local session credentials
+   *
+   * @return boolean True if valid, False if not
+   */
+  function authenticate_session()
+  {
+    global $SESS_CLIENT_IP, $SESS_CHANGED;
+
+    // advanced session authentication
+    if ($this->config->get('double_auth')) {
+      $now = time();
+      $valid = ($_COOKIE['sessauth'] == $this->get_auth_hash(session_id(), $_SESSION['auth_time']) ||
+                $_COOKIE['sessauth'] == $this->get_auth_hash(session_id(), $_SESSION['last_auth']));
+
+      // renew auth cookie every 5 minutes (only for GET requests)
+      if (!$valid || ($_SERVER['REQUEST_METHOD']!='POST' && $now - $_SESSION['auth_time'] > 300)) {
+        $_SESSION['last_auth'] = $_SESSION['auth_time'];
+        $_SESSION['auth_time'] = $now;
+        setcookie('sessauth', $this->get_auth_hash(session_id(), $now));
+      }
+    }
+    else {
+      $valid = $this->config->get('ip_check') ? $_SERVER['REMOTE_ADDR'] == $SESS_CLIENT_IP : true;
+    }
+
+    // check session filetime
+    $lifetime = $this->config->get('session_lifetime');
+    if (!empty($lifetime) && isset($SESS_CHANGED) && $SESS_CHANGED + $lifetime*60 < time()) {
+      $valid = false;
+    }
+
+    return $valid;
+  }
+
+
+  /**
+   * Destroy session data and remove cookie
+   */
+  public function kill_session()
+  {
+    $user_prefs = $this->user->get_prefs();
+    
+    if ((isset($_SESSION['sort_col']) && $_SESSION['sort_col'] != $user_prefs['message_sort_col']) ||
+        (isset($_SESSION['sort_order']) && $_SESSION['sort_order'] != $user_prefs['message_sort_order'])) {
+      $this->user->save_prefs(array('message_sort_col' => $_SESSION['sort_col'], 'message_sort_order' => $_SESSION['sort_order']));
+    }
+
+    $_SESSION = array('language' => $USER->language, 'auth_time' => time(), 'temp' => true);
+    setcookie('sessauth', '-del-', time() - 60);
+    $this->user->reset();
+  }
+
+
+  /**
+   * Do server side actions on logout
+   */
+  public function logout_actions()
+  {
+    $config = $this->config->all();
+    
+    // on logout action we're not connected to imap server  
+    if (($config['logout_purge'] && !empty($config['trash_mbox'])) || $config['logout_expunge']) {
+      if (!$this->authenticate_session())
+        return;
+
+      $this->imap_init(true);
+    }
+
+    if ($config['logout_purge'] && !empty($config['trash_mbox'])) {
+      $this->imap->clear_mailbox($config['trash_mbox']);
+    }
+
+    if ($config['logout_expunge']) {
+      $this->imap->expunge('INBOX');
+    }
+  }
+
+
+  /**
+   * Function to be executed in script shutdown
+   * Registered with register_shutdown_function()
+   */
+  public function shutdown()
+  {
+    if (is_object($this->imap)) {
+      $this->imap->close();
+      $this->imap->write_cache();
+    }
+
+    if (is_object($this->contacts))
+      $this->contacts->close();
+
+    // before closing the database connection, write session data
+    if ($_SERVER['REMOTE_ADDR'])
+      session_write_close();
+  }
+  
+  
+  /**
+   * Create unique authorization hash
+   *
+   * @param string Session ID
+   * @param int Timestamp
+   * @return string The generated auth hash
+   */
+  private function get_auth_hash($sess_id, $ts)
+  {
+    $auth_string = sprintf('rcmail*sess%sR%s*Chk:%s;%s',
+      $sess_id,
+      $ts,
+      $this->config->get('ip_check') ? $_SERVER['REMOTE_ADDR'] : '***.***.***.***',
+      $_SERVER['HTTP_USER_AGENT']);
+
+    if (function_exists('sha1'))
+      return sha1($auth_string);
+    else
+      return md5($auth_string);
+  }
+
+  /**
+   * Encrypt IMAP password using DES encryption
+   *
+   * @param string Password to encrypt
+   * @return string Encryprted string
+   */
+  public function encrypt_passwd($pass)
+  {
+    if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
+      $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+      mcrypt_generic_init($td, $this->config->get_des_key(), $iv);
+      $cypher = mcrypt_generic($td, $pass);
+      mcrypt_generic_deinit($td);
+      mcrypt_module_close($td);
+    }
+    else if (function_exists('des')) {
+      $cypher = des($this->config->get_des_key(), $pass, 1, 0, NULL);
+    }
+    else {
+      $cypher = $pass;
+
+      raise_error(array(
+        'code' => 500,
+        'type' => 'php',
+        'file' => __FILE__,
+        'message' => "Could not convert encrypt password. Make sure Mcrypt is installed or lib/des.inc is available"
+        ), true, false);
+    }
+
+    return base64_encode($cypher);
+  }
+
+
+  /**
+   * Decrypt IMAP password using DES encryption
+   *
+   * @param string Encrypted password
+   * @return string Plain password
+   */
+  public function decrypt_passwd($cypher)
+  {
+    if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
+      $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+      mcrypt_generic_init($td, $this->config->get_des_key(), $iv);
+      $pass = mdecrypt_generic($td, base64_decode($cypher));
+      mcrypt_generic_deinit($td);
+      mcrypt_module_close($td);
+    }
+    else if (function_exists('des')) {
+      $pass = des($this->config->get_des_key(), base64_decode($cypher), 0, 0, NULL);
+    }
+    else {
+      $pass = base64_decode($cypher);
+    }
+
+    return preg_replace('/\x00/', '', $pass);
+  }
+
+}
+
+
diff --git a/program/include/rcmail_template.inc b/program/include/rcmail_template.inc
deleted file mode 100644 (file)
index 301b3f2..0000000
+++ /dev/null
@@ -1,948 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcmail_template.inc                                   |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Class to handle HTML page output using a skin template.             |
- |   Extends rcube_html_page class from rcube_html.inc                   |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id:  $
-
-*/
-
-
-/**
- * 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;
-  var $task = '';
-  var $framed = false;
-  var $ajax_call = false;
-  var $pagetitle = '';
-  var $env = array();
-  var $js_env = array();
-  var $js_commands = array();
-  var $object_handlers = array();
-
-
-  /**
-   * Constructor
-   *
-   * @param array Configuration array
-   * @param string Current task
-   */
-  function __construct(&$config, $task)
-  {
-    $this->task = $task;
-    $this->config = $config;
-    $this->ajax_call = !empty($_GET['_remote']) || !empty($_POST['_remote']);
-    
-    // add common javascripts
-    if (!$this->ajax_call)
-    {
-      $javascript = "var ".JS_OBJECT_NAME." = new rcube_webmail();";
-
-      // don't wait for page onload. Call init at the bottom of the page (delayed)
-      $javascript_foot = "if (window.call_init)\n call_init('".JS_OBJECT_NAME."');";
-
-      $this->add_script($javascript, 'head_top');
-      $this->add_script($javascript_foot, 'foot');
-      $this->scripts_path = 'program/js/';
-      $this->include_script('common.js');
-      $this->include_script('app.js');
-    }
-  }
-
-  /**
-   * PHP 4 compatibility
-   * @see rcmail_template::__construct()
-   */
-  function rcmail_template(&$config, $task)
-  {
-    $this->__construct($config, $task);
-  }
-  
-  
-  /**
-   * 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)
-  {
-    $this->env[$name] = $value;
-    if ($addtojs || isset($this->js_env[$name]))
-      $this->js_env[$name] = $value;
-  }
-
-
-  /**
-   * Set page title variable
-   */
-  function set_pagetitle($title)
-  {
-    $this->pagetitle = $title;
-  }
-
-
-  /**
-   * Register a template object handler
-   *
-   * @param string Object name
-   * @param string Function name to call
-   */
-  function add_handler($obj, $func)
-  {
-    $this->object_handlers[$obj] = $func;
-  }
-
-  /**
-   * Register a list of template object handlers
-   *
-   * @param array Hash array with object=>handler pairs
-   */
-  function add_handlers($arr)
-  {
-    $this->object_handlers = array_merge($this->object_handlers, $arr);
-  }
-
-  /**
-   * Register a GUI object to the client script
-   *
-   * @param string Object name
-   * @param string Object ID
-   */
-  function add_gui_object($obj, $id)
-  {
-    $this->add_script(JS_OBJECT_NAME.".gui_object('$obj', '$id');");
-  }
-
-
-  /**
-   * Call a client method
-   *
-   * @param string Method to call
-   * @param ... Additional arguments
-   */
-  function command()
-  {
-    $this->js_commands[] = func_get_args();
-  }
-
-
-  /**
-   * 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)
-  {
-    $this->command(
-      'display_message',
-      rcube_label(array('name' => $message, 'vars' => $vars)),
-      $type);
-  }
-
-
-  /**
-   * Delete all stored env variables and commands
-   */
-  function reset()
-  {
-    $this->env = array();
-    $this->js_env = array();
-    $this->js_commands = array();
-    $this->object_handlers = array();    
-    parent::reset();
-  }
-
-  /**
-   * Send the request output to the client.
-   * This will either parse a skin tempalte or send an AJAX response
-   *
-   * @param string  Template name
-   * @param boolean True if script should terminate (default)
-   */
-  function send($templ=null, $exit=true)
-  {
-    if ($this->ajax_call)
-      $this->remote_response('', !$exit);
-    else if ($templ != 'iframe')
-      $this->parse($templ, false);
-    else
-    {
-      $this->framed = $templ == 'iframe' ? true : $this->framed;
-      $this->write();
-    }
-    
-    if ($exit)
-      exit;
-  }
-
-
-  /**
-   * Send an AJAX response with executable JS code
-   * 
-   * @param string  Additional JS code
-   * @param boolean True if output buffer should be flushed
-   */
-  function remote_response($add='', $flush=false)
-  {
-    static $s_header_sent = FALSE;
-
-    if (!$s_header_sent)
-    {
-      $s_header_sent = TRUE;
-      send_nocacheing_headers();
-      header('Content-Type: application/x-javascript; charset='.RCMAIL_CHARSET);
-      print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n";
-    }
-    
-    // unset default env vars
-    unset($this->js_env['task'], $this->js_env['action'], $this->js_env['comm_path']);
-
-    // send response code
-    print rcube_charset_convert($this->get_js_commands() . $add, RCMAIL_CHARSET, $this->get_charset());
-
-    if ($flush)  // flush the output buffer
-      flush();
-  }
-  
-  
-  /**
-   * 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 ? ' }' : '');
-    $this->add_script($js, 'head_top');
-
-    // call super method
-    parent::write($template, $this->config['skin_path']);
-  }
-
-
-  /**
-   * Parse a specific skin template and deliver to stdout
-   *
-   * @param string  Template name
-   * @param boolean Exit script
-   */  
-  function parse($name='main', $exit=true)
-  {
-    $skin_path = $this->config['skin_path'];
-
-    // read template file
-    $templ = '';
-    $path = "$skin_path/templates/$name.html";
-
-    if($fp = @fopen($path, 'r'))
-    {
-      $templ = fread($fp, filesize($path));
-      fclose($fp);
-    }
-    else
-    {
-      raise_error(array(
-        'code' => 501,
-        'type' => 'php',
-        'line' => __LINE__,
-        'file' => __FILE__,
-        'message' => "Error loading template for '$name'"), TRUE, TRUE);
-      return FALSE;
-    }
-
-    // parse for specialtags
-    $output = $this->parse_xml($this->parse_conditions($templ));
-
-    // add debug console
-    if ($this->config['debug_level'] & 8)
-      $this->add_footer('<div style="position:absolute;top:5px;left:5px;width:400px;padding:0.2em;background:white;opacity:0.8;z-index:9000">
-        <a href="#toggle" onclick="con=document.getElementById(\'dbgconsole\');con.style.display=(con.style.display==\'none\'?\'block\':\'none\');return false">console</a>
-        <form action="/" name="debugform"><textarea name="console" id="dbgconsole" rows="20" cols="40" wrap="off" style="display:none;width:400px;border:none;font-size:x-small"></textarea></form></div>');
-
-    $this->write(trim($this->parse_with_globals($output)), $skin_path);
-
-    if ($exit)
-      exit;
-  }
-
-
-  /**
-   * Return executable javascript code for all registered commands
-   * @access private
-   */
-  function get_js_commands()
-  {
-    $out = '';
-    if (!$this->framed && !empty($this->js_env))
-      $out .= ($this->ajax_call ? 'this' : JS_OBJECT_NAME) . '.set_env('.json_serialize($this->js_env).");\n";
-    
-    // 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)
-      );
-
-    foreach ($this->js_commands as $i => $args)
-    {
-      $method = array_shift($args);
-      foreach ($args as $i => $arg)
-        $args[$i] = json_serialize($arg);
-
-      $parent = $this->framed || preg_match('/^parent\./', $method);
-      $out .= sprintf(
-        "%s.%s(%s);\n",
-        $this->ajax_call ? 'this' : ($parent ? 'parent.' : '') . JS_OBJECT_NAME,
-        preg_replace('/^parent\./', '', $method),
-        join(',', $args));
-    }
-    
-
-    
-    return $out;
-  }
-  
-  /**
-   * Make URLs starting with a slash point to skin directory
-   * @access private
-   */
-  function abs_url($str)
-  {
-    return preg_replace('/^\//', $this->config['skin_path'].'/', $str);
-  }
-
-
-
-  /*****  Template parsing methods  *****/
-  
-  /**
-   * Replace all strings ($varname)
-   * with the content of the according global variable.
-   * @access private
-   */
-  function parse_with_globals($input)
-  {
-    $GLOBALS['__comm_path'] = Q($GLOBALS['COMM_PATH']);
-    return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
-  }
-  
-  
-  /**
-   * Parse for conditional tags
-   * @access private
-   */
-  function parse_conditions($input)
-  {
-    if (($matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE)) && count($matches)==4)
-    {
-      if (preg_match('/^(else|endif)$/i', $matches[1]))
-        return $matches[0] . $this->parse_conditions($matches[3]);
-      else
-      {
-        $attrib = parse_attrib_string($matches[2]);
-        if (isset($attrib['condition']))
-        {
-          $condmet = $this->check_condition($attrib['condition']);
-          $submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE);
-
-          if ($condmet)
-            $result = $submatches[0] . ($submatches[1] != 'endif' ? preg_replace('/.*<roundcube:endif\s+[^>]+>/Uis', '', $submatches[3], 1) : $submatches[3]);
-          else
-            $result = "<roundcube:$submatches[1] $submatches[2]>" . $submatches[3];
-
-          return $matches[0] . $this->parse_conditions($result);
-        }
-        else
-        {
-          raise_error(array('code' => 500, 'type' => 'php', 'line' => __LINE__, 'file' => __FILE__,
-                            'message' => "Unable to parse conditional tag " . $matches[2]), TRUE, FALSE);
-        }
-      }
-    }
-
-    return $input;
-  }
-
-
-  /**
-   * Determines if a given condition is met
-   *
-   * @return True if condition is valid, False is not
-   * @access private
-   */
-  function check_condition($condition)
-  {
-    $condition = preg_replace(
-        array('/session:([a-z0-9_]+)/i', '/config:([a-z0-9_]+)/i', '/env:([a-z0-9_]+)/i', '/request:([a-z0-9_]+)/ie'),
-        array("\$_SESSION['\\1']", "\$this->config['\\1']", "\$this->env['\\1']", "get_input_value('\\1', RCUBE_INPUT_GPC)"),
-        $condition);
-
-    return @eval("return (".$condition.");");
-  }
-
-
-  /**
-   * Search for special tags in input and replace them
-   * with the appropriate content
-   *
-   * @param string Input string to parse
-   * @return Altered input string
-   * @access private
-   */
-  function parse_xml($input)
-  {
-    return preg_replace('/<roundcube:([-_a-z]+)\s+([^>]+)>/Uie', "\$this->xml_command('\\1', '\\2')", $input);
-  }
-
-
-  /**
-   * Convert a xml command tag into real content
-   *
-   * @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;
-
-    // empty output if required condition is not met
-    if (!empty($attrib['condition']) && !$this->check_condition($attrib['condition']))
-      return '';
-
-    // execute command
-    switch ($command)
-    {
-      // return a button
-      case 'button':
-        return $this->button($attrib);
-        break;
-
-      // show a label
-      case 'label':
-        if ($attrib['name'] || $attrib['command'])
-          return Q(rcube_label($attrib + array('vars' => array('product' => $this->config['product_name']))));
-        break;
-
-      // include a file 
-      case 'include':
-        $path = realpath($this->config['skin_path'].$attrib['file']);
-        if (filesize($path))
-        {
-          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;
-
-      // return code for a specific application object
-      case 'object':
-        $object = strtolower($attrib['name']);
-
-        // execute object handler function
-        if ($this->object_handlers[$object] && function_exists($this->object_handlers[$object]))
-          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'].' :: ' : '';
-
-          if (!empty($this->pagetitle))
-            $title .= $this->pagetitle;
-          else if ($task == 'login')
-            $title = rcube_label(array('name' => 'welcome', 'vars' => array('product' => $this->config['product_name'])));
-          else
-            $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;
-  }
-
-
-  /**
-   * Create and register a button
-   *
-   * @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;
-
-    // these commands can be called directly via url
-    $a_static_commands = array('compose', 'list');
-
-    $skin_path = $this->config['skin_path'];
-
-    if (!($attrib['command'] || $attrib['name'] || $attrib['onclick']))
-      return '';
-
-    // try to find out the button type
-    if ($attrib['type'])
-      $attrib['type'] = strtolower($attrib['type']);
-    else
-      $attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $attrib['imageact']) ? 'image' : 'link';
-
-    $command = $attrib['command'];
-
-    // take the button from the stack
-    if($attrib['name'] && $sa_buttons[$attrib['name']])
-      $attrib = $sa_buttons[$attrib['name']];
-
-    // add button to button stack
-    else if($attrib['image'] || $attrib['imageact'] || $attrib['imagepas'] || $attrib['class'])
-    {
-      if (!$attrib['name'])
-        $attrib['name'] = $command;
-
-      if (!$attrib['image'])
-        $attrib['image'] = $attrib['imagepas'] ? $attrib['imagepas'] : $attrib['imageact'];
-
-      $sa_buttons[$attrib['name']] = $attrib;
-    }
-
-    // get saved button for this command/name
-    else if ($command && $sa_buttons[$command])
-      $attrib = $sa_buttons[$command];
-
-    //else
-    //  return '';
-
-
-    // set border to 0 because of the link arround the button
-    if ($attrib['type']=='image' && !isset($attrib['border']))
-      $attrib['border'] = 0;
-
-    if (!$attrib['id'])
-      $attrib['id'] =  sprintf('rcmbtn%d', $s_button_count++);
-
-    // get localized text for labels and titles
-    if ($attrib['title'])
-      $attrib['title'] = Q(rcube_label($attrib['title']));
-    if ($attrib['label'])
-      $attrib['label'] = Q(rcube_label($attrib['label']));
-
-    if ($attrib['alt'])
-      $attrib['alt'] = Q(rcube_label($attrib['alt']));
-
-    // set title to alt attribute for IE browsers
-    if ($BROWSER['ie'] && $attrib['title'] && !$attrib['alt'])
-    {
-      $attrib['alt'] = $attrib['title'];
-      unset($attrib['title']);
-    }
-
-    // add empty alt attribute for XHTML compatibility
-    if (!isset($attrib['alt']))
-      $attrib['alt'] = '';
-
-
-    // register button in the system
-    if ($attrib['command'])
-    {
-      $this->add_script(sprintf(
-        "%s.register_button('%s', '%s', '%s', '%s', '%s', '%s');",
-        JS_OBJECT_NAME,
-        $command,
-        $attrib['id'],
-        $attrib['type'],
-        $attrib['imageact'] ? $skin_path.$attrib['imageact'] : $attrib['classact'],
-        $attrib['imagesel'] ? $skin_path.$attrib['imagesel'] : $attrib['classsel'],
-        $attrib['imageover'] ? $skin_path.$attrib['imageover'] : '')
-      );
-
-      // make valid href to specific buttons
-      if (in_array($attrib['command'], $MAIN_TASKS))
-        $attrib['href'] = Q(rcmail_url(null, null, $attrib['command']));
-      else if (in_array($attrib['command'], $a_static_commands))
-        $attrib['href'] = Q(rcmail_url($attrib['command']));
-    }
-
-    // overwrite attributes
-    if (!$attrib['href'])
-      $attrib['href'] = '#';
-
-    if ($command)
-      $attrib['onclick'] = sprintf("return %s.command('%s','%s',this)", JS_OBJECT_NAME, $command, $attrib['prop']);
-
-    if ($command && $attrib['imageover'])
-    {
-      $attrib['onmouseover'] = sprintf("return %s.button_over('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
-      $attrib['onmouseout'] = sprintf("return %s.button_out('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
-    }
-
-    if ($command && $attrib['imagesel'])
-    {
-      $attrib['onmousedown'] = sprintf("return %s.button_sel('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
-      $attrib['onmouseup'] = sprintf("return %s.button_out('%s','%s')", JS_OBJECT_NAME, $command, $attrib['id']);
-    }
-
-    $out = '';
-
-    // generate image tag
-    if ($attrib['type']=='image')
-    {
-      $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'width', 'height', 'border', 'hspace', 'vspace', 'align', 'alt'));
-      $img_tag = sprintf('<img src="%%s"%s />', $attrib_str);
-      $btn_content = sprintf($img_tag, $skin_path.$attrib['image']);
-      if ($attrib['label'])
-        $btn_content .= ' '.$attrib['label'];
-
-      $link_attrib = array('href', 'onclick', 'onmouseover', 'onmouseout', 'onmousedown', 'onmouseup', 'title');
-    }
-    else if ($attrib['type']=='link')
-    {
-      $btn_content = $attrib['label'] ? $attrib['label'] : $attrib['command'];
-      $link_attrib = array('href', 'onclick', 'title', 'id', 'class', 'style');
-    }
-    else if ($attrib['type']=='input')
-    {
-      $attrib['type'] = 'button';
-
-      if ($attrib['label'])
-        $attrib['value'] = $attrib['label'];
-
-      $attrib_str = create_attrib_string($attrib, array('type', 'value', 'onclick', 'id', 'class', 'style'));
-      $out = sprintf('<input%s disabled="disabled" />', $attrib_str);
-    }
-
-    // generate html code for button
-    if ($btn_content)
-    {
-      $attrib_str = create_attrib_string($attrib, $link_attrib);
-      $out = sprintf('<a%s>%s</a>', $attrib_str, $btn_content);
-    }
-
-    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 $USER;
-  static $s_username;
-
-  // alread fetched  
-  if (!empty($s_username))
-    return $s_username;
-
-  if ($sql_arr = $USER->get_identity())
-    $s_username = $sql_arr['email'];
-  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(get_input_value('_host', RCUBE_INPUT_POST)) : null;
-    }
-  else if (!strlen($CONFIG['default_host']))
-    {
-    $input_host = new textfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
-    $fields['host'] = $input_host->show(get_input_value('_host', RCUBE_INPUT_POST));
-    }
-
-  $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;
-  } 
-
-
-?>
diff --git a/program/include/rcube_browser.php b/program/include/rcube_browser.php
new file mode 100644 (file)
index 0000000..af393d6
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_browser.php                                     |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2007-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Class representing the client browser's properties                  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_browser.php 328 2006-08-30 17:41:21Z thomasb $
+
+*/
+
+/** 
+ * rcube_browser
+ * 
+ * Provide details about the client's browser based on the User-Agent header
+ *
+ * @package Core
+ */
+class rcube_browser
+{
+    function __construct()
+    {
+        $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
+
+        $this->ver = 0;
+        $this->win = stristr($HTTP_USER_AGENT, 'win');
+        $this->mac = stristr($HTTP_USER_AGENT, 'mac');
+        $this->linux = stristr($HTTP_USER_AGENT, 'linux');
+        $this->unix  = stristr($HTTP_USER_AGENT, 'unix');
+
+        $this->ns4 = stristr($HTTP_USER_AGENT, 'mozilla/4') && !stristr($HTTP_USER_AGENT, 'msie');
+        $this->ns  = ($this->ns4 || stristr($HTTP_USER_AGENT, 'netscape'));
+        $this->ie  = stristr($HTTP_USER_AGENT, 'msie');
+        $this->mz  = stristr($HTTP_USER_AGENT, 'mozilla/5');
+        $this->opera = stristr($HTTP_USER_AGENT, 'opera');
+        $this->safari = stristr($HTTP_USER_AGENT, 'safari');
+
+        if ($this->ns) {
+            $test = eregi("mozilla\/([0-9\.]+)", $HTTP_USER_AGENT, $regs);
+            $this->ver = $test ? (float)$regs[1] : 0;
+        }
+        if ($this->mz) {
+            $test = ereg("rv:([0-9\.]+)", $HTTP_USER_AGENT, $regs);
+            $this->ver = $test ? (float)$regs[1] : 0;
+        }
+        if($this->ie) {
+            $test = eregi("msie ([0-9\.]+)", $HTTP_USER_AGENT, $regs);
+            $this->ver = $test ? (float)$regs[1] : 0;
+        }
+        if ($this->opera) {
+            $test = eregi("opera ([0-9\.]+)", $HTTP_USER_AGENT, $regs);
+            $this->ver = $test ? (float)$regs[1] : 0;
+        }
+
+        if (eregi(" ([a-z]{2})-([a-z]{2})", $HTTP_USER_AGENT, $regs))
+            $this->lang =  $regs[1];
+        else
+            $this->lang =  'en';
+
+        $this->dom = ($this->mz || $this->safari || ($this->ie && $this->ver>=5) || ($this->opera && $this->ver>=7));
+        $this->pngalpha = $this->mz || $this->safari || ($this->ie && $this->ver>=5.5) ||
+            ($this->ie && $this->ver>=5 && $this->mac) || ($this->opera && $this->ver>=7) ? true : false;
+    }
+  }
+
diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php
new file mode 100644 (file)
index 0000000..8e956de
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_config.php                                      |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Class to read configuration settings                                |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: $
+
+*/
+
+/**
+ * Configuration class for RoundCube
+ *
+ * @package Core
+ */
+class rcube_config
+{
+  private $prop = array();
+
+
+  /**
+   * Object constructor
+   */
+  public function __construct()
+  {
+    $this->load();
+  }
+
+
+  /**
+   * Load config from local config file
+   *
+   * @todo Remove global $CONFIG
+   */
+  private function load()
+  {
+    // start output buffering, we don't need any output yet, 
+    // it'll be cleared after reading of config files, etc.
+    ob_start();
+    
+    // load main config file
+    include_once(INSTALL_PATH . 'config/main.inc.php');
+    $this->prop = (array)$rcmail_config;
+
+    // load database config
+    include_once(INSTALL_PATH . 'config/db.inc.php');
+    $this->prop += (array)$rcmail_config;
+    
+    // load host-specific configuration
+    $this->load_host_config();
+
+    // fix paths
+    $this->prop['skin_path'] = $this->prop['skin_path'] ? unslashify($this->prop['skin_path']) : 'skins/default';
+    $this->prop['log_dir'] = $this->prop['log_dir'] ? unslashify($this->prop['log_dir']) : INSTALL_PATH . 'logs';
+    
+    // handle aliases
+    if (isset($this->prop['locale_string']) && empty($this->prop['language']))
+      $this->prop['language'] = $this->prop['locale_string'];
+
+    // set PHP error logging according to config
+    if ($this->prop['debug_level'] & 1) {
+      ini_set('log_errors', 1);
+      ini_set('error_log', $this->prop['log_dir'] . '/errors');
+    }
+    if ($this->prop['debug_level'] & 4) {
+      ini_set('display_errors', 1);
+    }
+    else {
+      ini_set('display_errors', 0);
+    }
+    
+    // clear output buffer
+    ob_end_clean();
+
+    // export config data
+    $GLOBALS['CONFIG'] = &$this->prop;
+  }
+  
+  
+  /**
+   * Load a host-specific config file if configured
+   * This will merge the host specific configuration with the given one
+   */
+  private function load_host_config()
+  {
+    $fname = null;
+
+    if (is_array($this->prop['include_host_config'])) {
+      $fname = $this->prop['include_host_config'][$_SERVER['HTTP_HOST']];
+    }
+    else if (!empty($this->prop['include_host_config'])) {
+      $fname = preg_replace('/[^a-z0-9\.\-_]/i', '', $_SERVER['HTTP_HOST']) . '.inc.php';
+    }
+
+    if ($fname && is_file(INSTALL_PATH . 'config/' . $fname)) {
+      include(INSTALL_PATH . 'config/' . $fname);
+      $this->prop = array_merge($this->prop, (array)$rcmail_config);
+    }
+  }
+  
+  
+  /**
+   * Getter for a specific config parameter
+   *
+   * @param  string Parameter name
+   * @param  mixed  Default value if not set
+   * @return mixed  The requested config value
+   */
+  public function get($name, $def = null)
+  {
+    return isset($this->prop[$name]) ? $this->prop[$name] : $def;
+  }
+  
+  
+  /**
+   * Setter for a config parameter
+   *
+   * @param string Parameter name
+   * @param mixed  Parameter value
+   */
+  public function set($name, $value)
+  {
+    $this->prop[$name] = $value;
+  }
+  
+  
+  /**
+   * Override config options with the given values (eg. user prefs)
+   *
+   * @param array Hash array with config props to merge over
+   */
+  public function merge($prefs)
+  {
+    $this->prop = array_merge($this->prop, $prefs);
+  }
+  
+  
+  /**
+   * Getter for all config options
+   *
+   * @return array  Hash array containg all config properties
+   */
+  public function all()
+  {
+    return $this->prop;
+  }
+  
+  
+  /**
+   * Return a 24 byte key for the DES encryption
+   *
+   * @return string DES encryption key
+   */
+  public function get_des_key()
+  {
+    $key = !empty($this->prop['des_key']) ? $this->prop['des_key'] : 'rcmail?24BitPwDkeyF**ECB';
+    $len = strlen($key);
+
+    // make sure the key is exactly 24 chars long
+    if ($len<24)
+      $key .= str_repeat('_', 24-$len);
+    else if ($len>24)
+      substr($key, 0, 24);
+
+    return $key;
+  }
+  
+  
+}
+
diff --git a/program/include/rcube_contacts.inc b/program/include/rcube_contacts.inc
deleted file mode 100644 (file)
index 6a48656..0000000
+++ /dev/null
@@ -1,458 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_contacts.inc                                    |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Interface to the local address book database                        |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: rcube_contacts.inc 328 2006-08-30 17:41:21Z thomasb $
-
-*/
-
-
-/**
- * Model class for the local address book database
- *
- * @package Addressbook
- */
-class rcube_contacts
-{
-  var $db = null;
-  var $db_name = '';
-  var $user_id = 0;
-  var $filter = null;
-  var $result = null;
-  var $search_fields;
-  var $search_string;
-  var $table_cols = array('name', 'email', 'firstname', 'surname');
-  
-  /** public properties */
-  var $primary_key = 'contact_id';
-  var $readonly = false;
-  var $list_page = 1;
-  var $page_size = 10;
-  var $ready = false;
-
-  
-  /**
-   * Object constructor
-   *
-   * @param object  Instance of the rcube_db class
-   * @param integer User-ID
-   */
-  function __construct($dbconn, $user)
-  {
-    $this->db = $dbconn;
-    $this->db_name = get_table_name('contacts');
-    $this->user_id = $user;
-    $this->ready = $this->db && !$this->db->is_error();
-  }
-
-  /**
-   * PHP 4 object constructor
-   *
-   * @see rcube_contacts::__construct()
-   */
-  function rcube_contacts($dbconn, $user)
-  {
-    $this->__construct($dbconn, $user);
-  }
-
-
-  /**
-   * Set internal list page
-   *
-   * @param  number  Page number to list
-   * @access public
-   */
-  function set_page($page)
-  {
-    $this->list_page = (int)$page;
-  }
-
-
-  /**
-   * Set internal page size
-   *
-   * @param  number  Number of messages to display on one page
-   * @access public
-   */
-  function set_pagesize($size)
-  {
-    $this->page_size = (int)$size;
-  }
-
-
-  /**
-   * Save a search string for future listings
-   *
-   * @param  string SQL params to use in listing method
-   */
-  function set_search_set($filter)
-  {
-    $this->filter = $filter;
-  }
-  
-  
-  /**
-   * Getter for saved search properties
-   *
-   * @return mixed Search properties used by this class
-   */
-  function get_search_set()
-  {
-    return $this->filter;
-  }
-
-
-  /**
-   * Reset all saved results and search parameters
-   */
-  function reset()
-  {
-    $this->result = null;
-    $this->filter = null;
-    $this->search_fields = null;
-    $this->search_string = null;
-  }
-  
-  
-  /**
-   * 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)
-  {
-    // count contacts for this user
-    $this->result = $this->count();
-    $sql_result = NULL;
-
-    // get contacts from DB
-    if ($this->result->count)
-    {
-      $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first;
-      $length = $subset != 0 ? abs($subset) : $this->page_size;
-      
-      $sql_result = $this->db->limitquery(
-        "SELECT * FROM ".$this->db_name."
-         WHERE  del<>1
-         AND    user_id=?" .
-        ($this->filter ? " AND (".$this->filter.")" : "") .
-        " ORDER BY name",
-        $start_row,
-        $length,
-        $this->user_id);
-    }
-    
-    while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result)))
-    {
-      $sql_arr['ID'] = $sql_arr[$this->primary_key];
-      // make sure we have a name to display
-      if (empty($sql_arr['name']))
-        $sql_arr['name'] = $sql_arr['email'];
-      $this->result->add($sql_arr);
-    }
-    
-    return $this->result;
-  }
-
-
-  /**
-   * Search contacts
-   *
-   * @param array   List of fields to search in
-   * @param string  Search value
-   * @param boolean True if results are requested, False if count only
-   * @return Indexed list of contact records and 'count' value
-   */
-  function search($fields, $value, $strict=false, $select=true)
-  {
-    if (!is_array($fields))
-      $fields = array($fields);
-      
-    $add_where = array();
-    foreach ($fields as $col)
-    {
-      if ($col == 'ID' || $col == $this->primary_key)
-      {
-        $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%");
-    }
-    
-    if (!empty($add_where))
-    {
-      $this->set_search_set(join(' OR ', $add_where));
-      if ($select)
-        $this->list_records();
-      else
-        $this->result = $this->count();
-    }
-   
-    return $this->result; 
-  }
-
-
-  /**
-   * Count number of available contacts in database
-   *
-   * @return Result array with values for 'count' and 'first'
-   */
-  function count()
-  {
-    // count contacts for this user
-    $sql_result = $this->db->query(
-      "SELECT COUNT(contact_id) AS rows
-       FROM ".$this->db_name."
-       WHERE  del<>1
-       AND    user_id=?".
-       ($this->filter ? " AND (".$this->filter.")" : ""),
-      $this->user_id);
-
-    $sql_arr = $this->db->fetch_assoc($sql_result);
-    return new rcube_result_set($sql_arr['rows'], ($this->list_page-1) * $this->page_size);;
-  }
-
-
-  /**
-   * Return the last result set
-   *
-   * @return Result array or NULL if nothing selected yet
-   */
-  function get_result($as_res=true)
-  {
-    return $this->result;
-  }
-  
-  
-  /**
-   * Get a specific contact record
-   *
-   * @param mixed record identifier(s)
-   * @return Result object with all record fields or False if not found
-   */
-  function get_record($id, $assoc=false)
-  {
-    // return cached result
-    if ($this->result && ($first = $this->result->first()) && $first[$this->primary_key] == $id)
-      return $assoc ? $first : $this->result;
-      
-    $this->db->query(
-      "SELECT * FROM ".$this->db_name."
-       WHERE  contact_id=?
-       AND    user_id=?
-       AND    del<>1",
-      $id,
-      $this->user_id);
-
-    if ($sql_arr = $this->db->fetch_assoc())
-    {
-      $sql_arr['ID'] = $sql_arr[$this->primary_key];
-      $this->result = new rcube_result_set(1);
-      $this->result->add($sql_arr);
-    }
-
-    return $assoc && $sql_arr ? $sql_arr : $this->result;
-  }
-  
-  
-  /**
-   * Create a new contact record
-   *
-   * @param array Assoziative array with save data
-   * @return The created record ID on success, False on error
-   */
-  function insert($save_data, $check=false)
-  {
-    if (is_object($save_data) && is_a($save_data, rcube_result_set))
-      return $this->insert_recset($save_data, $check);
-
-    $insert_id = $existing = false;
-
-    if ($check)
-      $existing = $this->search('email', $save_data['email'], true, false);
-
-    $a_insert_cols = $a_insert_values = array();
-    foreach ($this->table_cols as $col)
-      if (isset($save_data[$col]))
-      {
-        $a_insert_cols[] = $this->db->quoteIdentifier($col);
-        $a_insert_values[] = $this->db->quote($save_data[$col]);
-      }
-    
-    if (!$existing->count && !empty($a_insert_cols))
-    {
-      $this->db->query(
-        "INSERT INTO ".$this->db_name."
-         (user_id, changed, del, ".join(', ', $a_insert_cols).")
-         VALUES (?, ".$this->db->now().", 0, ".join(', ', $a_insert_values).")",
-        $this->user_id);
-        
-      $insert_id = $this->db->insert_id(get_sequence_name('contacts'));
-    }
-    
-    return $insert_id;
-  }
-
-
-  /**
-   * Insert new contacts for each row in set
-   */
-  function insert_recset($result, $check=false)
-  {
-    $ids = array();
-    while ($row = $result->next())
-    {
-      if ($insert = $this->insert($row, $check))
-        $ids[] = $insert;
-    }
-    return $ids;
-  }
-  
-  
-  /**
-   * Update a specific contact record
-   *
-   * @param mixed Record identifier
-   * @param array Assoziative array with save data
-   * @return True on success, False on error
-   */
-  function update($id, $save_cols)
-  {
-    $updated = false;
-    $write_sql = array();
-    foreach ($this->table_cols as $col)
-      if (isset($save_cols[$col]))
-        $write_sql[] = sprintf("%s=%s", $this->db->quoteIdentifier($col), $this->db->quote($save_cols[$col]));
-
-    if (!empty($write_sql))
-    {
-      $this->db->query(
-        "UPDATE ".$this->db_name."
-         SET    changed=".$this->db->now().", ".join(', ', $write_sql)."
-         WHERE  contact_id=?
-         AND    user_id=?
-         AND    del<>1",
-        $id,
-        $this->user_id);
-
-      $updated = $this->db->affected_rows();
-    }
-    
-    return $updated;
-  }
-  
-  
-  /**
-   * Mark one or more contact records as deleted
-   *
-   * @param array  Record identifiers
-   */
-  function delete($ids)
-  {
-    if (is_array($ids))
-      $ids = join(',', $ids);
-
-    $this->db->query(
-      "UPDATE ".$this->db_name."
-       SET    del=1
-       WHERE  user_id=?
-       AND    contact_id IN (".$ids.")",
-      $this->user_id);
-
-    return $this->db->affected_rows();
-  }
-  
-  
-  /**
-   * Remove all records from the database
-   */
-  function delete_all()
-  {
-    if (is_array($ids))
-      $ids = join(',', $ids);
-
-    $this->db->query("DELETE FROM {$this->db_name} WHERE  user_id=?", $this->user_id);
-    return $this->db->affected_rows();
-  }
-
-}
-
-
-/**
- * RoundCube result set class.
- * Representing an address directory result set.
- */
-class rcube_result_set
-{
-  var $count = 0;
-  var $first = 0;
-  var $current = 0;
-  var $records = array();
-  
-  function __construct($c=0, $f=0)
-  {
-    $this->count = (int)$c;
-    $this->first = (int)$f;
-  }
-  
-  function rcube_result_set($c=0, $f=0)
-  {
-    $this->__construct($c, $f);
-  }
-  
-  function add($rec)
-  {
-    $this->records[] = $rec;
-  }
-  
-  function iterate()
-  {
-    return $this->records[$this->current++];
-  }
-  
-  function first()
-  {
-    $this->current = 0;
-    return $this->records[$this->current++];
-  }
-  
-  // alias
-  function next()
-  {
-    return $this->iterate();
-  }
-  
-  function seek($i)
-  {
-    $this->current = $i;
-  }
-  
-}
-
-
-?>
\ No newline at end of file
diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php
new file mode 100644 (file)
index 0000000..913f04f
--- /dev/null
@@ -0,0 +1,400 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_contacts.php                                    |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2006-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Interface to the local address book database                        |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_contacts.inc 328 2006-08-30 17:41:21Z thomasb $
+
+*/
+
+
+/**
+ * Model class for the local address book database
+ *
+ * @package Addressbook
+ */
+class rcube_contacts
+{
+  var $db = null;
+  var $db_name = '';
+  var $user_id = 0;
+  var $filter = null;
+  var $result = null;
+  var $search_fields;
+  var $search_string;
+  var $table_cols = array('name', 'email', 'firstname', 'surname');
+  
+  /** public properties */
+  var $primary_key = 'contact_id';
+  var $readonly = false;
+  var $list_page = 1;
+  var $page_size = 10;
+  var $ready = false;
+
+  
+  /**
+   * Object constructor
+   *
+   * @param object  Instance of the rcube_db class
+   * @param integer User-ID
+   */
+  function __construct($dbconn, $user)
+  {
+    $this->db = $dbconn;
+    $this->db_name = get_table_name('contacts');
+    $this->user_id = $user;
+    $this->ready = $this->db && !$this->db->is_error();
+  }
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see rcube_contacts::__construct()
+   */
+  function rcube_contacts($dbconn, $user)
+  {
+    $this->__construct($dbconn, $user);
+  }
+
+
+  /**
+   * Set internal list page
+   *
+   * @param  number  Page number to list
+   * @access public
+   */
+  function set_page($page)
+  {
+    $this->list_page = (int)$page;
+  }
+
+
+  /**
+   * Set internal page size
+   *
+   * @param  number  Number of messages to display on one page
+   * @access public
+   */
+  function set_pagesize($size)
+  {
+    $this->page_size = (int)$size;
+  }
+
+
+  /**
+   * Save a search string for future listings
+   *
+   * @param  string SQL params to use in listing method
+   */
+  function set_search_set($filter)
+  {
+    $this->filter = $filter;
+  }
+  
+  
+  /**
+   * Getter for saved search properties
+   *
+   * @return mixed Search properties used by this class
+   */
+  function get_search_set()
+  {
+    return $this->filter;
+  }
+
+
+  /**
+   * Reset all saved results and search parameters
+   */
+  function reset()
+  {
+    $this->result = null;
+    $this->filter = null;
+    $this->search_fields = null;
+    $this->search_string = null;
+  }
+  
+  
+  /**
+   * 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)
+  {
+    // count contacts for this user
+    $this->result = $this->count();
+    $sql_result = NULL;
+
+    // get contacts from DB
+    if ($this->result->count)
+    {
+      $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first;
+      $length = $subset != 0 ? abs($subset) : $this->page_size;
+      
+      $sql_result = $this->db->limitquery(
+        "SELECT * FROM ".$this->db_name."
+         WHERE  del<>1
+         AND    user_id=?" .
+        ($this->filter ? " AND (".$this->filter.")" : "") .
+        " ORDER BY name",
+        $start_row,
+        $length,
+        $this->user_id);
+    }
+    
+    while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result)))
+    {
+      $sql_arr['ID'] = $sql_arr[$this->primary_key];
+      // make sure we have a name to display
+      if (empty($sql_arr['name']))
+        $sql_arr['name'] = $sql_arr['email'];
+      $this->result->add($sql_arr);
+    }
+    
+    return $this->result;
+  }
+
+
+  /**
+   * Search contacts
+   *
+   * @param array   List of fields to search in
+   * @param string  Search value
+   * @param boolean True if results are requested, False if count only
+   * @return Indexed list of contact records and 'count' value
+   */
+  function search($fields, $value, $strict=false, $select=true)
+  {
+    if (!is_array($fields))
+      $fields = array($fields);
+      
+    $add_where = array();
+    foreach ($fields as $col)
+    {
+      if ($col == 'ID' || $col == $this->primary_key)
+      {
+        $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%");
+    }
+    
+    if (!empty($add_where))
+    {
+      $this->set_search_set(join(' OR ', $add_where));
+      if ($select)
+        $this->list_records();
+      else
+        $this->result = $this->count();
+    }
+   
+    return $this->result; 
+  }
+
+
+  /**
+   * Count number of available contacts in database
+   *
+   * @return Result array with values for 'count' and 'first'
+   */
+  function count()
+  {
+    // count contacts for this user
+    $sql_result = $this->db->query(
+      "SELECT COUNT(contact_id) AS rows
+       FROM ".$this->db_name."
+       WHERE  del<>1
+       AND    user_id=?".
+       ($this->filter ? " AND (".$this->filter.")" : ""),
+      $this->user_id);
+
+    $sql_arr = $this->db->fetch_assoc($sql_result);
+    return new rcube_result_set($sql_arr['rows'], ($this->list_page-1) * $this->page_size);;
+  }
+
+
+  /**
+   * Return the last result set
+   *
+   * @return Result array or NULL if nothing selected yet
+   */
+  function get_result($as_res=true)
+  {
+    return $this->result;
+  }
+  
+  
+  /**
+   * Get a specific contact record
+   *
+   * @param mixed record identifier(s)
+   * @return Result object with all record fields or False if not found
+   */
+  function get_record($id, $assoc=false)
+  {
+    // return cached result
+    if ($this->result && ($first = $this->result->first()) && $first[$this->primary_key] == $id)
+      return $assoc ? $first : $this->result;
+      
+    $this->db->query(
+      "SELECT * FROM ".$this->db_name."
+       WHERE  contact_id=?
+       AND    user_id=?
+       AND    del<>1",
+      $id,
+      $this->user_id);
+
+    if ($sql_arr = $this->db->fetch_assoc())
+    {
+      $sql_arr['ID'] = $sql_arr[$this->primary_key];
+      $this->result = new rcube_result_set(1);
+      $this->result->add($sql_arr);
+    }
+
+    return $assoc && $sql_arr ? $sql_arr : $this->result;
+  }
+  
+  
+  /**
+   * Create a new contact record
+   *
+   * @param array Assoziative array with save data
+   * @return The created record ID on success, False on error
+   */
+  function insert($save_data, $check=false)
+  {
+    if (is_object($save_data) && is_a($save_data, rcube_result_set))
+      return $this->insert_recset($save_data, $check);
+
+    $insert_id = $existing = false;
+
+    if ($check)
+      $existing = $this->search('email', $save_data['email'], true, false);
+
+    $a_insert_cols = $a_insert_values = array();
+    foreach ($this->table_cols as $col)
+      if (isset($save_data[$col]))
+      {
+        $a_insert_cols[] = $this->db->quoteIdentifier($col);
+        $a_insert_values[] = $this->db->quote($save_data[$col]);
+      }
+    
+    if (!$existing->count && !empty($a_insert_cols))
+    {
+      $this->db->query(
+        "INSERT INTO ".$this->db_name."
+         (user_id, changed, del, ".join(', ', $a_insert_cols).")
+         VALUES (?, ".$this->db->now().", 0, ".join(', ', $a_insert_values).")",
+        $this->user_id);
+        
+      $insert_id = $this->db->insert_id(get_sequence_name('contacts'));
+    }
+    
+    return $insert_id;
+  }
+
+
+  /**
+   * Insert new contacts for each row in set
+   */
+  function insert_recset($result, $check=false)
+  {
+    $ids = array();
+    while ($row = $result->next())
+    {
+      if ($insert = $this->insert($row, $check))
+        $ids[] = $insert;
+    }
+    return $ids;
+  }
+  
+  
+  /**
+   * Update a specific contact record
+   *
+   * @param mixed Record identifier
+   * @param array Assoziative array with save data
+   * @return True on success, False on error
+   */
+  function update($id, $save_cols)
+  {
+    $updated = false;
+    $write_sql = array();
+    foreach ($this->table_cols as $col)
+      if (isset($save_cols[$col]))
+        $write_sql[] = sprintf("%s=%s", $this->db->quoteIdentifier($col), $this->db->quote($save_cols[$col]));
+
+    if (!empty($write_sql))
+    {
+      $this->db->query(
+        "UPDATE ".$this->db_name."
+         SET    changed=".$this->db->now().", ".join(', ', $write_sql)."
+         WHERE  contact_id=?
+         AND    user_id=?
+         AND    del<>1",
+        $id,
+        $this->user_id);
+
+      $updated = $this->db->affected_rows();
+    }
+    
+    return $updated;
+  }
+  
+  
+  /**
+   * Mark one or more contact records as deleted
+   *
+   * @param array  Record identifiers
+   */
+  function delete($ids)
+  {
+    if (is_array($ids))
+      $ids = join(',', $ids);
+
+    $this->db->query(
+      "UPDATE ".$this->db_name."
+       SET    del=1
+       WHERE  user_id=?
+       AND    contact_id IN (".$ids.")",
+      $this->user_id);
+
+    return $this->db->affected_rows();
+  }
+  
+  
+  /**
+   * Remove all records from the database
+   */
+  function delete_all()
+  {
+    $this->db->query("DELETE FROM {$this->db_name} WHERE user_id=?", $this->user_id);
+    return $this->db->affected_rows();
+  }
+
+}
diff --git a/program/include/rcube_db.inc b/program/include/rcube_db.inc
deleted file mode 100644 (file)
index c84dd84..0000000
+++ /dev/null
@@ -1,608 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_db.inc                                          |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   PEAR:DB wrapper class that implements PEAR DB functions             |
- |   See http://pear.php.net/package/DB                                  |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: David Saez Padros <david@ols.es>                              |
- |         Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: rcube_db.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-
-/**
- * Obtain the PEAR::DB class that is used for abstraction
- */
-require_once 'DB.php';
-
-/**
- * Database independent query interface
- *
- * This is a wrapper for the PEAR::DB class
- *
- * @package    Database
- * @author     David Saez Padros <david@ols.es>
- * @author     Thomas Bruederli <roundcube@gmail.com>
- * @version    1.17
- * @link       http://pear.php.net/package/DB
- */
-class rcube_db
-  {
-  var $db_dsnw;               // DSN for write operations
-  var $db_dsnr;               // DSN for read operations
-  var $db_connected = false;  // Already connected ?
-  var $db_mode = '';          // Connection mode
-  var $db_handle = 0;         // Connection handle
-  var $db_pconn = false;      // Use persistent connections
-  var $db_error = false;
-  var $db_error_msg = '';
-
-  var $a_query_results = array('dummy');
-  var $last_res_id = 0;
-
-
-  /**
-   * Object constructor
-   *
-   * @param  string  DSN for read/write operations
-   * @param  string  Optional DSN for read only operations
-   */
-  function __construct($db_dsnw, $db_dsnr='', $pconn=false)
-    {
-    if ($db_dsnr=='')
-      $db_dsnr=$db_dsnw;
-        
-    $this->db_dsnw = $db_dsnw;
-    $this->db_dsnr = $db_dsnr;
-    $this->db_pconn = $pconn;
-        
-    $dsn_array = DB::parseDSN($db_dsnw);
-    $this->db_provider = $dsn_array['phptype'];        
-    }
-
-
-  /**
-   * PHP 4 object constructor
-   *
-   * @see  rcube_db::__construct
-   */
-  function rcube_db($db_dsnw, $db_dsnr='', $pconn=false)
-    {
-    $this->__construct($db_dsnw, $db_dsnr, $pconn);
-    }
-
-
-  /**
-   * Connect to specific database
-   *
-   * @param  string  DSN for DB connections
-   * @return object  PEAR database handle
-   * @access private
-   */
-  function dsn_connect($dsn)
-    {
-    // Use persistent connections if available
-    $dbh = DB::connect($dsn, array('persistent' => $this->db_pconn));
-        
-    if (DB::isError($dbh))
-      {
-      $this->db_error = TRUE;
-      $this->db_error_msg = $dbh->getMessage();
-
-      raise_error(array('code' => 603, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => $this->db_error_msg), TRUE, FALSE);
-                        
-      return FALSE;
-      }
-
-    else if ($this->db_provider=='sqlite')
-      {
-      $dsn_array = DB::parseDSN($dsn);
-      if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
-        $this->_sqlite_create_database($dbh, $this->sqlite_initials);
-      }
-        
-    return $dbh;
-    }
-
-
-  /**
-   * Connect to appropiate databse
-   * depending on the operation
-   *
-   * @param  string  Connection mode (r|w)
-   * @access public
-   */
-  function db_connect($mode)
-    {
-    $this->db_mode = $mode;
-
-    // Already connected
-    if ($this->db_connected)
-      {
-      // no replication, current connection is ok
-      if ($this->db_dsnw==$this->db_dsnr)
-        return;
-            
-      // connected to master, current connection is ok
-      if ($this->db_mode=='w')
-        return;
-
-      // Same mode, current connection is ok
-      if ($this->db_mode==$mode)
-        return;
-      }
-     
-    if ($mode=='r')
-      $dsn = $this->db_dsnr;
-    else
-      $dsn = $this->db_dsnw;
-
-    $this->db_handle = $this->dsn_connect($dsn);
-    $this->db_connected = $this->db_handle ? TRUE : FALSE;
-    }
-
-
-  /**
-   * Activate/deactivate debug mode
-   * (not implemented)
-   */
-  function set_debug($dbg = true)
-  {
-    
-  }
-
-
-  /**
-   * Getter for error state
-   *
-   * @param  boolean  True on error
-   */
-  function is_error()
-    {
-    return $this->db_error ? $this->db_error_msg : FALSE;
-    }
-
-
-  /**
-   * Execute a SQL query
-   *
-   * @param  string  SQL query to execute
-   * @param  mixed   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access public
-   */
-  function query()
-    {
-    $params = func_get_args();
-    $query = array_shift($params);
-
-    return $this->_query($query, 0, 0, $params);
-    }
-
-
-  /**
-   * Execute a SQL query with limits
-   *
-   * @param  string  SQL query to execute
-   * @param  number  Offset for LIMIT statement
-   * @param  number  Number of rows for LIMIT statement
-   * @param  mixed   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access public
-   */
-  function limitquery()
-    {
-    $params = func_get_args();
-    $query = array_shift($params);
-    $offset = array_shift($params);
-    $numrows = array_shift($params);
-               
-    return $this->_query($query, $offset, $numrows, $params);
-    }
-
-
-  /**
-   * Execute a SQL query with limits
-   *
-   * @param  string  SQL query to execute
-   * @param  number  Offset for LIMIT statement
-   * @param  number  Number of rows for LIMIT statement
-   * @param  array   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access private
-   */
-  function _query($query, $offset, $numrows, $params)
-    {
-    // Read or write ?
-    if (strtolower(trim(substr($query,0,6)))=='select')
-      $mode='r';
-    else
-      $mode='w';
-        
-    $this->db_connect($mode);
-    
-    if (!$this->db_connected)
-      return FALSE;
-
-    if ($this->db_provider == 'sqlite')
-      $this->_sqlite_prepare();
-
-    if ($numrows || $offset)
-      $result = $this->db_handle->limitQuery($query,$offset,$numrows,$params);
-    else    
-      $result = $this->db_handle->query($query, $params);
-       
-    // add result, even if it's an error
-    return $this->_add_result($result);
-    }
-
-
-  /**
-   * Get number of rows for a SQL query
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Number of rows or FALSE on failure
-   * @access public
-   */
-  function num_rows($res_id=NULL)
-    {
-    if (!$this->db_handle)
-      return FALSE;
-
-    if ($result = $this->_get_result($res_id))    
-      return $result->numRows();
-    else
-      return FALSE;
-    }
-
-
-  /**
-   * Get number of affected rows fort he last query
-   *
-   * @return mixed   Number of rows or FALSE on failure
-   * @access public
-   */
-  function affected_rows()
-    {
-    if (!$this->db_handle)
-      return FALSE;
-
-    return $this->db_handle->affectedRows();
-    }
-
-
-  /**
-   * Get last inserted record ID
-   * For Postgres databases, a sequence name is required
-   *
-   * @param  string  Sequence name for increment
-   * @return mixed   ID or FALSE on failure
-   * @access public
-   */
-  function insert_id($sequence = '')
-    {
-    if (!$this->db_handle || $this->db_mode=='r')
-      return FALSE;
-
-    switch($this->db_provider)
-      {
-      case 'pgsql':
-        $result = &$this->db_handle->getOne("SELECT CURRVAL('$sequence')");
-        if (DB::isError($result))
-          raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 
-                            'message' => $result->getMessage()), TRUE, FALSE);
-        return $result;
-
-      case 'mssql':
-        $result = &$this->db_handle->getOne("SELECT @@IDENTITY");
-        if (DB::isError($result))
-          raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 
-                            'message' => $result->getMessage()), TRUE, FALSE);
-        return $result;
-                
-      case 'mysql': // This is unfortuneate
-        return mysql_insert_id($this->db_handle->connection);
-
-      case 'mysqli':
-        return mysqli_insert_id($this->db_handle->connection);
-
-      case 'sqlite':
-        return sqlite_last_insert_rowid($this->db_handle->connection);
-
-      default:
-        die("portability issue with this database, please have the developer fix");
-      }
-    }
-
-
-  /**
-   * Get an associative array for one row
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access public
-   */
-  function fetch_assoc($res_id=NULL)
-    {
-    $result = $this->_get_result($res_id);
-    return $this->_fetch_row($result, DB_FETCHMODE_ASSOC);
-    }
-
-
-  /**
-   * Get an index array for one row
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access public
-   */
-  function fetch_array($res_id=NULL)
-    {
-    $result = $this->_get_result($res_id);
-    return $this->_fetch_row($result, DB_FETCHMODE_ORDERED);
-    }
-
-
-  /**
-   * Get co values for a result row
-   *
-   * @param  object  Query result handle
-   * @param  number  Fetch mode identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access private
-   */
-  function _fetch_row($result, $mode)
-    {
-    if (!$result || DB::isError($result))
-      {
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => $this->db_link->getMessage()), TRUE, FALSE);
-      return FALSE;
-      }
-      elseif (!is_object($result))
-      return FALSE;
-                         
-    return $result->fetchRow($mode);
-    }
-    
-
-  /**
-   * Formats input so it can be safely used in a query
-   *
-   * @param  mixed   Value to quote
-   * @return string  Quoted/converted string for use in query
-   * @access public
-   */
-  function quote($input)
-    {
-    // create DB handle if not available
-    if (!$this->db_handle)
-      $this->db_connect('r');
-      
-    // escape pear identifier chars
-    $rep_chars = array('?' => '\?',
-                       '!' => '\!',
-                       '&' => '\&');
-      
-    return $this->db_handle->quoteSmart(strtr($input, $rep_chars));
-    }
-    
-
-  /**
-   * Quotes a string so it can be safely used as a table or column name
-   *
-   * @param  string  Value to quote
-   * @return string  Quoted string for use in query
-   * @deprecated     Replaced by rcube_db::quote_identifier
-   * @see            rcube_db::quote_identifier
-   * @access public
-   */
-  function quoteIdentifier($str)
-       {
-    return $this->quote_identifier($str);
-       }
-
-
-  /**
-   * Quotes a string so it can be safely used as a table or column name
-   *
-   * @param  string  Value to quote
-   * @return string  Quoted string for use in query
-   * @access public
-   */
-  function quote_identifier($str)
-    {
-    if (!$this->db_handle)
-      $this->db_connect('r');
-                       
-    return $this->db_handle->quoteIdentifier($str);
-    }
-
-
-  /**
-   * Escapes a string
-   *
-   * @param  string  The string to be escaped
-   * @return string  The escaped string
-   * @access public
-   */
-  function escapeSimple($str)
-    {
-    if (!$this->db_handle)
-      $this->db_connect('r');
-
-    return $this->db_handle->escapeSimple($str);
-    }
-
-
-  /*
-   * Return SQL function for current time and date
-   *
-   * @return string SQL function to use in query
-   * @access public
-   */
-  function now()
-    {
-    switch($this->db_provider)
-      {
-      case 'mssql':
-        return "getdate()";
-
-      default:
-        return "now()";
-      }
-    }
-
-
-  /**
-   * Return SQL statement to convert a field value into a unix timestamp
-   *
-   * @param  string  Field name
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function unixtimestamp($field)
-    {
-    switch($this->db_provider)
-      {
-      case 'pgsql':
-        return "EXTRACT (EPOCH FROM $field)";
-
-      case 'mssql':
-        return "datediff(s, '1970-01-01 00:00:00', $field)";
-
-      default:
-        return "UNIX_TIMESTAMP($field)";
-      }
-    }
-
-
-  /**
-   * Return SQL statement to convert from a unix timestamp
-   *
-   * @param  string  Field name
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function fromunixtime($timestamp)
-    {
-    switch($this->db_provider)
-      {
-      case 'mysqli':
-      case 'mysql':
-      case 'sqlite':
-        return sprintf("FROM_UNIXTIME(%d)", $timestamp);
-
-      default:
-        return date("'Y-m-d H:i:s'", $timestamp);
-      }
-    }
-
-
-  /**
-   * Adds a query result and returns a handle ID
-   *
-   * @param  object  Query handle
-   * @return mixed   Handle ID or FALE on failure
-   * @access private
-   */
-  function _add_result($res)
-    {
-    // sql error occured
-    if (DB::isError($res))
-      {
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)), TRUE, FALSE);
-      return FALSE;
-      }
-    else
-      {
-      $res_id = sizeof($this->a_query_results);
-      $this->a_query_results[$res_id] = $res;
-      $this->last_res_id = $res_id;
-      return $res_id;
-      }
-    }
-
-
-  /**
-   * Resolves a given handle ID and returns the according query handle
-   * If no ID is specified, the last ressource handle will be returned
-   *
-   * @param  number  Handle ID
-   * @return mixed   Ressource handle or FALE on failure
-   * @access private
-   */
-  function _get_result($res_id=NULL)
-    {
-    if ($res_id==NULL)
-      $res_id = $this->last_res_id;
-    
-     if ($res_id && isset($this->a_query_results[$res_id]))
-       return $this->a_query_results[$res_id];
-     else
-       return FALSE;
-    }
-
-
-  /**
-   * Create a sqlite database from a file
-   *
-   * @param  object  SQLite database handle
-   * @param  string  File path to use for DB creation
-   * @access private
-   */
-  function _sqlite_create_database($dbh, $file_name)
-    {
-    if (empty($file_name) || !is_string($file_name))
-      return;
-
-    $data = '';
-    if ($fd = fopen($file_name, 'r'))
-      {
-      $data = fread($fd, filesize($file_name));
-      fclose($fd);
-      }
-
-    if (strlen($data))
-      sqlite_exec($dbh->connection, $data);
-    }
-
-
-  /**
-   * Add some proprietary database functions to the current SQLite handle
-   * in order to make it MySQL compatible
-   *
-   * @access private
-   */
-  function _sqlite_prepare()
-    {
-    include_once('include/rcube_sqlite.inc');
-
-    // we emulate via callback some missing MySQL function
-    sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime");
-    sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp");
-    sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now");
-    sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5");    
-    }
-
-
-  }  // end class rcube_db
-
-?>
diff --git a/program/include/rcube_db.php b/program/include/rcube_db.php
new file mode 100644 (file)
index 0000000..1b0a19e
--- /dev/null
@@ -0,0 +1,603 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_db.php                                          |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   PEAR:DB wrapper class that implements PEAR DB functions             |
+ |   See http://pear.php.net/package/DB                                  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: David Saez Padros <david@ols.es>                              |
+ |         Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_db.php 1291 2008-04-12 13:54:45Z thomasb $
+
+*/
+
+
+/**
+ * Database independent query interface
+ *
+ * This is a wrapper for the PEAR::DB class
+ *
+ * @package    Database
+ * @author     David Saez Padros <david@ols.es>
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ * @version    1.17
+ * @link       http://pear.php.net/package/DB
+ */
+class rcube_db
+  {
+  var $db_dsnw;               // DSN for write operations
+  var $db_dsnr;               // DSN for read operations
+  var $db_connected = false;  // Already connected ?
+  var $db_mode = '';          // Connection mode
+  var $db_handle = 0;         // Connection handle
+  var $db_pconn = false;      // Use persistent connections
+  var $db_error = false;
+  var $db_error_msg = '';
+
+  var $a_query_results = array('dummy');
+  var $last_res_id = 0;
+
+
+  /**
+   * Object constructor
+   *
+   * @param  string  DSN for read/write operations
+   * @param  string  Optional DSN for read only operations
+   */
+  function __construct($db_dsnw, $db_dsnr='', $pconn=false)
+    {
+    if ($db_dsnr=='')
+      $db_dsnr=$db_dsnw;
+        
+    $this->db_dsnw = $db_dsnw;
+    $this->db_dsnr = $db_dsnr;
+    $this->db_pconn = $pconn;
+        
+    $dsn_array = DB::parseDSN($db_dsnw);
+    $this->db_provider = $dsn_array['phptype'];        
+    }
+
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see  rcube_db::__construct
+   */
+  function rcube_db($db_dsnw, $db_dsnr='', $pconn=false)
+    {
+    $this->__construct($db_dsnw, $db_dsnr, $pconn);
+    }
+
+
+  /**
+   * Connect to specific database
+   *
+   * @param  string  DSN for DB connections
+   * @return object  PEAR database handle
+   * @access private
+   */
+  function dsn_connect($dsn)
+    {
+    // Use persistent connections if available
+    $dbh = DB::connect($dsn, array('persistent' => $this->db_pconn));
+        
+    if (DB::isError($dbh))
+      {
+      $this->db_error = TRUE;
+      $this->db_error_msg = $dbh->getMessage();
+
+      raise_error(array('code' => 603, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
+                        'message' => $this->db_error_msg), TRUE, FALSE);
+                        
+      return FALSE;
+      }
+
+    else if ($this->db_provider=='sqlite')
+      {
+      $dsn_array = DB::parseDSN($dsn);
+      if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
+        $this->_sqlite_create_database($dbh, $this->sqlite_initials);
+      }
+        
+    return $dbh;
+    }
+
+
+  /**
+   * Connect to appropiate databse
+   * depending on the operation
+   *
+   * @param  string  Connection mode (r|w)
+   * @access public
+   */
+  function db_connect($mode)
+    {
+    $this->db_mode = $mode;
+
+    // Already connected
+    if ($this->db_connected)
+      {
+      // no replication, current connection is ok
+      if ($this->db_dsnw==$this->db_dsnr)
+        return;
+            
+      // connected to master, current connection is ok
+      if ($this->db_mode=='w')
+        return;
+
+      // Same mode, current connection is ok
+      if ($this->db_mode==$mode)
+        return;
+      }
+     
+    if ($mode=='r')
+      $dsn = $this->db_dsnr;
+    else
+      $dsn = $this->db_dsnw;
+
+    $this->db_handle = $this->dsn_connect($dsn);
+    $this->db_connected = $this->db_handle ? TRUE : FALSE;
+    }
+
+
+  /**
+   * Activate/deactivate debug mode
+   * (not implemented)
+   */
+  function set_debug($dbg = true)
+  {
+    
+  }
+
+
+  /**
+   * Getter for error state
+   *
+   * @param  boolean  True on error
+   */
+  function is_error()
+    {
+    return $this->db_error ? $this->db_error_msg : FALSE;
+    }
+
+
+  /**
+   * Execute a SQL query
+   *
+   * @param  string  SQL query to execute
+   * @param  mixed   Values to be inserted in query
+   * @return number  Query handle identifier
+   * @access public
+   */
+  function query()
+    {
+    $params = func_get_args();
+    $query = array_shift($params);
+
+    return $this->_query($query, 0, 0, $params);
+    }
+
+
+  /**
+   * Execute a SQL query with limits
+   *
+   * @param  string  SQL query to execute
+   * @param  number  Offset for LIMIT statement
+   * @param  number  Number of rows for LIMIT statement
+   * @param  mixed   Values to be inserted in query
+   * @return number  Query handle identifier
+   * @access public
+   */
+  function limitquery()
+    {
+    $params = func_get_args();
+    $query = array_shift($params);
+    $offset = array_shift($params);
+    $numrows = array_shift($params);
+               
+    return $this->_query($query, $offset, $numrows, $params);
+    }
+
+
+  /**
+   * Execute a SQL query with limits
+   *
+   * @param  string  SQL query to execute
+   * @param  number  Offset for LIMIT statement
+   * @param  number  Number of rows for LIMIT statement
+   * @param  array   Values to be inserted in query
+   * @return number  Query handle identifier
+   * @access private
+   */
+  function _query($query, $offset, $numrows, $params)
+    {
+    // Read or write ?
+    if (strtolower(trim(substr($query,0,6)))=='select')
+      $mode='r';
+    else
+      $mode='w';
+        
+    $this->db_connect($mode);
+    
+    if (!$this->db_connected)
+      return FALSE;
+
+    if ($this->db_provider == 'sqlite')
+      $this->_sqlite_prepare();
+
+    if ($numrows || $offset)
+      $result = $this->db_handle->limitQuery($query,$offset,$numrows,$params);
+    else    
+      $result = $this->db_handle->query($query, $params);
+       
+    // add result, even if it's an error
+    return $this->_add_result($result);
+    }
+
+
+  /**
+   * Get number of rows for a SQL query
+   * If no query handle is specified, the last query will be taken as reference
+   *
+   * @param  number  Optional query handle identifier
+   * @return mixed   Number of rows or FALSE on failure
+   * @access public
+   */
+  function num_rows($res_id=NULL)
+    {
+    if (!$this->db_handle)
+      return FALSE;
+
+    if ($result = $this->_get_result($res_id))    
+      return $result->numRows();
+    else
+      return FALSE;
+    }
+
+
+  /**
+   * Get number of affected rows fort he last query
+   *
+   * @return mixed   Number of rows or FALSE on failure
+   * @access public
+   */
+  function affected_rows()
+    {
+    if (!$this->db_handle)
+      return FALSE;
+
+    return $this->db_handle->affectedRows();
+    }
+
+
+  /**
+   * Get last inserted record ID
+   * For Postgres databases, a sequence name is required
+   *
+   * @param  string  Sequence name for increment
+   * @return mixed   ID or FALSE on failure
+   * @access public
+   */
+  function insert_id($sequence = '')
+    {
+    if (!$this->db_handle || $this->db_mode=='r')
+      return FALSE;
+
+    switch($this->db_provider)
+      {
+      case 'pgsql':
+        $result = &$this->db_handle->getOne("SELECT CURRVAL('$sequence')");
+        if (DB::isError($result))
+          raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 
+                            'message' => $result->getMessage()), TRUE, FALSE);
+        return $result;
+
+      case 'mssql':
+        $result = &$this->db_handle->getOne("SELECT @@IDENTITY");
+        if (DB::isError($result))
+          raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 
+                            'message' => $result->getMessage()), TRUE, FALSE);
+        return $result;
+                
+      case 'mysql': // This is unfortuneate
+        return mysql_insert_id($this->db_handle->connection);
+
+      case 'mysqli':
+        return mysqli_insert_id($this->db_handle->connection);
+
+      case 'sqlite':
+        return sqlite_last_insert_rowid($this->db_handle->connection);
+
+      default:
+        die("portability issue with this database, please have the developer fix");
+      }
+    }
+
+
+  /**
+   * Get an associative array for one row
+   * If no query handle is specified, the last query will be taken as reference
+   *
+   * @param  number  Optional query handle identifier
+   * @return mixed   Array with col values or FALSE on failure
+   * @access public
+   */
+  function fetch_assoc($res_id=NULL)
+    {
+    $result = $this->_get_result($res_id);
+    return $this->_fetch_row($result, DB_FETCHMODE_ASSOC);
+    }
+
+
+  /**
+   * Get an index array for one row
+   * If no query handle is specified, the last query will be taken as reference
+   *
+   * @param  number  Optional query handle identifier
+   * @return mixed   Array with col values or FALSE on failure
+   * @access public
+   */
+  function fetch_array($res_id=NULL)
+    {
+    $result = $this->_get_result($res_id);
+    return $this->_fetch_row($result, DB_FETCHMODE_ORDERED);
+    }
+
+
+  /**
+   * Get co values for a result row
+   *
+   * @param  object  Query result handle
+   * @param  number  Fetch mode identifier
+   * @return mixed   Array with col values or FALSE on failure
+   * @access private
+   */
+  function _fetch_row($result, $mode)
+    {
+    if (!$result || DB::isError($result))
+      {
+      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
+                        'message' => $this->db_link->getMessage()), TRUE, FALSE);
+      return FALSE;
+      }
+      elseif (!is_object($result))
+      return FALSE;
+                         
+    return $result->fetchRow($mode);
+    }
+    
+
+  /**
+   * Formats input so it can be safely used in a query
+   *
+   * @param  mixed   Value to quote
+   * @return string  Quoted/converted string for use in query
+   * @access public
+   */
+  function quote($input)
+    {
+    // create DB handle if not available
+    if (!$this->db_handle)
+      $this->db_connect('r');
+      
+    // escape pear identifier chars
+    $rep_chars = array('?' => '\?',
+                       '!' => '\!',
+                       '&' => '\&');
+      
+    return $this->db_handle->quoteSmart(strtr($input, $rep_chars));
+    }
+    
+
+  /**
+   * Quotes a string so it can be safely used as a table or column name
+   *
+   * @param  string  Value to quote
+   * @return string  Quoted string for use in query
+   * @deprecated     Replaced by rcube_db::quote_identifier
+   * @see            rcube_db::quote_identifier
+   * @access public
+   */
+  function quoteIdentifier($str)
+       {
+    return $this->quote_identifier($str);
+       }
+
+
+  /**
+   * Quotes a string so it can be safely used as a table or column name
+   *
+   * @param  string  Value to quote
+   * @return string  Quoted string for use in query
+   * @access public
+   */
+  function quote_identifier($str)
+    {
+    if (!$this->db_handle)
+      $this->db_connect('r');
+                       
+    return $this->db_handle->quoteIdentifier($str);
+    }
+
+
+  /**
+   * Escapes a string
+   *
+   * @param  string  The string to be escaped
+   * @return string  The escaped string
+   * @access public
+   */
+  function escapeSimple($str)
+    {
+    if (!$this->db_handle)
+      $this->db_connect('r');
+
+    return $this->db_handle->escapeSimple($str);
+    }
+
+
+  /*
+   * Return SQL function for current time and date
+   *
+   * @return string SQL function to use in query
+   * @access public
+   */
+  function now()
+    {
+    switch($this->db_provider)
+      {
+      case 'mssql':
+        return "getdate()";
+
+      default:
+        return "now()";
+      }
+    }
+
+
+  /**
+   * Return SQL statement to convert a field value into a unix timestamp
+   *
+   * @param  string  Field name
+   * @return string  SQL statement to use in query
+   * @access public
+   */
+  function unixtimestamp($field)
+    {
+    switch($this->db_provider)
+      {
+      case 'pgsql':
+        return "EXTRACT (EPOCH FROM $field)";
+
+      case 'mssql':
+        return "datediff(s, '1970-01-01 00:00:00', $field)";
+
+      default:
+        return "UNIX_TIMESTAMP($field)";
+      }
+    }
+
+
+  /**
+   * Return SQL statement to convert from a unix timestamp
+   *
+   * @param  string  Field name
+   * @return string  SQL statement to use in query
+   * @access public
+   */
+  function fromunixtime($timestamp)
+    {
+    switch($this->db_provider)
+      {
+      case 'mysqli':
+      case 'mysql':
+      case 'sqlite':
+        return sprintf("FROM_UNIXTIME(%d)", $timestamp);
+
+      default:
+        return date("'Y-m-d H:i:s'", $timestamp);
+      }
+    }
+
+
+  /**
+   * Adds a query result and returns a handle ID
+   *
+   * @param  object  Query handle
+   * @return mixed   Handle ID or FALE on failure
+   * @access private
+   */
+  function _add_result($res)
+    {
+    // sql error occured
+    if (DB::isError($res))
+      {
+      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
+                        'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)), TRUE, FALSE);
+      return FALSE;
+      }
+    else
+      {
+      $res_id = sizeof($this->a_query_results);
+      $this->a_query_results[$res_id] = $res;
+      $this->last_res_id = $res_id;
+      return $res_id;
+      }
+    }
+
+
+  /**
+   * Resolves a given handle ID and returns the according query handle
+   * If no ID is specified, the last ressource handle will be returned
+   *
+   * @param  number  Handle ID
+   * @return mixed   Ressource handle or FALE on failure
+   * @access private
+   */
+  function _get_result($res_id=NULL)
+    {
+    if ($res_id==NULL)
+      $res_id = $this->last_res_id;
+    
+     if ($res_id && isset($this->a_query_results[$res_id]))
+       return $this->a_query_results[$res_id];
+     else
+       return FALSE;
+    }
+
+
+  /**
+   * Create a sqlite database from a file
+   *
+   * @param  object  SQLite database handle
+   * @param  string  File path to use for DB creation
+   * @access private
+   */
+  function _sqlite_create_database($dbh, $file_name)
+    {
+    if (empty($file_name) || !is_string($file_name))
+      return;
+
+    $data = '';
+    if ($fd = fopen($file_name, 'r'))
+      {
+      $data = fread($fd, filesize($file_name));
+      fclose($fd);
+      }
+
+    if (strlen($data))
+      sqlite_exec($dbh->connection, $data);
+    }
+
+
+  /**
+   * Add some proprietary database functions to the current SQLite handle
+   * in order to make it MySQL compatible
+   *
+   * @access private
+   */
+  function _sqlite_prepare()
+    {
+    include_once('include/rcube_sqlite.inc');
+
+    // we emulate via callback some missing MySQL function
+    sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime");
+    sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp");
+    sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now");
+    sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5");    
+    }
+
+
+  }  // end class rcube_db
+
+
diff --git a/program/include/rcube_html.inc b/program/include/rcube_html.inc
deleted file mode 100644 (file)
index d23760a..0000000
+++ /dev/null
@@ -1,667 +0,0 @@
-<?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;
-
-      // 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'), Q($value, 'strict', false));
-        
-      // regular tag attributes
-      else
-        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $this->_conv_case(Q($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' => $values[$i]);
-    }
-    else
-      $this->options[] = array('text' => $names, 'value' => $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($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'),
-                             isset($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" : ""));    
-  }
-}
-
-
-?>
diff --git a/program/include/rcube_html_page.php b/program/include/rcube_html_page.php
new file mode 100644 (file)
index 0000000..ab8eba5
--- /dev/null
@@ -0,0 +1,255 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_html_page.php                                   |
+ |                                                                       |
+ | This file is part of the RoundCube PHP suite                          |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | CONTENTS:                                                             |
+ |   Class to build XHTML page output                                    |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id:  $
+
+*/
+
+/**
+ * Class for HTML page creation
+ *
+ * @package HTML
+ */
+class rcube_html_page
+{
+    protected $scripts_path = '';
+    protected $script_files = array();
+    protected $scripts = array();
+    protected $charset = 'UTF-8';
+
+    protected $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
+    protected $script_tag      = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
+    protected $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>";
+
+    protected $title = '';
+    protected $header = '';
+    protected $footer = '';
+    protected $body = '';
+
+
+    /** Constructor */
+    public function __construct() {}
+
+    /**
+     * Link an external script file
+     *
+     * @param string File URL
+     * @param string Target position [head|foot]
+     */
+    public 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]
+     */
+    public 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
+     */
+    public function add_header($str)
+    {
+        $this->header .= "\n".$str;
+    }
+
+    /**
+     * Add HTML code to the page footer
+     * To be added right befor </body>
+     */
+    public function add_footer($str)
+    {
+        $this->footer .= "\n".$str;
+    }
+
+    /**
+     * Setter for page title
+     */
+    public function set_title($t)
+    {
+        $this->title = $t;
+    }
+
+    /**
+     * Setter for output charset.
+     * To be specified in a meta tag and sent as http-header
+     */
+    public function set_charset($charset)
+    {
+        $this->charset = $charset;
+    }
+
+    /**
+     * Getter for output charset
+     */
+    public function get_charset()
+    {
+        return $this->charset;
+    }
+
+    /**
+     * Reset all saved properties
+     */
+    public function reset()
+    {
+        $this->script_files = array();
+        $this->scripts = array();
+        $this->title = '';
+        $this->header = '';
+        $this->footer = '';
+        $this->body = '';
+    }
+
+    /**
+     * Process template and write to stdOut
+     *
+     * @param string HTML template
+     * @param string Base for absolute paths
+     */
+    public 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)) {
+            if (!headers_sent()) {
+                header('Content-Type: text/html; charset=' . $this->charset);
+            }
+            $__page_header = '<meta http-equiv="content-type"';
+            $__page_header.= ' content="text/html; charset=';
+            $__page_header.= $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 = strrpos($output_lc, '</body>')) || ($fpos = strrpos($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);
+
+        echo rcube_charset_convert($output, 'UTF-8', $this->charset);
+    }
+}
+
diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc
deleted file mode 100644 (file)
index 51163e4..0000000
+++ /dev/null
@@ -1,2932 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_imap.inc                                        |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   IMAP wrapper that implements the Iloha IMAP Library (IIL)           |
- |   See http://ilohamail.org/ for details                               |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: rcube_imap.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-
-/*
- * Obtain classes from the Iloha IMAP library
- */
-require_once('lib/imap.inc');
-require_once('lib/mime.inc');
-
-
-/**
- * Interface class for accessing an IMAP server
- *
- * This is a wrapper that implements the Iloha IMAP Library (IIL)
- *
- * @package    Mail
- * @author     Thomas Bruederli <roundcube@gmail.com>
- * @version    1.40
- * @link       http://ilohamail.org
- */
-class rcube_imap
-{
-  var $db;
-  var $conn;
-  var $root_ns = '';
-  var $root_dir = '';
-  var $mailbox = 'INBOX';
-  var $list_page = 1;
-  var $page_size = 10;
-  var $sort_field = 'date';
-  var $sort_order = 'DESC';
-  var $delimiter = NULL;
-  var $caching_enabled = FALSE;
-  var $default_charset = 'ISO-8859-1';
-  var $default_folders = array('INBOX');
-  var $default_folders_lc = array('inbox');
-  var $cache = array();
-  var $cache_keys = array();  
-  var $cache_changes = array();
-  var $uid_id_map = array();
-  var $msg_headers = array();
-  var $capabilities = array();
-  var $skip_deleted = FALSE;
-  var $search_set = NULL;
-  var $search_subject = '';
-  var $search_string = '';
-  var $search_charset = '';
-  var $debug_level = 1;
-  var $error_code = 0;
-
-
-  /**
-   * Object constructor
-   *
-   * @param object DB Database connection
-   */
-  function __construct($db_conn)
-    {
-    $this->db = $db_conn;
-    }
-
-
-  /**
-   * PHP 4 object constructor
-   *
-   * @see  rcube_imap::__construct
-   */
-  function rcube_imap($db_conn)
-    {
-    $this->__construct($db_conn);
-    }
-
-
-  /**
-   * Connect to an IMAP server
-   *
-   * @param  string   Host to connect
-   * @param  string   Username for IMAP account
-   * @param  string   Password for IMAP account
-   * @param  number   Port to connect to
-   * @param  string   SSL schema (either ssl or tls) or null if plain connection
-   * @return boolean  TRUE on success, FALSE on failure
-   * @access public
-   */
-  function connect($host, $user, $pass, $port=143, $use_ssl=null)
-    {
-    global $ICL_SSL, $ICL_PORT, $IMAP_USE_INTERNAL_DATE;
-    
-    // check for Open-SSL support in PHP build
-    if ($use_ssl && in_array('openssl', get_loaded_extensions()))
-      $ICL_SSL = $use_ssl == 'imaps' ? 'ssl' : $use_ssl;
-    else if ($use_ssl)
-      {
-      raise_error(array('code' => 403, 'type' => 'imap', 'file' => __FILE__,
-                        'message' => 'Open SSL not available;'), TRUE, FALSE);
-      $port = 143;
-      }
-
-    $ICL_PORT = $port;
-    $IMAP_USE_INTERNAL_DATE = false;
-    
-    $this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check'));
-    $this->host = $host;
-    $this->user = $user;
-    $this->pass = $pass;
-    $this->port = $port;
-    $this->ssl = $use_ssl;
-    
-    // print trace mesages
-    if ($this->conn && ($this->debug_level & 8))
-      console($this->conn->message);
-    
-    // write error log
-    else if (!$this->conn && $GLOBALS['iil_error'])
-      {
-      $this->error_code = $GLOBALS['iil_errornum'];
-      raise_error(array('code' => 403,
-                       'type' => 'imap',
-                       'message' => $GLOBALS['iil_error']), TRUE, FALSE);
-      }
-
-    // get server properties
-    if ($this->conn)
-      {
-      $this->_parse_capability($this->conn->capability);
-      
-      if (!empty($this->conn->delimiter))
-        $this->delimiter = $this->conn->delimiter;
-      if (!empty($this->conn->rootdir))
-        {
-        $this->set_rootdir($this->conn->rootdir);
-        $this->root_ns = ereg_replace('[\.\/]$', '', $this->conn->rootdir);
-        }
-      }
-
-    return $this->conn ? TRUE : FALSE;
-    }
-
-
-  /**
-   * Close IMAP connection
-   * Usually done on script shutdown
-   *
-   * @access public
-   */
-  function close()
-    {    
-    if ($this->conn)
-      iil_Close($this->conn);
-    }
-
-
-  /**
-   * Close IMAP connection and re-connect
-   * This is used to avoid some strange socket errors when talking to Courier IMAP
-   *
-   * @access public
-   */
-  function reconnect()
-    {
-    $this->close();
-    $this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl);
-    }
-
-
-  /**
-   * Set a root folder for the IMAP connection.
-   *
-   * Only folders within this root folder will be displayed
-   * and all folder paths will be translated using this folder name
-   *
-   * @param  string   Root folder
-   * @access public
-   */
-  function set_rootdir($root)
-    {
-    if (ereg('[\.\/]$', $root)) //(substr($root, -1, 1)==='/')
-      $root = substr($root, 0, -1);
-
-    $this->root_dir = $root;
-    
-    if (empty($this->delimiter))
-      $this->get_hierarchy_delimiter();
-    }
-
-
-  /**
-   * Set default message charset
-   *
-   * This will be used for message decoding if a charset specification is not available
-   *
-   * @param  string   Charset string
-   * @access public
-   */
-  function set_charset($cs)
-    {
-    $this->default_charset = $ch;
-    }
-
-
-  /**
-   * This list of folders will be listed above all other folders
-   *
-   * @param  array  Indexed list of folder names
-   * @access public
-   */
-  function set_default_mailboxes($arr)
-    {
-    if (is_array($arr))
-      {
-      $this->default_folders = $arr;
-      $this->default_folders_lc = array();
-
-      // add inbox if not included
-      if (!in_array_nocase('INBOX', $this->default_folders))
-        array_unshift($this->default_folders, 'INBOX');
-
-      // create a second list with lower cased names
-      foreach ($this->default_folders as $mbox)
-        $this->default_folders_lc[] = strtolower($mbox);
-      }
-    }
-
-
-  /**
-   * Set internal mailbox reference.
-   *
-   * All operations will be perfomed on this mailbox/folder
-   *
-   * @param  string  Mailbox/Folder name
-   * @access public
-   */
-  function set_mailbox($new_mbox)
-    {
-    $mailbox = $this->_mod_mailbox($new_mbox);
-
-    if ($this->mailbox == $mailbox)
-      return;
-
-    $this->mailbox = $mailbox;
-
-    // clear messagecount cache for this mailbox
-    $this->_clear_messagecount($mailbox);
-    }
-
-
-  /**
-   * Set internal list page
-   *
-   * @param  number  Page number to list
-   * @access public
-   */
-  function set_page($page)
-    {
-    $this->list_page = (int)$page;
-    }
-
-
-  /**
-   * Set internal page size
-   *
-   * @param  number  Number of messages to display on one page
-   * @access public
-   */
-  function set_pagesize($size)
-    {
-    $this->page_size = (int)$size;
-    }
-    
-
-  /**
-   * Save a set of message ids for future message listing methods
-   *
-   * @param  array  List of IMAP fields to search in
-   * @param  string Search string
-   * @param  array  List of message ids or NULL if empty
-   */
-  function set_search_set($subject, $str=null, $msgs=null, $charset=null)
-    {
-    if (is_array($subject) && $str == null && $msgs == null)
-      list($subject, $str, $msgs, $charset) = $subject;
-    if ($msgs != null && !is_array($msgs))
-      $msgs = split(',', $msgs);
-      
-    $this->search_subject = $subject;
-    $this->search_string = $str;
-    $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()
-    {
-    return array($this->search_subject, $this->search_string, $this->search_set, $this->search_charset);
-    }
-
-
-  /**
-   * Returns the currently used mailbox name
-   *
-   * @return  string Name of the mailbox/folder
-   * @access  public
-   */
-  function get_mailbox_name()
-    {
-    return $this->conn ? $this->_mod_mailbox($this->mailbox, 'out') : '';
-    }
-
-
-  /**
-   * Returns the IMAP server's capability
-   *
-   * @param   string  Capability name
-   * @return  mixed   Capability value or TRUE if supported, FALSE if not
-   * @access  public
-   */
-  function get_capability($cap)
-    {
-    $cap = strtoupper($cap);
-    return $this->capabilities[$cap];
-    }
-
-
-  /**
-   * Returns the delimiter that is used by the IMAP server for folder separation
-   *
-   * @return  string  Delimiter string
-   * @access  public
-   */
-  function get_hierarchy_delimiter()
-    {
-    if ($this->conn && empty($this->delimiter))
-      $this->delimiter = iil_C_GetHierarchyDelimiter($this->conn);
-
-    if (empty($this->delimiter))
-      $this->delimiter = '/';
-
-    return $this->delimiter;
-    }
-
-
-  /**
-   * Public method for mailbox listing.
-   *
-   * Converts mailbox name with root dir first
-   *
-   * @param   string  Optional root folder
-   * @param   string  Optional filter for mailbox listing
-   * @return  array   List of mailboxes/folders
-   * @access  public
-   */
-  function list_mailboxes($root='', $filter='*')
-    {
-    $a_out = array();
-    $a_mboxes = $this->_list_mailboxes($root, $filter);
-
-    foreach ($a_mboxes as $mbox_row)
-      {
-      $name = $this->_mod_mailbox($mbox_row, 'out');
-      if (strlen($name))
-        $a_out[] = $name;
-      }
-
-    // INBOX should always be available
-    if (!in_array_nocase('INBOX', $a_out))
-      array_unshift($a_out, 'INBOX');
-
-    // sort mailboxes
-    $a_out = $this->_sort_mailbox_list($a_out);
-
-    return $a_out;
-    }
-
-
-  /**
-   * Private method for mailbox listing
-   *
-   * @return  array   List of mailboxes/folders
-   * @see     rcube_imap::list_mailboxes()
-   * @access  private
-   */
-  function _list_mailboxes($root='', $filter='*')
-    {
-    $a_defaults = $a_out = array();
-    
-    // get cached folder list    
-    $a_mboxes = $this->get_cache('mailboxes');
-    if (is_array($a_mboxes))
-      return $a_mboxes;
-
-    // retrieve list of folders from IMAP server
-    $a_folders = iil_C_ListSubscribed($this->conn, $this->_mod_mailbox($root), $filter);
-    
-    if (!is_array($a_folders) || !sizeof($a_folders))
-      $a_folders = array();
-
-    // write mailboxlist to cache
-    $this->update_cache('mailboxes', $a_folders);
-    
-    return $a_folders;
-    }
-
-
-  /**
-   * Get message count for a specific mailbox
-   *
-   * @param   string   Mailbox/folder name
-   * @param   string   Mode for count [ALL|UNSEEN|RECENT]
-   * @param   boolean  Force reading from server and update cache
-   * @return  int      Number of messages
-   * @access  public
-   */
-  function messagecount($mbox_name='', $mode='ALL', $force=FALSE)
-    {
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_messagecount($mailbox, $mode, $force);
-    }
-
-
-  /**
-   * Private method for getting nr of messages
-   *
-   * @access  private
-   * @see     rcube_imap::messagecount()
-   */
-  function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
-    {
-    $a_mailbox_cache = FALSE;
-    $mode = strtoupper($mode);
-
-    if (empty($mailbox))
-      $mailbox = $this->mailbox;
-      
-    // count search set
-    if ($this->search_string && $mailbox == $this->mailbox && $mode == 'ALL' && !$force)
-      return count((array)$this->search_set);
-
-    $a_mailbox_cache = $this->get_cache('messagecount');
-    
-    // return cached value
-    if (!$force && is_array($a_mailbox_cache[$mailbox]) && isset($a_mailbox_cache[$mailbox][$mode]))
-      return $a_mailbox_cache[$mailbox][$mode];
-
-    // RECENT count is fetched abit different      
-    if ($mode == 'RECENT')
-       $count = iil_C_CheckForRecent($this->conn, $mailbox);
-
-    // use SEARCH for message counting
-    else if ($this->skip_deleted)
-      {
-      $search_str = "ALL UNDELETED";
-
-      // get message count and store in cache
-      if ($mode == 'UNSEEN')
-        $search_str .= " UNSEEN";
-
-      // get message count using SEARCH
-      // not very performant but more precise (using UNDELETED)
-      $count = 0;
-      $index = $this->_search_index($mailbox, $search_str);
-      if (is_array($index))
-        {
-        $str = implode(",", $index);
-        if (!empty($str))
-          $count = count($index);
-        }
-      }
-    else
-      {
-      if ($mode == 'UNSEEN')
-        $count = iil_C_CountUnseen($this->conn, $mailbox);
-      else
-        $count = iil_C_CountMessages($this->conn, $mailbox);
-      }
-
-    if (!is_array($a_mailbox_cache[$mailbox]))
-      $a_mailbox_cache[$mailbox] = array();
-      
-    $a_mailbox_cache[$mailbox][$mode] = (int)$count;
-
-    // write back to cache
-    $this->update_cache('messagecount', $a_mailbox_cache);
-
-    return (int)$count;
-    }
-
-
-  /**
-   * Public method for listing headers
-   * convert mailbox name with root dir first
-   *
-   * @param   string   Mailbox/folder name
-   * @param   int      Current page to list
-   * @param   string   Header field to sort by
-   * @param   string   Sort order [ASC|DESC]
-   * @return  array    Indexed array with message header objects
-   * @access  public   
-   */
-  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL)
-    {
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order);
-    }
-
-
-  /**
-   * Private method for listing message headers
-   *
-   * @access  private
-   * @see     rcube_imap::list_headers
-   */
-  function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE)
-    {
-    if (!strlen($mailbox))
-      return array();
-
-    // use saved message set
-    if ($this->search_string && $mailbox == $this->mailbox)
-      return $this->_list_header_set($mailbox, $this->search_set, $page, $sort_field, $sort_order);
-
-    $this->_set_sort_order($sort_field, $sort_order);
-
-    $max = $this->_messagecount($mailbox);
-    $start_msg = ($this->list_page-1) * $this->page_size;
-
-    list($begin, $end) = $this->_get_message_range($max, $page);
-
-    // mailbox is empty
-    if ($begin >= $end)
-      return array();
-      
-    $headers_sorted = FALSE;
-    $cache_key = $mailbox.'.msg';
-    $cache_status = $this->check_cache_status($mailbox, $cache_key);
-
-    // cache is OK, we can get all messages from local cache
-    if ($cache_status>0)
-      {
-      $a_msg_headers = $this->get_message_cache($cache_key, $start_msg, $start_msg+$this->page_size, $this->sort_field, $this->sort_order);
-      $headers_sorted = TRUE;
-      }
-    // cache is dirty, sync it
-    else if ($this->caching_enabled && $cache_status==-1 && !$recursive)
-      {
-      $this->sync_header_index($mailbox);
-      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE);
-      }
-    else
-      {
-      // retrieve headers from IMAP
-      if ($this->get_capability('sort') && ($msg_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')))
-        {        
-        $msgs = $msg_index[$begin];
-        for ($i=$begin+1; $i < $end; $i++)
-          $msgs = $msgs.','.$msg_index[$i];
-        }
-      else
-        {
-        $msgs = sprintf("%d:%d", $begin+1, $end);
-
-        $i = 0;
-        for ($msg_seqnum = $begin; $msg_seqnum <= $end; $msg_seqnum++)
-          $msg_index[$i++] = $msg_seqnum;
-        }
-
-      // use this class for message sorting
-      $sorter = new rcube_header_sorter();
-      $sorter->set_sequence_numbers($msg_index);
-
-      // fetch reuested headers from server
-      $a_msg_headers = array();
-      $deleted_count = $this->_fetch_headers($mailbox, $msgs, $a_msg_headers, $cache_key);
-
-      // delete cached messages with a higher index than $max+1
-      // Changed $max to $max+1 to fix this bug : #1484295
-      $this->clear_message_cache($cache_key, $max + 1);
-
-
-      // kick child process to sync cache
-      // ...
-
-      }
-
-
-    // return empty array if no messages found
-       if (!is_array($a_msg_headers) || empty($a_msg_headers))
-               return array();
-
-
-    // if not already sorted
-    if (!$headers_sorted)
-      {
-      $sorter->sort_headers($a_msg_headers);
-
-      if ($this->sort_order == 'DESC')
-        $a_msg_headers = array_reverse($a_msg_headers);
-      }
-
-    return array_values($a_msg_headers);
-    }
-
-
-
-  /**
-   * Public method for listing a specific set of headers
-   * convert mailbox name with root dir first
-   *
-   * @param   string   Mailbox/folder name
-   * @param   array    List of message ids 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
-   * @access  public   
-   */
-  function list_header_set($mbox_name='', $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL)
-    {
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_list_header_set($mailbox, $msgs, $page, $sort_field, $sort_order);    
-    }
-    
-
-  /**
-   * Private method for listing a set of message headers
-   *
-   * @access  private
-   * @see     rcube_imap::list_header_set()
-   */
-  function _list_header_set($mailbox, $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL)
-    {
-    // also accept a comma-separated list of message ids
-    if (is_string($msgs))
-      $msgs = split(',', $msgs);
-      
-    if (!strlen($mailbox) || empty($msgs))
-      return array();
-
-    $this->_set_sort_order($sort_field, $sort_order);
-
-    $max = count($msgs);
-    $start_msg = ($this->list_page-1) * $this->page_size;
-
-    // fetch reuested headers from server
-    $a_msg_headers = array();
-    $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
-
-    // return empty array if no messages found
-    if (!is_array($a_msg_headers) || empty($a_msg_headers))
-      return array();
-
-    // if not already sorted
-    $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
-
-    // only return the requested part of the set
-    return array_slice(array_values($a_msg_headers), $start_msg, min($max-$start_msg, $this->page_size));
-    }
-
-
-  /**
-   * Helper function to get first and last index of the requested set
-   *
-   * @param  int     message count
-   * @param  mixed   page number to show, or string 'all'
-   * @return array   array with two values: first index, last index
-   * @access private
-   */
-  function _get_message_range($max, $page)
-    {
-    $start_msg = ($this->list_page-1) * $this->page_size;
-    
-    if ($page=='all')
-      {
-      $begin = 0;
-      $end = $max;
-      }
-    else if ($this->sort_order=='DESC')
-      {
-      $begin = $max - $this->page_size - $start_msg;
-      $end =   $max - $start_msg;
-      }
-    else
-      {
-      $begin = $start_msg;
-      $end   = $start_msg + $this->page_size;
-      }
-
-    if ($begin < 0) $begin = 0;
-    if ($end < 0) $end = $max;
-    if ($end > $max) $end = $max;
-    
-    return array($begin, $end);
-    }
-    
-    
-
-  /**
-   * Fetches message headers
-   * Used for loop
-   *
-   * @param  string  Mailbox name
-   * @param  string  Message index to fetch
-   * @param  array   Reference to message headers array
-   * @param  array   Array with cache index
-   * @return int     Number of deleted messages
-   * @access private
-   */
-  function _fetch_headers($mailbox, $msgs, &$a_msg_headers, $cache_key)
-    {
-    // cache is incomplete
-    $cache_index = $this->get_message_cache_index($cache_key);
-    
-    // fetch reuested headers from server
-    $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs);
-    $deleted_count = 0;
-    
-    if (!empty($a_header_index))
-      {
-      foreach ($a_header_index as $i => $headers)
-        {
-        if ($headers->deleted && $this->skip_deleted)
-          {
-          // delete from cache
-          if ($cache_index[$headers->id] && $cache_index[$headers->id] == $headers->uid)
-            $this->remove_message_cache($cache_key, $headers->id);
-
-          $deleted_count++;
-          continue;
-          }
-
-        // add message to cache
-        if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid)
-          $this->add_message_cache($cache_key, $headers->id, $headers);
-
-        $a_msg_headers[$headers->uid] = $headers;
-        }
-      }
-        
-    return $deleted_count;
-    }
-    
-  
-  /**
-   * Return sorted array of message UIDs
-   *
-   * @param string Mailbox to get index from
-   * @param string Sort column
-   * @param string Sort order [ASC, DESC]
-   * @return array Indexed array with message ids
-   */
-  function message_index($mbox_name='', $sort_field=NULL, $sort_order=NULL)
-    {
-    $this->_set_sort_order($sort_field, $sort_order);
-
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    $key = "{$mailbox}:{$this->sort_field}:{$this->sort_order}:{$this->search_string}.msgi";
-
-    // we have a saved search result. get index from there
-    if (!isset($this->cache[$key]) && $this->search_string && $mailbox == $this->mailbox)
-    {
-      $this->cache[$key] = $a_msg_headers = array();
-      $this->_fetch_headers($mailbox, join(',', $this->search_set), $a_msg_headers, NULL);
-
-      foreach (iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order) as $i => $msg)
-        $this->cache[$key][] = $msg->uid;
-    }
-
-    // have stored it in RAM
-    if (isset($this->cache[$key]))
-      return $this->cache[$key];
-
-    // check local cache
-    $cache_key = $mailbox.'.msg';
-    $cache_status = $this->check_cache_status($mailbox, $cache_key);
-
-    // cache is OK
-    if ($cache_status>0)
-      {
-      $a_index = $this->get_message_cache_index($cache_key, TRUE, $this->sort_field, $this->sort_order);
-      return array_values($a_index);
-      }
-
-
-    // fetch complete message index
-    $msg_count = $this->_messagecount($mailbox);
-    if ($this->get_capability('sort') && ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, '', TRUE)))
-      {
-      if ($this->sort_order == 'DESC')
-        $a_index = array_reverse($a_index);
-
-      $this->cache[$key] = $a_index;
-
-      }
-    else
-      {
-      $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:$msg_count", $this->sort_field);
-      $a_uids = iil_C_FetchUIDs($this->conn, $mailbox);
-    
-      if ($this->sort_order=="ASC")
-        asort($a_index);
-      else if ($this->sort_order=="DESC")
-        arsort($a_index);
-        
-      $i = 0;
-      $this->cache[$key] = array();
-      foreach ($a_index as $index => $value)
-        $this->cache[$key][$i++] = $a_uids[$index];
-      }
-
-    return $this->cache[$key];
-    }
-
-
-  /**
-   * @access private
-   */
-  function sync_header_index($mailbox)
-    {
-    $cache_key = $mailbox.'.msg';
-    $cache_index = $this->get_message_cache_index($cache_key);
-    $msg_count = $this->_messagecount($mailbox);
-
-    // fetch complete message index
-    $a_message_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:$msg_count", 'UID');
-        
-    foreach ($a_message_index as $id => $uid)
-      {
-      // message in cache at correct position
-      if ($cache_index[$id] == $uid)
-        {
-        unset($cache_index[$id]);
-        continue;
-        }
-        
-      // message in cache but in wrong position
-      if (in_array((string)$uid, $cache_index, TRUE))
-        {
-        unset($cache_index[$id]);        
-        }
-      
-      // other message at this position
-      if (isset($cache_index[$id]))
-        {
-        $this->remove_message_cache($cache_key, $id);
-        unset($cache_index[$id]);
-        }
-        
-
-      // fetch complete headers and add to cache
-      $headers = iil_C_FetchHeader($this->conn, $mailbox, $id);
-      $this->add_message_cache($cache_key, $headers->id, $headers);
-      }
-
-    // those ids that are still in cache_index have been deleted      
-    if (!empty($cache_index))
-      {
-      foreach ($cache_index as $id => $uid)
-        $this->remove_message_cache($cache_key, $id);
-      }
-    }
-
-
-  /**
-   * Invoke search request to IMAP server
-   *
-   * @param  string  mailbox name to search in
-   * @param  string  search criteria (ALL, TO, FROM, SUBJECT, etc)
-   * @param  string  search string
-   * @return array   search results as list of message ids
-   * @access public
-   */
-  function search($mbox_name='', $criteria='ALL', $str=NULL, $charset=NULL)
-    {
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-
-    // have an array of criterias => execute multiple searches
-    if (is_array($criteria) && $str)
-      {
-      $results = array();
-      foreach ($criteria as $crit)
-        if ($search_result = $this->search($mbox_name, $crit, $str, $charset))
-          $results = array_merge($results, $search_result);
-      
-      $results = array_unique($results);
-      $this->set_search_set($criteria, $str, $results, $charset);
-      return $results;
-      }
-    else if ($str && $criteria)
-      {
-      $search = (!empty($charset) ? "CHARSET $charset " : '') . sprintf("%s {%d}\r\n%s", $criteria, strlen($str), $str);
-      $results = $this->_search_index($mailbox, $search);
-
-      // try search with ISO charset (should be supported by server)
-      if (empty($results) && !empty($charset) && $charset!='ISO-8859-1')
-        $results = $this->search($mbox_name, $criteria, rcube_charset_convert($str, $charset, 'ISO-8859-1'), 'ISO-8859-1');
-      
-      $this->set_search_set($criteria, $str, $results, $charset);
-      return $results;
-      }
-    else
-      return $this->_search_index($mailbox, $criteria);
-    }    
-
-
-  /**
-   * Private search method
-   *
-   * @return array   search results as list of message ids
-   * @access private
-   * @see rcube_imap::search()
-   */
-  function _search_index($mailbox, $criteria='ALL')
-    {
-    $a_messages = iil_C_Search($this->conn, $mailbox, $criteria);
-    // clean message list (there might be some empty entries)
-    if (is_array($a_messages))
-      {
-      foreach ($a_messages as $i => $val)
-        if (empty($val))
-          unset($a_messages[$i]);
-      }
-        
-    return $a_messages;
-    }
-    
-  
-  /**
-   * Refresh saved search set
-   *
-   * @return array Current search set
-   */
-  function refresh_search()
-    {
-    if (!empty($this->search_subject) && !empty($this->search_string))
-      $this->search_set = $this->search('', $this->search_subject, $this->search_string, $this->search_charset);
-      
-    return $this->get_search_set();
-    }
-  
-  
-  /**
-   * Check if the given message ID is part of the current search set
-   *
-   * @return boolean True on match or if no search request is stored
-   */
-  function in_searchset($msgid)
-  {
-    if (!empty($this->search_string))
-      return in_array("$msgid", (array)$this->search_set, true);
-    else
-      return true;
-  }
-
-
-  /**
-   * Return message headers object of a specific message
-   *
-   * @param int     Message ID
-   * @param string  Mailbox to read from 
-   * @param boolean True if $id is the message UID
-   * @return object Message headers representation
-   */
-  function get_headers($id, $mbox_name=NULL, $is_uid=TRUE)
-    {
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    $uid = $is_uid ? $id : $this->_id2uid($id);
-
-    // get cached headers
-    if ($uid && ($headers = &$this->get_cached_message($mailbox.'.msg', $uid)))
-      return $headers;
-
-    $headers = iil_C_FetchHeader($this->conn, $mailbox, $id, $is_uid);
-
-    // write headers cache
-    if ($headers)
-      {
-      if ($headers->uid && $headers->id)
-        $this->uid_id_map[$mailbox][$headers->uid] = $headers->id;
-
-      $this->add_message_cache($mailbox.'.msg', $headers->id, $headers);
-      }
-
-    return $headers;
-    }
-
-
-  /**
-   * Fetch body structure from the IMAP server and build
-   * an object structure similar to the one generated by PEAR::Mail_mimeDecode
-   *
-   * @param int Message UID to fetch
-   * @return object stdClass Message part tree or False on failure
-   */
-  function &get_structure($uid)
-    {
-    $cache_key = $this->mailbox.'.msg';
-    $headers = &$this->get_cached_message($cache_key, $uid, true);
-
-    // return cached message structure
-    if (is_object($headers) && is_object($headers->structure))
-      return $headers->structure;
-    
-    // resolve message sequence number
-    if (!($msg_id = $this->_uid2id($uid)))
-      return FALSE;
-
-    $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); 
-    $structure = iml_GetRawStructureArray($structure_str);
-    $struct = false;
-
-    // parse structure and add headers
-    if (!empty($structure))
-      {
-      $this->_msg_id = $msg_id;
-      $headers = $this->get_headers($uid);
-      
-      $struct = &$this->_structure_part($structure);
-      $struct->headers = get_object_vars($headers);
-
-      // don't trust given content-type
-      if (empty($struct->parts) && !empty($struct->headers['ctype']))
-        {
-        $struct->mime_id = '1';
-        $struct->mimetype = strtolower($struct->headers['ctype']);
-        list($struct->ctype_primary, $struct->ctype_secondary) = explode('/', $struct->mimetype);
-        }
-
-      // write structure to cache
-      if ($this->caching_enabled)
-        $this->add_message_cache($cache_key, $msg_id, $headers, $struct);
-      }
-      
-    return $struct;
-    }
-
-  
-  /**
-   * Build message part object
-   *
-   * @access private
-   */
-  function &_structure_part($part, $count=0, $parent='')
-    {
-    $struct = new rcube_message_part;
-    $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count";
-    
-    // multipart
-    if (is_array($part[0]))
-      {
-      $struct->ctype_primary = 'multipart';
-      
-      // find first non-array entry
-      for ($i=1; count($part); $i++)
-        if (!is_array($part[$i]))
-          {
-          $struct->ctype_secondary = strtolower($part[$i]);
-          break;
-          }
-          
-      $struct->mimetype = 'multipart/'.$struct->ctype_secondary;
-
-      $struct->parts = array();
-      for ($i=0, $count=0; $i<count($part); $i++)
-        if (is_array($part[$i]) && count($part[$i]) > 5)
-          $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id);
-          
-      return $struct;
-      }
-    
-    
-    // regular part
-    $struct->ctype_primary = strtolower($part[0]);
-    $struct->ctype_secondary = strtolower($part[1]);
-    $struct->mimetype = $struct->ctype_primary.'/'.$struct->ctype_secondary;
-
-    // read content type parameters
-    if (is_array($part[2]))
-      {
-      $struct->ctype_parameters = array();
-      for ($i=0; $i<count($part[2]); $i+=2)
-        $struct->ctype_parameters[strtolower($part[2][$i])] = $part[2][$i+1];
-        
-      if (isset($struct->ctype_parameters['charset']))
-        $struct->charset = $struct->ctype_parameters['charset'];
-      }
-    
-    // read content encoding
-    if (!empty($part[5]) && $part[5]!='NIL')
-      {
-      $struct->encoding = strtolower($part[5]);
-      $struct->headers['content-transfer-encoding'] = $struct->encoding;
-      }
-    
-    // get part size
-    if (!empty($part[6]) && $part[6]!='NIL')
-      $struct->size = intval($part[6]);
-
-    // read part disposition
-    $di = count($part) - 2;
-    if ((is_array($part[$di]) && count($part[$di]) == 2 && is_array($part[$di][1])) ||
-        (is_array($part[--$di]) && count($part[$di]) == 2))
-      {
-      $struct->disposition = strtolower($part[$di][0]);
-
-      if (is_array($part[$di][1]))
-        for ($n=0; $n<count($part[$di][1]); $n+=2)
-          $struct->d_parameters[strtolower($part[$di][1][$n])] = $part[$di][1][$n+1];
-      }
-      
-    // get child parts
-    if (is_array($part[8]) && $di != 8)
-      {
-      $struct->parts = array();
-      for ($i=0, $count=0; $i<count($part[8]); $i++)
-        if (is_array($part[8][$i]) && count($part[8][$i]) > 5)
-          $struct->parts[] = $this->_structure_part($part[8][$i], ++$count, $struct->mime_id);
-      }
-
-    // get part ID
-    if (!empty($part[3]) && $part[3]!='NIL')
-      {
-      $struct->content_id = $part[3];
-      $struct->headers['content-id'] = $part[3];
-    
-      if (empty($struct->disposition))
-        $struct->disposition = 'inline';
-      }
-
-    // fetch message headers if message/rfc822
-    if ($struct->ctype_primary=='message')
-      {
-      $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER');
-      $struct->headers = $this->_parse_headers($headers);
-      
-      if (is_array($part[8]) && empty($struct->parts))
-        $struct->parts[] = $this->_structure_part($part[8], ++$count, $struct->mime_id);
-      }
-      
-    // normalize filename property
-    if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name'])
-      $struct->filename = rcube_imap::decode_mime_string($filename_mime, $this->default_charset);
-    else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*'])
-    {
-      // decode filename according to RFC 2231, Section 4
-      list($filename_charset,, $filename_urlencoded) = split('\'', $filename_encoded);
-      $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset);
-    }
-    else if (!empty($struct->headers['content-description']))
-      $struct->filename = rcube_imap::decode_mime_string($struct->headers['content-description'], $this->default_charset);
-      
-    return $struct;
-    }
-    
-  
-  /**
-   * Return a flat array with references to all parts, indexed by part numbers
-   *
-   * @param object rcube_message_part Message body structure
-   * @return Array with part number -> object pairs
-   */
-  function get_mime_numbers(&$structure)
-    {
-    $a_parts = array();
-    $this->_get_part_numbers($structure, $a_parts);
-    return $a_parts;
-    }
-  
-  
-  /**
-   * Helper method for recursive calls
-   *
-   * @access private
-   */
-  function _get_part_numbers(&$part, &$a_parts)
-    {
-    if ($part->mime_id)
-      $a_parts[$part->mime_id] = &$part;
-      
-    if (is_array($part->parts))
-      for ($i=0; $i<count($part->parts); $i++)
-        $this->_get_part_numbers($part->parts[$i], $a_parts);
-    }
-  
-
-  /**
-   * Fetch message body of a specific message from the server
-   *
-   * @param  int    Message UID
-   * @param  string Part number
-   * @param  object rcube_message_part Part object created by get_structure()
-   * @param  mixed  True to print part, ressource to write part contents in
-   * @return string Message/part body if not printed
-   */
-  function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL)
-    {
-    if (!($msg_id = $this->_uid2id($uid)))
-      return FALSE;
-    
-    // get part encoding if not provided
-    if (!is_object($o_part))
-      {
-      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); 
-      $structure = iml_GetRawStructureArray($structure_str);
-      $part_type = iml_GetPartTypeCode($structure, $part);
-      $o_part = new rcube_message_part;
-      $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other');
-      $o_part->encoding = strtolower(iml_GetPartEncodingString($structure, $part));
-      $o_part->charset = iml_GetPartCharset($structure, $part);
-      }
-      
-    // TODO: Add caching for message parts
-
-    if ($print)
-      {
-      $mode = $o_part->encoding == 'base64' ? 3 : ($o_part->encoding == 'quoted-printable' ? 1 : 2);
-      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, $mode);
-      
-      // we have to decode the part manually before printing
-      if ($mode == 1)
-        {
-        echo $this->mime_decode($body, $o_part->encoding);
-        $body = true;
-        }
-      }
-    else
-      {
-      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1);
-
-      // decode part body
-      if ($o_part->encoding)
-        $body = $this->mime_decode($body, $o_part->encoding);
-
-      // convert charset (if text or message part)
-      if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message')
-        {
-        // assume default if no charset specified
-        if (empty($o_part->charset))
-          $o_part->charset = $this->default_charset;
-
-        $body = rcube_charset_convert($body, $o_part->charset);
-        }
-      }
-
-    return $body;
-    }
-
-
-  /**
-   * Fetch message body of a specific message from the server
-   *
-   * @param  int    Message UID
-   * @return string Message/part body
-   * @see    rcube_imap::get_message_part()
-   */
-  function &get_body($uid, $part=1)
-    {
-    return $this->get_message_part($uid, $part);
-    }
-
-
-  /**
-   * Returns the whole message source as string
-   *
-   * @param int  Message UID
-   * @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);
-
-    return $body;    
-    }
-    
-
-  /**
-   * Sends the whole message source to stdout
-   *
-   * @param int  Message UID
-   */ 
-  function print_raw_body($uid)
-    {
-    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);
-    }
-
-
-  /**
-   * Set message flag to one or several messages
-   *
-   * @param mixed  Message UIDs as array or as comma-separated string
-   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
-   * @return boolean True on success, False on failure
-   */
-  function set_flag($uids, $flag)
-    {
-    $flag = strtoupper($flag);
-    $msg_ids = array();
-    if (!is_array($uids))
-      $uids = explode(',',$uids);
-      
-    foreach ($uids as $uid) {
-      $msg_ids[$uid] = $this->_uid2id($uid);
-    }
-      
-    if ($flag=='UNDELETED')
-      $result = iil_C_Undelete($this->conn, $this->mailbox, join(',', array_values($msg_ids)));
-    else if ($flag=='UNSEEN')
-      $result = iil_C_Unseen($this->conn, $this->mailbox, join(',', array_values($msg_ids)));
-    else
-      $result = iil_C_Flag($this->conn, $this->mailbox, join(',', array_values($msg_ids)), $flag);
-
-    // reload message headers if cached
-    $cache_key = $this->mailbox.'.msg';
-    if ($this->caching_enabled)
-      {
-      foreach ($msg_ids as $uid => $id)
-        {
-        if ($cached_headers = $this->get_cached_message($cache_key, $uid))
-          {
-          $this->remove_message_cache($cache_key, $id);
-          //$this->get_headers($uid);
-          }
-        }
-
-      // close and re-open connection
-      // this prevents connection problems with Courier 
-      $this->reconnect();
-      }
-
-    // set nr of messages that were flaged
-    $count = count($msg_ids);
-
-    // clear message count cache
-    if ($result && $flag=='SEEN')
-      $this->_set_messagecount($this->mailbox, 'UNSEEN', $count*(-1));
-    else if ($result && $flag=='UNSEEN')
-      $this->_set_messagecount($this->mailbox, 'UNSEEN', $count);
-    else if ($result && $flag=='DELETED')
-      $this->_set_messagecount($this->mailbox, 'ALL', $count*(-1));
-
-    return $result;
-    }
-
-
-  /**
-   * 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);
-    $mailbox = $this->_mod_mailbox($mbox_name);
-
-    // make sure mailbox exists
-    if (in_array($mailbox, $this->_list_mailboxes()))
-      $saved = iil_C_Append($this->conn, $mailbox, $message);
-
-    if ($saved)
-      {
-      // increase messagecount of the target mailbox
-      $this->_set_messagecount($mailbox, 'ALL', 1);
-      }
-          
-    return $saved;
-    }
-
-
-  /**
-   * Move a message from one mailbox to another
-   *
-   * @param string List of UIDs to move, separated by comma
-   * @param string Target mailbox
-   * @param string Source mailbox
-   * @return boolean True on success, False on error
-   */
-  function move_message($uids, $to_mbox, $from_mbox='')
-    {
-    $to_mbox = stripslashes($to_mbox);
-    $from_mbox = stripslashes($from_mbox);
-    $to_mbox = $this->_mod_mailbox($to_mbox);
-    $from_mbox = $from_mbox ? $this->_mod_mailbox($from_mbox) : $this->mailbox;
-
-    // make sure mailbox exists
-    if (!in_array($to_mbox, $this->_list_mailboxes()))
-      {
-      if (in_array($to_mbox, $this->default_folders))
-        $this->create_mailbox($to_mbox, TRUE);
-      else
-        return FALSE;
-      }
-
-    // convert the list of uids to array
-    $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL);
-    
-    // exit if no message uids are specified
-    if (!is_array($a_uids))
-      return false;
-
-    // convert uids to message ids
-    $a_mids = array();
-    foreach ($a_uids as $uid)
-      $a_mids[] = $this->_uid2id($uid, $from_mbox);
-
-    $iil_move = iil_C_Move($this->conn, join(',', $a_mids), $from_mbox, $to_mbox);
-    $moved = !($iil_move === false || $iil_move < 0);
-    
-    // send expunge command in order to have the moved message
-    // really deleted from the source mailbox
-    if ($moved)
-      {
-      $this->_expunge($from_mbox, FALSE);
-      $this->_clear_messagecount($from_mbox);
-      $this->_clear_messagecount($to_mbox);
-      }
-      
-    // remove message ids from search set
-    if ($moved && $this->search_set && $from_mbox == $this->mailbox)
-      $this->search_set = array_diff($this->search_set, $a_mids);
-
-    // update cached message headers
-    $cache_key = $from_mbox.'.msg';
-    if ($moved && ($a_cache_index = $this->get_message_cache_index($cache_key)))
-      {
-      $start_index = 100000;
-      foreach ($a_uids as $uid)
-        {
-        if (($index = array_search($uid, $a_cache_index)) !== FALSE)
-          $start_index = min($index, $start_index);
-        }
-
-      // clear cache from the lowest index on
-      $this->clear_message_cache($cache_key, $start_index);
-      }
-
-    return $moved;
-    }
-
-
-  /**
-   * Mark messages as deleted and expunge mailbox
-   *
-   * @param string List of UIDs to move, separated by comma
-   * @param string Source mailbox
-   * @return boolean True on success, False on error
-   */
-  function delete_message($uids, $mbox_name='')
-    {
-    $mbox_name = stripslashes($mbox_name);
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-
-    // convert the list of uids to array
-    $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL);
-    
-    // exit if no message uids are specified
-    if (!is_array($a_uids))
-      return false;
-
-
-    // convert uids to message ids
-    $a_mids = array();
-    foreach ($a_uids as $uid)
-      $a_mids[] = $this->_uid2id($uid, $mailbox);
-        
-    $deleted = iil_C_Delete($this->conn, $mailbox, join(',', $a_mids));
-    
-    // send expunge command in order to have the deleted message
-    // really deleted from the mailbox
-    if ($deleted)
-      {
-      $this->_expunge($mailbox, FALSE);
-      $this->_clear_messagecount($mailbox);
-      }
-
-    // remove message ids from search set
-    if ($moved && $this->search_set && $mailbox == $this->mailbox)
-      $this->search_set = array_diff($this->search_set, $a_mids);
-
-    // remove deleted messages from cache
-    $cache_key = $mailbox.'.msg';
-    if ($deleted && ($a_cache_index = $this->get_message_cache_index($cache_key)))
-      {
-      $start_index = 100000;
-      foreach ($a_uids as $uid)
-        {
-        if (($index = array_search($uid, $a_cache_index)) !== FALSE)
-          $start_index = min($index, $start_index);
-        }
-
-      // clear cache from the lowest index on
-      $this->clear_message_cache($cache_key, $start_index);
-      }
-
-    return $deleted;
-    }
-
-
-  /**
-   * Clear all messages in a specific mailbox
-   *
-   * @param string Mailbox name
-   * @return int Above 0 on success
-   */
-  function clear_mailbox($mbox_name=NULL)
-    {
-    $mbox_name = stripslashes($mbox_name);
-    $mailbox = !empty($mbox_name) ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    $msg_count = $this->_messagecount($mailbox, 'ALL');
-    
-    if ($msg_count>0)
-      {
-      $cleared = iil_C_ClearFolder($this->conn, $mailbox);
-      
-      // make sure the message count cache is cleared as well
-      if ($cleared)
-        {
-        $this->clear_message_cache($mailbox.'.msg');      
-        $a_mailbox_cache = $this->get_cache('messagecount');
-        unset($a_mailbox_cache[$mailbox]);
-        $this->update_cache('messagecount', $a_mailbox_cache);
-        }
-        
-      return $cleared;
-      }
-    else
-      return 0;
-    }
-
-
-  /**
-   * Send IMAP expunge command and clear cache
-   *
-   * @param string Mailbox name
-   * @param boolean False if cache should not be cleared
-   * @return boolean True on success
-   */
-  function expunge($mbox_name='', $clear_cache=TRUE)
-    {
-    $mbox_name = stripslashes($mbox_name);
-    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_expunge($mailbox, $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_messagecount($mailbox);
-      }
-      
-    return $result;
-    }
-
-
-  /* --------------------------------
-   *        folder managment
-   * --------------------------------*/
-
-
-  /**
-   * Get a list of all folders available on the IMAP server
-   * 
-   * @param string IMAP root dir
-   * @return array Indexed array with folder names
-   */
-  function list_unsubscribed($root='')
-    {
-    static $sa_unsubscribed;
-    
-    if (is_array($sa_unsubscribed))
-      return $sa_unsubscribed;
-      
-    // retrieve list of folders from IMAP server
-    $a_mboxes = iil_C_ListMailboxes($this->conn, $this->_mod_mailbox($root), '*');
-
-    // modify names with root dir
-    foreach ($a_mboxes as $mbox_name)
-      {
-      $name = $this->_mod_mailbox($mbox_name, 'out');
-      if (strlen($name))
-        $a_folders[] = $name;
-      }
-
-    // filter folders and sort them
-    $sa_unsubscribed = $this->_sort_mailbox_list($a_folders);
-    return $sa_unsubscribed;
-    }
-
-
-  /**
-   * Get mailbox quota information
-   * added by Nuny
-   * 
-   * @return mixed Quota info or False if not supported
-   */
-  function get_quota()
-    {
-    if ($this->get_capability('QUOTA'))
-      return iil_C_GetQuota($this->conn);
-       
-    return FALSE;
-    }
-
-
-  /**
-   * Subscribe to a specific mailbox(es)
-   *
-   * @param array Mailbox name(s)
-   * @return boolean True on success
-   */ 
-  function subscribe($a_mboxes)
-    {
-    if (!is_array($a_mboxes))
-      $a_mboxes = array($a_mboxes);
-
-    // let this common function do the main work
-    return $this->_change_subscription($a_mboxes, 'subscribe');
-    }
-
-
-  /**
-   * Unsubscribe mailboxes
-   *
-   * @param array Mailbox name(s)
-   * @return boolean True on success
-   */
-  function unsubscribe($a_mboxes)
-    {
-    if (!is_array($a_mboxes))
-      $a_mboxes = array($a_mboxes);
-
-    // let this common function do the main work
-    return $this->_change_subscription($a_mboxes, 'unsubscribe');
-    }
-
-
-  /**
-   * Create a new mailbox on the server and register it in local cache
-   *
-   * @param string  New mailbox name (as utf-7 string)
-   * @param boolean True if the new mailbox should be subscribed
-   * @param string  Name of the created mailbox, false on error
-   */
-  function create_mailbox($name, $subscribe=FALSE)
-    {
-    $result = FALSE;
-    
-    // replace backslashes
-    $name = preg_replace('/[\\\]+/', '-', $name);
-
-    // reduce mailbox name to 100 chars
-    $name = substr($name, 0, 100);
-
-    $abs_name = $this->_mod_mailbox($name);
-    $a_mailbox_cache = $this->get_cache('mailboxes');
-
-    if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array($abs_name, $a_mailbox_cache)))
-      $result = iil_C_CreateFolder($this->conn, $abs_name);
-
-    // try to subscribe it
-    if ($result && $subscribe)
-      $this->subscribe($name);
-
-    return $result ? $name : FALSE;
-    }
-
-
-  /**
-   * Set a new name to an existing mailbox
-   *
-   * @param string Mailbox to rename (as utf-7 string)
-   * @param string New mailbox name (as utf-7 string)
-   * @return string Name of the renames mailbox, False on error
-   */
-  function rename_mailbox($mbox_name, $new_name)
-    {
-    $result = FALSE;
-
-    // replace backslashes
-    $name = preg_replace('/[\\\]+/', '-', $new_name);
-        
-    // encode mailbox name and reduce it to 100 chars
-    $name = substr($new_name, 0, 100);
-
-    // make absolute path
-    $mailbox = $this->_mod_mailbox($mbox_name);
-    $abs_name = $this->_mod_mailbox($name);
-    
-    // check if mailbox is subscribed
-    $a_subscribed = $this->_list_mailboxes();
-    $subscribed = in_array($mailbox, $a_subscribed);
-    
-    // unsubscribe folder
-    if ($subscribed)
-      iil_C_UnSubscribe($this->conn, $mailbox);
-
-    if (strlen($abs_name))
-      $result = iil_C_RenameFolder($this->conn, $mailbox, $abs_name);
-
-    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');      
-      }
-
-    // try to subscribe it
-    if ($result && $subscribed)
-      iil_C_Subscribe($this->conn, $abs_name);
-
-    return $result ? $name : FALSE;
-    }
-
-
-  /**
-   * Remove mailboxes from server
-   *
-   * @param string Mailbox name
-   * @return boolean True on success
-   */
-  function delete_mailbox($mbox_name)
-    {
-    $deleted = FALSE;
-
-    if (is_array($mbox_name))
-      $a_mboxes = $mbox_name;
-    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)
-        {
-        $mailbox = $this->_mod_mailbox($mbox_name);
-
-        // unsubscribe mailbox before deleting
-        iil_C_UnSubscribe($this->conn, $mailbox);
-
-        // send delete command to server
-        $result = iil_C_DeleteFolder($this->conn, $mailbox);
-        if ($result>=0)
-          $deleted = TRUE;
-
-        foreach ($all_mboxes as $c_mbox)
-          {
-          $regex = preg_quote($mailbox . $this->delimiter, '/');
-          $regex = '/^' . $regex . '/';
-          if (preg_match($regex, $c_mbox))
-            {
-            iil_C_UnSubscribe($this->conn, $c_mbox);
-            $result = iil_C_DeleteFolder($this->conn, $c_mbox);
-            if ($result>=0)
-              $deleted = TRUE;
-            }
-          }
-        }
-
-    // clear mailboxlist cache
-    if ($deleted)
-      {
-      $this->clear_message_cache($mailbox.'.msg');
-      $this->clear_cache('mailboxes');
-      }
-
-    return $deleted;
-    }
-
-
-  /**
-   * Create all folders specified as default
-   */
-  function create_default_folders()
-    {
-    $a_folders = iil_C_ListMailboxes($this->conn, $this->_mod_mailbox(''), '*');
-    $a_subscribed = iil_C_ListSubscribed($this->conn, $this->_mod_mailbox(''), '*');
-    
-    // create default folders if they do not exist
-    foreach ($this->default_folders as $folder)
-      {
-      $abs_name = $this->_mod_mailbox($folder);
-      if (!in_array_nocase($abs_name, $a_folders))
-        $this->create_mailbox($folder, TRUE);
-      else if (!in_array_nocase($abs_name, $a_subscribed))
-        $this->subscribe($folder);
-      }
-    }
-
-
-
-  /* --------------------------------
-   *   internal caching methods
-   * --------------------------------*/
-
-  /**
-   * @access private
-   */
-  function set_caching($set)
-    {
-    if ($set && is_object($this->db))
-      $this->caching_enabled = TRUE;
-    else
-      $this->caching_enabled = FALSE;
-    }
-
-  /**
-   * @access private
-   */
-  function get_cache($key)
-    {
-    // read cache
-    if (!isset($this->cache[$key]) && $this->caching_enabled)
-      {
-      $cache_data = $this->_read_cache_record('IMAP.'.$key);
-      $this->cache[$key] = strlen($cache_data) ? unserialize($cache_data) : FALSE;
-      }
-    
-    return $this->cache[$key];
-    }
-
-  /**
-   * @access private
-   */
-  function update_cache($key, $data)
-    {
-    $this->cache[$key] = $data;
-    $this->cache_changed = TRUE;
-    $this->cache_changes[$key] = TRUE;
-    }
-
-  /**
-   * @access private
-   */
-  function write_cache()
-    {
-    if ($this->caching_enabled && $this->cache_changed)
-      {
-      foreach ($this->cache as $key => $data)
-        {
-        if ($this->cache_changes[$key])
-          $this->_write_cache_record('IMAP.'.$key, serialize($data));
-        }
-      }    
-    }
-
-  /**
-   * @access private
-   */
-  function clear_cache($key=NULL)
-    {
-    if ($key===NULL)
-      {
-      foreach ($this->cache as $key => $data)
-        $this->_clear_cache_record('IMAP.'.$key);
-
-      $this->cache = array();
-      $this->cache_changed = FALSE;
-      $this->cache_changes = array();
-      }
-    else
-      {
-      $this->_clear_cache_record('IMAP.'.$key);
-      $this->cache_changes[$key] = FALSE;
-      unset($this->cache[$key]);
-      }
-    }
-
-  /**
-   * @access private
-   */
-  function _read_cache_record($key)
-    {
-    $cache_data = FALSE;
-    
-    if ($this->db)
-      {
-      // get cached data from DB
-      $sql_result = $this->db->query(
-        "SELECT cache_id, data
-         FROM ".get_table_name('cache')."
-         WHERE  user_id=?
-         AND    cache_key=?",
-        $_SESSION['user_id'],
-        $key);
-
-      if ($sql_arr = $this->db->fetch_assoc($sql_result))
-        {
-        $cache_data = $sql_arr['data'];
-        $this->cache_keys[$key] = $sql_arr['cache_id'];
-        }
-      }
-
-    return $cache_data;
-    }
-
-  /**
-   * @access private
-   */
-  function _write_cache_record($key, $data)
-    {
-    if (!$this->db)
-      return FALSE;
-
-    // check if we already have a cache entry for this key
-    if (!isset($this->cache_keys[$key]))
-      {
-      $sql_result = $this->db->query(
-        "SELECT cache_id
-         FROM ".get_table_name('cache')."
-         WHERE  user_id=?
-         AND    cache_key=?",
-        $_SESSION['user_id'],
-        $key);
-                                     
-      if ($sql_arr = $this->db->fetch_assoc($sql_result))
-        $this->cache_keys[$key] = $sql_arr['cache_id'];
-      else
-        $this->cache_keys[$key] = FALSE;
-      }
-
-    // update existing cache record
-    if ($this->cache_keys[$key])
-      {
-      $this->db->query(
-        "UPDATE ".get_table_name('cache')."
-         SET    created=".$this->db->now().",
-                data=?
-         WHERE  user_id=?
-         AND    cache_key=?",
-        $data,
-        $_SESSION['user_id'],
-        $key);
-      }
-    // add new cache record
-    else
-      {
-      $this->db->query(
-        "INSERT INTO ".get_table_name('cache')."
-         (created, user_id, cache_key, data)
-         VALUES (".$this->db->now().", ?, ?, ?)",
-        $_SESSION['user_id'],
-        $key,
-        $data);
-      }
-    }
-
-  /**
-   * @access private
-   */
-  function _clear_cache_record($key)
-    {
-    $this->db->query(
-      "DELETE FROM ".get_table_name('cache')."
-       WHERE  user_id=?
-       AND    cache_key=?",
-      $_SESSION['user_id'],
-      $key);
-    }
-
-
-
-  /* --------------------------------
-   *   message caching methods
-   * --------------------------------*/
-   
-
-  /**
-   * 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)
-      return -3;
-
-    $cache_index = $this->get_message_cache_index($cache_key, TRUE);
-    $msg_count = $this->_messagecount($mailbox);
-    $cache_count = count($cache_index);
-
-    // console("Cache check: $msg_count !== ".count($cache_index));
-
-    if ($cache_count==$msg_count)
-      {
-      // get highest index
-      $header = iil_C_FetchHeader($this->conn, $mailbox, "$msg_count");
-      $cache_uid = array_pop($cache_index);
-      
-      // uids of highest message matches -> cache seems OK
-      if ($cache_uid == $header->uid)
-        return 1;
-
-      // cache is dirty
-      return -1;
-      }
-    // if cache count differs less than 10% report as dirty
-    else if (abs($msg_count - $cache_count) < $msg_count/10)
-      return -1;
-    else
-      return -2;
-    }
-
-  /**
-   * @access private
-   */
-  function get_message_cache($key, $from, $to, $sort_field, $sort_order)
-    {
-    $cache_key = "$key:$from:$to:$sort_field:$sort_order";
-    $db_header_fields = array('idx', 'uid', 'subject', 'from', 'to', 'cc', 'date', 'size');
-    
-    if (!in_array($sort_field, $db_header_fields))
-      $sort_field = 'idx';
-    
-    if ($this->caching_enabled && !isset($this->cache[$cache_key]))
-      {
-      $this->cache[$cache_key] = array();
-      $sql_result = $this->db->limitquery(
-        "SELECT idx, uid, headers
-         FROM ".get_table_name('messages')."
-         WHERE  user_id=?
-         AND    cache_key=?
-         ORDER BY ".$this->db->quoteIdentifier($sort_field)." ".
-         strtoupper($sort_order),
-        $from,
-        $to-$from,
-        $_SESSION['user_id'],
-        $key);
-
-      while ($sql_arr = $this->db->fetch_assoc($sql_result))
-        {
-        $uid = $sql_arr['uid'];
-        $this->cache[$cache_key][$uid] = 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)
-    {
-    $internal_key = '__single_msg';
-    
-    if ($this->caching_enabled && (!isset($this->cache[$internal_key][$uid]) ||
-        ($struct && empty($this->cache[$internal_key][$uid]->structure))))
-      {
-      $sql_select = "idx, uid, headers" . ($struct ? ", structure" : '');
-      $sql_result = $this->db->query(
-        "SELECT $sql_select
-         FROM ".get_table_name('messages')."
-         WHERE  user_id=?
-         AND    cache_key=?
-         AND    uid=?",
-        $_SESSION['user_id'],
-        $key,
-        $uid);
-
-      if ($sql_arr = $this->db->fetch_assoc($sql_result))
-        {
-        $this->cache[$internal_key][$uid] = unserialize($sql_arr['headers']);
-        if (is_object($this->cache[$internal_key][$uid]) && !empty($sql_arr['structure']))
-          $this->cache[$internal_key][$uid]->structure = unserialize($sql_arr['structure']);
-        }
-      }
-
-    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();
-    
-    // empty key -> empty array
-    if (!$this->caching_enabled || empty($key))
-      return array();
-    
-    if (!empty($sa_message_index[$key]) && !$force)
-      return $sa_message_index[$key];
-    
-    $sa_message_index[$key] = array();
-    $sql_result = $this->db->query(
-      "SELECT idx, uid
-       FROM ".get_table_name('messages')."
-       WHERE  user_id=?
-       AND    cache_key=?
-       ORDER BY ".$this->db->quote_identifier($sort_col)." ".$sort_order,
-      $_SESSION['user_id'],
-      $key);
-
-    while ($sql_arr = $this->db->fetch_assoc($sql_result))
-      $sa_message_index[$key][$sql_arr['idx']] = $sql_arr['uid'];
-      
-    return $sa_message_index[$key];
-    }
-
-  /**
-   * @access private
-   */
-  function add_message_cache($key, $index, $headers, $struct=null)
-    {
-    if (empty($key) || !is_object($headers) || empty($headers->uid))
-        return;
-    
-    // add to internal (fast) cache
-    $this->cache['__single_msg'][$headers->uid] = $headers;
-    $this->cache['__single_msg'][$headers->uid]->structure = $struct;
-    
-    // no further caching
-    if (!$this->caching_enabled)
-      return;
-    
-    // check for an existing record (probly headers are cached but structure not)
-    $sql_result = $this->db->query(
-        "SELECT message_id
-         FROM ".get_table_name('messages')."
-         WHERE  user_id=?
-         AND    cache_key=?
-         AND    uid=?
-         AND    del<>1",
-        $_SESSION['user_id'],
-        $key,
-        $headers->uid);
-
-    // update cache record
-    if ($sql_arr = $this->db->fetch_assoc($sql_result))
-      {
-      $this->db->query(
-        "UPDATE ".get_table_name('messages')."
-         SET   idx=?, headers=?, structure=?
-         WHERE message_id=?",
-        $index,
-        serialize($headers),
-        is_object($struct) ? serialize($struct) : NULL,
-        $sql_arr['message_id']
-        );
-      }
-    else  // insert new record
-      {
-      $this->db->query(
-        "INSERT INTO ".get_table_name('messages')."
-         (user_id, del, cache_key, created, idx, uid, subject, ".$this->db->quoteIdentifier('from').", ".$this->db->quoteIdentifier('to').", cc, date, size, headers, structure)
-         VALUES (?, 0, ?, ".$this->db->now().", ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?, ?)",
-        $_SESSION['user_id'],
-        $key,
-        $index,
-        $headers->uid,
-        (string)substr($this->decode_header($headers->subject, TRUE), 0, 128),
-        (string)substr($this->decode_header($headers->from, TRUE), 0, 128),
-        (string)substr($this->decode_header($headers->to, TRUE), 0, 128),
-        (string)substr($this->decode_header($headers->cc, TRUE), 0, 128),
-        (int)$headers->size,
-        serialize($headers),
-        is_object($struct) ? serialize($struct) : NULL
-        );
-      }
-    }
-    
-  /**
-   * @access private
-   */
-  function remove_message_cache($key, $index)
-    {
-    if (!$this->caching_enabled)
-      return;
-    
-    $this->db->query(
-      "DELETE FROM ".get_table_name('messages')."
-       WHERE  user_id=?
-       AND    cache_key=?
-       AND    idx=?",
-      $_SESSION['user_id'],
-      $key,
-      $index);
-    }
-
-  /**
-   * @access private
-   */
-  function clear_message_cache($key, $start_index=1)
-    {
-    if (!$this->caching_enabled)
-      return;
-    
-    $this->db->query(
-      "DELETE FROM ".get_table_name('messages')."
-       WHERE  user_id=?
-       AND    cache_key=?
-       AND    idx>=?",
-      $_SESSION['user_id'],
-      $key,
-      $start_index);
-    }
-
-
-
-
-  /* --------------------------------
-   *   encoding/decoding methods
-   * --------------------------------*/
-
-  /**
-   * Split an address list into a structured array list
-   *
-   * @param string  Input string
-   * @param int     List only this number of addresses
-   * @param boolean Decode address strings
-   * @return array  Indexed list of addresses
-   */
-  function decode_address_list($input, $max=null, $decode=true)
-    {
-    $a = $this->_parse_address_list($input, $decode);
-    $out = array();
-    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
-    $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]';
-    
-    if (!is_array($a))
-      return $out;
-
-    $c = count($a);
-    $j = 0;
-
-    foreach ($a as $val)
-      {
-      $j++;
-      $address = $val['address'];
-      $name = preg_replace(array('/^[\'"]/', '/[\'"]$/'), '', trim($val['name']));
-      if ($name && $address && $name != $address)
-        $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
-      else if ($address)
-        $string = $address;
-      else if ($name)
-        $string = $name;
-      
-      $out[$j] = array('name' => $name,
-                       'mailto' => $address,
-                       'string' => $string);
-              
-      if ($max && $j==$max)
-        break;
-      }
-    
-    return $out;
-    }
-
-
-  /**
-   * Decode a message header value
-   *
-   * @param string  Header value
-   * @param boolean Remove quotes if necessary
-   * @return string Decoded string
-   */
-  function decode_header($input, $remove_quotes=FALSE)
-    {
-    $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset);
-    if ($str{0}=='"' && $remove_quotes)
-      $str = str_replace('"', '', $str);
-    
-    return $str;
-    }
-
-
-  /**
-   * Decode a mime-encoded string to internal charset
-   *
-   * @param string  Header value
-   * @param string  Fallback charset if none specified
-   * @return string Decoded string
-   * @static
-   */
-  function decode_mime_string($input, $fallback=null)
-    {
-    $out = '';
-
-    $pos = strpos($input, '=?');
-    if ($pos !== false)
-      {
-      // rfc: all line breaks or other characters not found in the Base64 Alphabet must be ignored by decoding software
-      // delete all blanks between MIME-lines, differently we can receive unnecessary blanks and broken utf-8 symbols
-      $input = preg_replace("/\?=\s+=\?/", '?==?', $input);
-
-      $out = substr($input, 0, $pos);
-  
-      $end_cs_pos = strpos($input, "?", $pos+2);
-      $end_en_pos = strpos($input, "?", $end_cs_pos+1);
-      $end_pos = strpos($input, "?=", $end_en_pos+1);
-  
-      $encstr = substr($input, $pos+2, ($end_pos-$pos-2));
-      $rest = substr($input, $end_pos+2);
-
-      $out .= rcube_imap::_decode_mime_string_part($encstr);
-      $out .= rcube_imap::decode_mime_string($rest, $fallback);
-
-      return $out;
-      }
-      
-    // no encoding information, use fallback
-    return rcube_charset_convert($input, !empty($fallback) ? $fallback : 'ISO-8859-1');
-    }
-
-
-  /**
-   * Decode a part of a mime-encoded string
-   *
-   * @access private
-   */
-  function _decode_mime_string_part($str)
-    {
-    $a = explode('?', $str);
-    $count = count($a);
-
-    // should be in format "charset?encoding?base64_string"
-    if ($count >= 3)
-      {
-      for ($i=2; $i<$count; $i++)
-        $rest.=$a[$i];
-
-      if (($a[1]=="B")||($a[1]=="b"))
-        $rest = base64_decode($rest);
-      else if (($a[1]=="Q")||($a[1]=="q"))
-        {
-        $rest = str_replace("_", " ", $rest);
-        $rest = quoted_printable_decode($rest);
-        }
-
-      return rcube_charset_convert($rest, $a[0]);
-      }
-    else
-      return $str;    // we dont' know what to do with this  
-    }
-
-
-  /**
-   * Decode a mime part
-   *
-   * @param string Input string
-   * @param string Part encoding
-   * @return string Decoded string
-   * @access private
-   */
-  function mime_decode($input, $encoding='7bit')
-    {
-    switch (strtolower($encoding))
-      {
-      case '7bit':
-        return $input;
-        break;
-      
-      case 'quoted-printable':
-        return quoted_printable_decode($input);
-        break;
-      
-      case 'base64':
-        return base64_decode($input);
-        break;
-      
-      default:
-        return $input;
-      }
-    }
-
-
-  /**
-   * 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']))
-      return rcube_charset_convert($body, $ctype_param['charset']);
-
-    // defaults to what is specified in the class header
-    return rcube_charset_convert($body,  $this->default_charset);
-    }
-
-
-  /**
-   * Translate UID to message ID
-   *
-   * @param int    Message UID
-   * @param string Mailbox name
-   * @return int   Message ID
-   */
-  function get_id($uid, $mbox_name=NULL) 
-    {
-      $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);
-    }
-
-
-
-  /* --------------------------------
-   *         private methods
-   * --------------------------------*/
-
-
-  /**
-   * @access private
-   */
-  function _mod_mailbox($mbox_name, $mode='in')
-    {
-    if ((!empty($this->root_ns) && $this->root_ns == $mbox_name) || $mbox_name == 'INBOX')
-      return $mbox_name;
-
-    if (!empty($this->root_dir) && $mode=='in') 
-      $mbox_name = $this->root_dir.$this->delimiter.$mbox_name;
-    else if (strlen($this->root_dir) && $mode=='out') 
-      $mbox_name = substr($mbox_name, strlen($this->root_dir)+1);
-
-    return $mbox_name;
-    }
-
-  /**
-   * Validate the given input and save to local properties
-   * @access private
-   */
-  function _set_sort_order($sort_field, $sort_order)
-  {
-    if ($sort_field != null)
-      $this->sort_field = asciiwords($sort_field);
-    if ($sort_order != null)
-      $this->sort_order = strtoupper($sort_order) == 'DESC' ? 'DESC' : 'ASC';
-  }
-
-  /**
-   * Sort mailboxes first by default folders and then in alphabethical order
-   * @access private
-   */
-  function _sort_mailbox_list($a_folders)
-    {
-    $a_out = $a_defaults = array();
-
-    // find default folders and skip folders starting with '.'
-    foreach($a_folders as $i => $folder)
-      {
-      if ($folder{0}=='.')
-        continue;
-
-      if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
-        $a_defaults[$p] = $folder;
-      else
-        $a_out[] = $folder;
-      }
-
-    natcasesort($a_out);
-    ksort($a_defaults);
-    
-    return array_merge($a_defaults, $a_out);
-    }
-
-  /**
-   * @access private
-   */
-  function _uid2id($uid, $mbox_name=NULL)
-    {
-    if (!$mbox_name)
-      $mbox_name = $this->mailbox;
-      
-    if (!isset($this->uid_id_map[$mbox_name][$uid]))
-      $this->uid_id_map[$mbox_name][$uid] = iil_C_UID2ID($this->conn, $mbox_name, $uid);
-
-    return $this->uid_id_map[$mbox_name][$uid];
-    }
-
-  /**
-   * @access private
-   */
-  function _id2uid($id, $mbox_name=NULL)
-    {
-    if (!$mbox_name)
-      $mbox_name = $this->mailbox;
-      
-    $index = array_flip((array)$this->uid_id_map[$mbox_name]);
-    if (isset($index[$id]))
-      $uid = $index[$id];
-    else
-      {
-      $uid = iil_C_ID2UID($this->conn, $mbox_name, $id);
-      $this->uid_id_map[$mbox_name][$uid] = $id;
-      }
-    
-    return $uid;
-    }
-
-
-  /**
-   * Parse string or array of server capabilities and put them in internal array
-   * @access private
-   */
-  function _parse_capability($caps)
-    {
-    if (!is_array($caps))
-      $cap_arr = explode(' ', $caps);
-    else
-      $cap_arr = $caps;
-    
-    foreach ($cap_arr as $cap)
-      {
-      if ($cap=='CAPABILITY')
-        continue;
-
-      if (strpos($cap, '=')>0)
-        {
-        list($key, $value) = explode('=', $cap);
-        if (!is_array($this->capabilities[$key]))
-          $this->capabilities[$key] = array();
-          
-        $this->capabilities[$key][] = $value;
-        }
-      else
-        $this->capabilities[$cap] = TRUE;
-      }
-    }
-
-
-  /**
-   * Subscribe/unsubscribe a list of mailboxes and update local cache
-   * @access private
-   */
-  function _change_subscription($a_mboxes, $mode)
-    {
-    $updated = FALSE;
-    
-    if (is_array($a_mboxes))
-      foreach ($a_mboxes as $i => $mbox_name)
-        {
-        $mailbox = $this->_mod_mailbox($mbox_name);
-        $a_mboxes[$i] = $mailbox;
-
-        if ($mode=='subscribe')
-          $result = iil_C_Subscribe($this->conn, $mailbox);
-        else if ($mode=='unsubscribe')
-          $result = iil_C_UnSubscribe($this->conn, $mailbox);
-
-        if ($result>=0)
-          $updated = TRUE;
-        }
-        
-    // get cached mailbox list    
-    if ($updated)
-      {
-      $a_mailbox_cache = $this->get_cache('mailboxes');
-      if (!is_array($a_mailbox_cache))
-        return $updated;
-
-      // modify cached list
-      if ($mode=='subscribe')
-        $a_mailbox_cache = array_merge($a_mailbox_cache, $a_mboxes);
-      else if ($mode=='unsubscribe')
-        $a_mailbox_cache = array_diff($a_mailbox_cache, $a_mboxes);
-        
-      // write mailboxlist to cache
-      $this->update_cache('mailboxes', $this->_sort_mailbox_list($a_mailbox_cache));
-      }
-
-    return $updated;
-    }
-
-
-  /**
-   * Increde/decrese messagecount for a specific mailbox
-   * @access private
-   */
-  function _set_messagecount($mbox_name, $mode, $increment)
-    {
-    $a_mailbox_cache = FALSE;
-    $mailbox = $mbox_name ? $mbox_name : $this->mailbox;
-    $mode = strtoupper($mode);
-
-    $a_mailbox_cache = $this->get_cache('messagecount');
-    
-    if (!is_array($a_mailbox_cache[$mailbox]) || !isset($a_mailbox_cache[$mailbox][$mode]) || !is_numeric($increment))
-      return FALSE;
-    
-    // add incremental value to messagecount
-    $a_mailbox_cache[$mailbox][$mode] += $increment;
-    
-    // there's something wrong, delete from cache
-    if ($a_mailbox_cache[$mailbox][$mode] < 0)
-      unset($a_mailbox_cache[$mailbox][$mode]);
-
-    // write back to cache
-    $this->update_cache('messagecount', $a_mailbox_cache);
-    
-    return TRUE;
-    }
-
-
-  /**
-   * Remove messagecount of a specific mailbox from cache
-   * @access private
-   */
-  function _clear_messagecount($mbox_name='')
-    {
-    $a_mailbox_cache = FALSE;
-    $mailbox = $mbox_name ? $mbox_name : $this->mailbox;
-
-    $a_mailbox_cache = $this->get_cache('messagecount');
-
-    if (is_array($a_mailbox_cache[$mailbox]))
-      {
-      unset($a_mailbox_cache[$mailbox]);
-      $this->update_cache('messagecount', $a_mailbox_cache);
-      }
-    }
-
-
-  /**
-   * Split RFC822 header string into an associative array
-   * @access private
-   */
-  function _parse_headers($headers)
-    {
-    $a_headers = array();
-    $lines = explode("\n", $headers);
-    $c = count($lines);
-    for ($i=0; $i<$c; $i++)
-      {
-      if ($p = strpos($lines[$i], ': '))
-        {
-        $field = strtolower(substr($lines[$i], 0, $p));
-        $value = trim(substr($lines[$i], $p+1));
-        if (!empty($value))
-          $a_headers[$field] = $value;
-        }
-      }
-    
-    return $a_headers;
-    }
-
-
-  /**
-   * @access private
-   */
-  function _parse_address_list($str, $decode=true)
-    {
-    // remove any newlines and carriage returns before
-    $a = $this->_explode_quoted_string('[,;]', preg_replace( "/[\r\n]/", " ", $str));
-    $result = array();
-    
-    foreach ($a as $key => $val)
-      {
-      $val = preg_replace("/([\"\w])</", "$1 <", $val);
-      $sub_a = $this->_explode_quoted_string(' ', $decode ? $this->decode_header($val) : $val);
-      $result[$key]['name'] = '';
-
-      foreach ($sub_a as $k => $v)
-        {
-        if (strpos($v, '@') > 0)
-          $result[$key]['address'] = str_replace('<', '', str_replace('>', '', $v));
-        else
-          $result[$key]['name'] .= (empty($result[$key]['name'])?'':' ').str_replace("\"",'',stripslashes($v));
-        }
-        
-      if (empty($result[$key]['name']))
-        $result[$key]['name'] = $result[$key]['address'];        
-      }
-    
-    return $result;
-    }
-
-
-  /**
-   * @access private
-   */
-  function _explode_quoted_string($delimiter, $string)
-    {
-    $result = array();
-    $strlen = strlen($string);
-    for ($q=$p=$i=0; $i < $strlen; $i++)
-    {
-      if ($string{$i} == "\"" && $string{$i-1} != "\\")
-        $q = $q ? false : true;
-      else if (!$q && preg_match("/$delimiter/", $string{$i}))
-      {
-        $result[] = substr($string, $p, $i - $p);
-        $p = $i + 1;
-      }
-    }
-    
-    $result[] = substr($string, $p);
-    return $result;
-    }
-
-}  // end class rcube_imap
-
-
-/**
- * Class representing a message part
- *
- * @package Mail
- */
-class rcube_message_part
-{
-  var $mime_id = '';
-  var $ctype_primary = 'text';
-  var $ctype_secondary = 'plain';
-  var $mimetype = 'text/plain';
-  var $disposition = '';
-  var $filename = '';
-  var $encoding = '8bit';
-  var $charset = '';
-  var $size = 0;
-  var $headers = array();
-  var $d_parameters = array();
-  var $ctype_parameters = array();
-
-}
-
-
-/**
- * Class for sorting an array of iilBasicHeader objects in a predetermined order.
- *
- * @package Mail
- * @author Eric Stadtherr
- */
-class rcube_header_sorter
-{
-   var $sequence_numbers = array();
-   
-   /**
-    * Set the predetermined sort order.
-    *
-    * @param array Numerically indexed array of IMAP message sequence numbers
-    */
-   function set_sequence_numbers($seqnums)
-   {
-      $this->sequence_numbers = $seqnums;
-   }
-   /**
-    * Sort the array of header objects
-    *
-    * @param array Array of iilBasicHeader objects indexed by UID
-    */
-   function sort_headers(&$headers)
-   {
-      /*
-       * uksort would work if the keys were the sequence number, but unfortunately
-       * the keys are the UIDs.  We'll use uasort instead and dereference the value
-       * to get the sequence number (in the "id" field).
-       * 
-       * uksort($headers, array($this, "compare_seqnums")); 
-       */
-       uasort($headers, array($this, "compare_seqnums"));
-   }
-   /**
-    * Get the position of a message sequence number in my sequence_numbers array
-    *
-    * @param int Message sequence number contained in sequence_numbers
-    * @return int Position, -1 if not found
-    */
-   function position_of($seqnum)
-   {
-      $c = count($this->sequence_numbers);
-      for ($pos = 0; $pos <= $c; $pos++)
-      {
-         if ($this->sequence_numbers[$pos] == $seqnum)
-            return $pos;
-      }
-      return -1;
-   }
-   /**
-    * Sort method called by uasort()
-    */
-   function compare_seqnums($a, $b)
-   {
-      // First get the sequence number from the header object (the 'id' field).
-      $seqa = $a->id;
-      $seqb = $b->id;
-      
-      // then find each sequence number in my ordered list
-      $posa = $this->position_of($seqa);
-      $posb = $this->position_of($seqb);
-      
-      // return the relative position as the comparison value
-      $ret = $posa - $posb;
-      return $ret;
-   }
-}
-
-
-/**
- * Add quoted-printable encoding to a given 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)
-  {
-  $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
-  $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
-  $eol = "\r\n";
-  $escape = "=";
-  $output = "";
-
-  while( list(, $line) = each($lines))
-    {
-    //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
-    $linlen = strlen($line);
-    $newline = "";
-    for($i = 0; $i < $linlen; $i++)
-      {
-      $c = substr( $line, $i, 1 );
-      $dec = ord( $c );
-      if ( ( $i == 0 ) && ( $dec == 46 ) ) // convert first point in the line into =2E
-        {
-        $c = "=2E";
-        }
-      if ( $dec == 32 )
-        {
-        if ( $i == ( $linlen - 1 ) ) // convert space at eol only
-          {
-          $c = "=20";
-          }
-        else if ( $space_conv )
-          {
-          $c = "=20";
-          }
-        }
-      else if ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) )  // always encode "\t", which is *not* required
-        {
-        $h2 = floor($dec/16);
-        $h1 = floor($dec%16);
-        $c = $escape.$hex["$h2"].$hex["$h1"];
-        }
-         
-      if ( (strlen($newline) + strlen($c)) >= $line_max )  // CRLF is not counted
-        {
-        $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
-        $newline = "";
-        // check if newline first character will be point or not
-        if ( $dec == 46 )
-          {
-          $c = "=2E";
-          }
-        }
-      $newline .= $c;
-      } // end of for
-    $output .= $newline.$eol;
-    } // end of while
-
-  return trim($output);
-  }
-
-
-?>
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
new file mode 100644 (file)
index 0000000..e73ec64
--- /dev/null
@@ -0,0 +1,2919 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_imap.php                                        |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   IMAP wrapper that implements the Iloha IMAP Library (IIL)           |
+ |   See http://ilohamail.org/ for details                               |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_imap.php 1490 2008-06-07 18:48:59Z alec $
+
+*/
+
+
+/*
+ * Obtain classes from the Iloha IMAP library
+ */
+require_once('lib/imap.inc');
+require_once('lib/mime.inc');
+
+
+/**
+ * Interface class for accessing an IMAP server
+ *
+ * This is a wrapper that implements the Iloha IMAP Library (IIL)
+ *
+ * @package    Mail
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ * @version    1.40
+ * @link       http://ilohamail.org
+ */
+class rcube_imap
+{
+  var $db;
+  var $conn;
+  var $root_ns = '';
+  var $root_dir = '';
+  var $mailbox = 'INBOX';
+  var $list_page = 1;
+  var $page_size = 10;
+  var $sort_field = 'date';
+  var $sort_order = 'DESC';
+  var $delimiter = NULL;
+  var $caching_enabled = FALSE;
+  var $default_charset = 'ISO-8859-1';
+  var $default_folders = array('INBOX');
+  var $default_folders_lc = array('inbox');
+  var $cache = array();
+  var $cache_keys = array();  
+  var $cache_changes = array();
+  var $uid_id_map = array();
+  var $msg_headers = array();
+  var $capabilities = array();
+  var $skip_deleted = FALSE;
+  var $search_set = NULL;
+  var $search_subject = '';
+  var $search_string = '';
+  var $search_charset = '';
+  var $debug_level = 1;
+  var $error_code = 0;
+
+
+  /**
+   * Object constructor
+   *
+   * @param object DB Database connection
+   */
+  function __construct($db_conn)
+    {
+    $this->db = $db_conn;
+    }
+
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see  rcube_imap::__construct
+   */
+  function rcube_imap($db_conn)
+    {
+    $this->__construct($db_conn);
+    }
+
+
+  /**
+   * Connect to an IMAP server
+   *
+   * @param  string   Host to connect
+   * @param  string   Username for IMAP account
+   * @param  string   Password for IMAP account
+   * @param  number   Port to connect to
+   * @param  string   SSL schema (either ssl or tls) or null if plain connection
+   * @return boolean  TRUE on success, FALSE on failure
+   * @access public
+   */
+  function connect($host, $user, $pass, $port=143, $use_ssl=null, $auth_type='check')
+    {
+    global $ICL_SSL, $ICL_PORT, $IMAP_USE_INTERNAL_DATE;
+    
+    // check for Open-SSL support in PHP build
+    if ($use_ssl && in_array('openssl', get_loaded_extensions()))
+      $ICL_SSL = $use_ssl == 'imaps' ? 'ssl' : $use_ssl;
+    else if ($use_ssl)
+      {
+      raise_error(array('code' => 403, 'type' => 'imap', 'file' => __FILE__,
+                        'message' => 'Open SSL not available;'), TRUE, FALSE);
+      $port = 143;
+      }
+
+    $ICL_PORT = $port;
+    $IMAP_USE_INTERNAL_DATE = false;
+
+    $this->conn = iil_Connect($host, $user, $pass, array('imap' => $auth_type));
+    $this->host = $host;
+    $this->user = $user;
+    $this->pass = $pass;
+    $this->port = $port;
+    $this->ssl = $use_ssl;
+    
+    // print trace mesages
+    if ($this->conn && ($this->debug_level & 8))
+      console($this->conn->message);
+    
+    // write error log
+    else if (!$this->conn && $GLOBALS['iil_error'])
+      {
+      $this->error_code = $GLOBALS['iil_errornum'];
+      raise_error(array('code' => 403,
+                       'type' => 'imap',
+                       'message' => $GLOBALS['iil_error']), TRUE, FALSE);
+      }
+
+    // get server properties
+    if ($this->conn)
+      {
+      $this->_parse_capability($this->conn->capability);
+      
+      if (!empty($this->conn->delimiter))
+        $this->delimiter = $this->conn->delimiter;
+      if (!empty($this->conn->rootdir))
+        {
+        $this->set_rootdir($this->conn->rootdir);
+        $this->root_ns = ereg_replace('[\.\/]$', '', $this->conn->rootdir);
+        }
+      }
+
+    return $this->conn ? TRUE : FALSE;
+    }
+
+
+  /**
+   * Close IMAP connection
+   * Usually done on script shutdown
+   *
+   * @access public
+   */
+  function close()
+    {    
+    if ($this->conn)
+      iil_Close($this->conn);
+    }
+
+
+  /**
+   * Close IMAP connection and re-connect
+   * This is used to avoid some strange socket errors when talking to Courier IMAP
+   *
+   * @access public
+   */
+  function reconnect()
+    {
+    $this->close();
+    $this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl);
+    }
+
+
+  /**
+   * Set a root folder for the IMAP connection.
+   *
+   * Only folders within this root folder will be displayed
+   * and all folder paths will be translated using this folder name
+   *
+   * @param  string   Root folder
+   * @access public
+   */
+  function set_rootdir($root)
+    {
+    if (ereg('[\.\/]$', $root)) //(substr($root, -1, 1)==='/')
+      $root = substr($root, 0, -1);
+
+    $this->root_dir = $root;
+    
+    if (empty($this->delimiter))
+      $this->get_hierarchy_delimiter();
+    }
+
+
+  /**
+   * Set default message charset
+   *
+   * This will be used for message decoding if a charset specification is not available
+   *
+   * @param  string   Charset string
+   * @access public
+   */
+  function set_charset($cs)
+    {
+    $this->default_charset = $cs;
+    }
+
+
+  /**
+   * This list of folders will be listed above all other folders
+   *
+   * @param  array  Indexed list of folder names
+   * @access public
+   */
+  function set_default_mailboxes($arr)
+    {
+    if (is_array($arr))
+      {
+      $this->default_folders = $arr;
+      $this->default_folders_lc = array();
+
+      // add inbox if not included
+      if (!in_array_nocase('INBOX', $this->default_folders))
+        array_unshift($this->default_folders, 'INBOX');
+
+      // create a second list with lower cased names
+      foreach ($this->default_folders as $mbox)
+        $this->default_folders_lc[] = strtolower($mbox);
+      }
+    }
+
+
+  /**
+   * Set internal mailbox reference.
+   *
+   * All operations will be perfomed on this mailbox/folder
+   *
+   * @param  string  Mailbox/Folder name
+   * @access public
+   */
+  function set_mailbox($new_mbox)
+    {
+    $mailbox = $this->_mod_mailbox($new_mbox);
+
+    if ($this->mailbox == $mailbox)
+      return;
+
+    $this->mailbox = $mailbox;
+
+    // clear messagecount cache for this mailbox
+    $this->_clear_messagecount($mailbox);
+    }
+
+
+  /**
+   * Set internal list page
+   *
+   * @param  number  Page number to list
+   * @access public
+   */
+  function set_page($page)
+    {
+    $this->list_page = (int)$page;
+    }
+
+
+  /**
+   * Set internal page size
+   *
+   * @param  number  Number of messages to display on one page
+   * @access public
+   */
+  function set_pagesize($size)
+    {
+    $this->page_size = (int)$size;
+    }
+    
+
+  /**
+   * Save a set of message ids for future message listing methods
+   *
+   * @param  array  List of IMAP fields to search in
+   * @param  string Search string
+   * @param  array  List of message ids or NULL if empty
+   */
+  function set_search_set($subject, $str=null, $msgs=null, $charset=null)
+    {
+    if (is_array($subject) && $str == null && $msgs == null)
+      list($subject, $str, $msgs, $charset) = $subject;
+    if ($msgs != null && !is_array($msgs))
+      $msgs = split(',', $msgs);
+      
+    $this->search_subject = $subject;
+    $this->search_string = $str;
+    $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()
+    {
+    return array($this->search_subject, $this->search_string, $this->search_set, $this->search_charset);
+    }
+
+
+  /**
+   * Returns the currently used mailbox name
+   *
+   * @return  string Name of the mailbox/folder
+   * @access  public
+   */
+  function get_mailbox_name()
+    {
+    return $this->conn ? $this->_mod_mailbox($this->mailbox, 'out') : '';
+    }
+
+
+  /**
+   * Returns the IMAP server's capability
+   *
+   * @param   string  Capability name
+   * @return  mixed   Capability value or TRUE if supported, FALSE if not
+   * @access  public
+   */
+  function get_capability($cap)
+    {
+    $cap = strtoupper($cap);
+    return $this->capabilities[$cap];
+    }
+
+
+  /**
+   * Returns the delimiter that is used by the IMAP server for folder separation
+   *
+   * @return  string  Delimiter string
+   * @access  public
+   */
+  function get_hierarchy_delimiter()
+    {
+    if ($this->conn && empty($this->delimiter))
+      $this->delimiter = iil_C_GetHierarchyDelimiter($this->conn);
+
+    if (empty($this->delimiter))
+      $this->delimiter = '/';
+
+    return $this->delimiter;
+    }
+
+
+  /**
+   * Public method for mailbox listing.
+   *
+   * Converts mailbox name with root dir first
+   *
+   * @param   string  Optional root folder
+   * @param   string  Optional filter for mailbox listing
+   * @return  array   List of mailboxes/folders
+   * @access  public
+   */
+  function list_mailboxes($root='', $filter='*')
+    {
+    $a_out = array();
+    $a_mboxes = $this->_list_mailboxes($root, $filter);
+
+    foreach ($a_mboxes as $mbox_row)
+      {
+      $name = $this->_mod_mailbox($mbox_row, 'out');
+      if (strlen($name))
+        $a_out[] = $name;
+      }
+
+    // INBOX should always be available
+    if (!in_array_nocase('INBOX', $a_out))
+      array_unshift($a_out, 'INBOX');
+
+    // sort mailboxes
+    $a_out = $this->_sort_mailbox_list($a_out);
+
+    return $a_out;
+    }
+
+
+  /**
+   * Private method for mailbox listing
+   *
+   * @return  array   List of mailboxes/folders
+   * @see     rcube_imap::list_mailboxes()
+   * @access  private
+   */
+  function _list_mailboxes($root='', $filter='*')
+    {
+    $a_defaults = $a_out = array();
+    
+    // get cached folder list    
+    $a_mboxes = $this->get_cache('mailboxes');
+    if (is_array($a_mboxes))
+      return $a_mboxes;
+
+    // retrieve list of folders from IMAP server
+    $a_folders = iil_C_ListSubscribed($this->conn, $this->_mod_mailbox($root), $filter);
+    
+    if (!is_array($a_folders) || !sizeof($a_folders))
+      $a_folders = array();
+
+    // write mailboxlist to cache
+    $this->update_cache('mailboxes', $a_folders);
+    
+    return $a_folders;
+    }
+
+
+  /**
+   * Get message count for a specific mailbox
+   *
+   * @param   string   Mailbox/folder name
+   * @param   string   Mode for count [ALL|UNSEEN|RECENT]
+   * @param   boolean  Force reading from server and update cache
+   * @return  int      Number of messages
+   * @access  public
+   */
+  function messagecount($mbox_name='', $mode='ALL', $force=FALSE)
+    {
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    return $this->_messagecount($mailbox, $mode, $force);
+    }
+
+
+  /**
+   * Private method for getting nr of messages
+   *
+   * @access  private
+   * @see     rcube_imap::messagecount()
+   */
+  function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
+    {
+    $a_mailbox_cache = FALSE;
+    $mode = strtoupper($mode);
+
+    if (empty($mailbox))
+      $mailbox = $this->mailbox;
+      
+    // count search set
+    if ($this->search_string && $mailbox == $this->mailbox && $mode == 'ALL' && !$force)
+      return count((array)$this->search_set);
+
+    $a_mailbox_cache = $this->get_cache('messagecount');
+    
+    // return cached value
+    if (!$force && is_array($a_mailbox_cache[$mailbox]) && isset($a_mailbox_cache[$mailbox][$mode]))
+      return $a_mailbox_cache[$mailbox][$mode];
+
+    // RECENT count is fetched a bit different
+    if ($mode == 'RECENT')
+       $count = iil_C_CheckForRecent($this->conn, $mailbox);
+
+    // use SEARCH for message counting
+    else if ($this->skip_deleted)
+      {
+      $search_str = "ALL UNDELETED";
+
+      // get message count and store in cache
+      if ($mode == 'UNSEEN')
+        $search_str .= " UNSEEN";
+
+      // get message count using SEARCH
+      // not very performant but more precise (using UNDELETED)
+      $count = 0;
+      $index = $this->_search_index($mailbox, $search_str);
+      if (is_array($index))
+        {
+        $str = implode(",", $index);
+        if (!empty($str))
+          $count = count($index);
+        }
+      }
+    else
+      {
+      if ($mode == 'UNSEEN')
+        $count = iil_C_CountUnseen($this->conn, $mailbox);
+      else
+        $count = iil_C_CountMessages($this->conn, $mailbox);
+      }
+
+    if (!is_array($a_mailbox_cache[$mailbox]))
+      $a_mailbox_cache[$mailbox] = array();
+      
+    $a_mailbox_cache[$mailbox][$mode] = (int)$count;
+
+    // write back to cache
+    $this->update_cache('messagecount', $a_mailbox_cache);
+
+    return (int)$count;
+    }
+
+
+  /**
+   * Public method for listing headers
+   * convert mailbox name with root dir first
+   *
+   * @param   string   Mailbox/folder name
+   * @param   int      Current page to list
+   * @param   string   Header field to sort by
+   * @param   string   Sort order [ASC|DESC]
+   * @return  array    Indexed array with message header objects
+   * @access  public   
+   */
+  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL)
+    {
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order);
+    }
+
+
+  /**
+   * Private method for listing message headers
+   *
+   * @access  private
+   * @see     rcube_imap::list_headers
+   */
+  function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE)
+    {
+    if (!strlen($mailbox))
+      return array();
+
+    // use saved message set
+    if ($this->search_string && $mailbox == $this->mailbox)
+      return $this->_list_header_set($mailbox, $this->search_set, $page, $sort_field, $sort_order);
+
+    $this->_set_sort_order($sort_field, $sort_order);
+
+    $max = $this->_messagecount($mailbox);
+    $start_msg = ($this->list_page-1) * $this->page_size;
+
+    list($begin, $end) = $this->_get_message_range($max, $page);
+
+    // mailbox is empty
+    if ($begin >= $end)
+      return array();
+      
+    $headers_sorted = FALSE;
+    $cache_key = $mailbox.'.msg';
+    $cache_status = $this->check_cache_status($mailbox, $cache_key);
+
+    // cache is OK, we can get all messages from local cache
+    if ($cache_status>0)
+      {
+      $a_msg_headers = $this->get_message_cache($cache_key, $start_msg, $start_msg+$this->page_size, $this->sort_field, $this->sort_order);
+      $headers_sorted = TRUE;
+      }
+    // cache is dirty, sync it
+    else if ($this->caching_enabled && $cache_status==-1 && !$recursive)
+      {
+      $this->sync_header_index($mailbox);
+      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE);
+      }
+    else
+      {
+      // retrieve headers from IMAP
+      if ($this->get_capability('sort') && ($msg_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')))
+        {
+        $mymsgidx = array_slice ($msg_index, $begin, $end-$begin);
+        $msgs = join(",", $mymsgidx);
+        }
+      else
+        {
+        $msgs = sprintf("%d:%d", $begin+1, $end);
+        $msg_index = range($begin, $end);
+        }
+
+
+      // fetch reuested headers from server
+      $a_msg_headers = array();
+      $deleted_count = $this->_fetch_headers($mailbox, $msgs, $a_msg_headers, $cache_key);
+      if ($this->sort_order == 'DESC' && $headers_sorted) {  
+        //since the sort order is not used in the iil_c_sort function we have to do it here
+        $a_msg_headers = array_reverse($a_msg_headers);
+      }
+      // delete cached messages with a higher index than $max+1
+      // Changed $max to $max+1 to fix this bug : #1484295
+      $this->clear_message_cache($cache_key, $max + 1);
+
+
+      // kick child process to sync cache
+      // ...
+
+      }
+
+    // return empty array if no messages found
+    if (!is_array($a_msg_headers) || empty($a_msg_headers)) {
+      return array();
+    }
+
+    // if not already sorted
+    if (!$headers_sorted)
+      {
+      // use this class for message sorting
+      $sorter = new rcube_header_sorter();
+      $sorter->set_sequence_numbers($msg_index);
+      $sorter->sort_headers($a_msg_headers);
+
+      if ($this->sort_order == 'DESC')
+        $a_msg_headers = array_reverse($a_msg_headers);
+      }
+
+    return array_values($a_msg_headers);
+    }
+
+
+
+  /**
+   * Public method for listing a specific set of headers
+   * convert mailbox name with root dir first
+   *
+   * @param   string   Mailbox/folder name
+   * @param   array    List of message ids 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
+   * @access  public   
+   */
+  function list_header_set($mbox_name='', $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL)
+    {
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    return $this->_list_header_set($mailbox, $msgs, $page, $sort_field, $sort_order);    
+    }
+    
+
+  /**
+   * Private method for listing a set of message headers
+   *
+   * @access  private
+   * @see     rcube_imap::list_header_set()
+   */
+  function _list_header_set($mailbox, $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL)
+    {
+    if (!strlen($mailbox) || empty($msgs))
+      return array();
+
+    // also accept a comma-separated list of message ids
+    if (is_array ($msgs)) {
+      $max = count ($msgs);
+      $msgs = join (',', $msgs);
+    } else {
+      $max = count(split(',', $msgs));
+    } 
+
+    $this->_set_sort_order($sort_field, $sort_order);
+
+    $start_msg = ($this->list_page-1) * $this->page_size;
+
+    // fetch reuested headers from server
+    $a_msg_headers = array();
+    $this->_fetch_headers($mailbox, $msgs, $a_msg_headers, NULL);
+
+    // return empty array if no messages found
+    if (!is_array($a_msg_headers) || empty($a_msg_headers))
+      return array();
+
+    // if not already sorted
+    $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
+
+    // only return the requested part of the set
+    return array_slice(array_values($a_msg_headers), $start_msg, min($max-$start_msg, $this->page_size));
+    }
+
+
+  /**
+   * Helper function to get first and last index of the requested set
+   *
+   * @param  int     message count
+   * @param  mixed   page number to show, or string 'all'
+   * @return array   array with two values: first index, last index
+   * @access private
+   */
+  function _get_message_range($max, $page)
+    {
+    $start_msg = ($this->list_page-1) * $this->page_size;
+    
+    if ($page=='all')
+      {
+      $begin = 0;
+      $end = $max;
+      }
+    else if ($this->sort_order=='DESC')
+      {
+      $begin = $max - $this->page_size - $start_msg;
+      $end =   $max - $start_msg;
+      }
+    else
+      {
+      $begin = $start_msg;
+      $end   = $start_msg + $this->page_size;
+      }
+
+    if ($begin < 0) $begin = 0;
+    if ($end < 0) $end = $max;
+    if ($end > $max) $end = $max;
+    
+    return array($begin, $end);
+    }
+    
+    
+
+  /**
+   * Fetches message headers
+   * Used for loop
+   *
+   * @param  string  Mailbox name
+   * @param  string  Message index to fetch
+   * @param  array   Reference to message headers array
+   * @param  array   Array with cache index
+   * @return int     Number of deleted messages
+   * @access private
+   */
+  function _fetch_headers($mailbox, $msgs, &$a_msg_headers, $cache_key)
+    {
+    // cache is incomplete
+    $cache_index = $this->get_message_cache_index($cache_key);
+    
+    // fetch reuested headers from server
+    $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs);
+    $deleted_count = 0;
+    
+    if (!empty($a_header_index))
+      {
+      foreach ($a_header_index as $i => $headers)
+        {
+        if ($headers->deleted && $this->skip_deleted)
+          {
+          // delete from cache
+          if ($cache_index[$headers->id] && $cache_index[$headers->id] == $headers->uid)
+            $this->remove_message_cache($cache_key, $headers->id);
+
+          $deleted_count++;
+          continue;
+          }
+
+        // add message to cache
+        if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid)
+          $this->add_message_cache($cache_key, $headers->id, $headers);
+
+        $a_msg_headers[$headers->uid] = $headers;
+        }
+      }
+        
+    return $deleted_count;
+    }
+    
+  
+  /**
+   * Return sorted array of message UIDs
+   *
+   * @param string Mailbox to get index from
+   * @param string Sort column
+   * @param string Sort order [ASC, DESC]
+   * @return array Indexed array with message ids
+   */
+  function message_index($mbox_name='', $sort_field=NULL, $sort_order=NULL)
+    {
+    $this->_set_sort_order($sort_field, $sort_order);
+
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    $key = "{$mailbox}:{$this->sort_field}:{$this->sort_order}:{$this->search_string}.msgi";
+
+    // we have a saved search result. get index from there
+    if (!isset($this->cache[$key]) && $this->search_string && $mailbox == $this->mailbox)
+    {
+      $this->cache[$key] = $a_msg_headers = array();
+      $this->_fetch_headers($mailbox, join(',', $this->search_set), $a_msg_headers, NULL);
+
+      foreach (iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order) as $i => $msg)
+        $this->cache[$key][] = $msg->uid;
+    }
+
+    // have stored it in RAM
+    if (isset($this->cache[$key]))
+      return $this->cache[$key];
+
+    // check local cache
+    $cache_key = $mailbox.'.msg';
+    $cache_status = $this->check_cache_status($mailbox, $cache_key);
+
+    // cache is OK
+    if ($cache_status>0)
+      {
+      $a_index = $this->get_message_cache_index($cache_key, TRUE, $this->sort_field, $this->sort_order);
+      return array_values($a_index);
+      }
+
+
+    // fetch complete message index
+    $msg_count = $this->_messagecount($mailbox);
+    if ($this->get_capability('sort') && ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, '', TRUE)))
+      {
+      if ($this->sort_order == 'DESC')
+        $a_index = array_reverse($a_index);
+
+      $this->cache[$key] = $a_index;
+
+      }
+    else
+      {
+      $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:$msg_count", $this->sort_field);
+      $a_uids = iil_C_FetchUIDs($this->conn, $mailbox);
+    
+      if ($this->sort_order=="ASC")
+        asort($a_index);
+      else if ($this->sort_order=="DESC")
+        arsort($a_index);
+        
+      $i = 0;
+      $this->cache[$key] = array();
+      foreach ($a_index as $index => $value)
+        $this->cache[$key][$i++] = $a_uids[$index];
+      }
+
+    return $this->cache[$key];
+    }
+
+
+  /**
+   * @access private
+   */
+  function sync_header_index($mailbox)
+    {
+    $cache_key = $mailbox.'.msg';
+    $cache_index = $this->get_message_cache_index($cache_key);
+    $msg_count = $this->_messagecount($mailbox);
+
+    // fetch complete message index
+    $a_message_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:$msg_count", 'UID');
+        
+    foreach ($a_message_index as $id => $uid)
+      {
+      // message in cache at correct position
+      if ($cache_index[$id] == $uid)
+        {
+        unset($cache_index[$id]);
+        continue;
+        }
+        
+      // message in cache but in wrong position
+      if (in_array((string)$uid, $cache_index, TRUE))
+        {
+        unset($cache_index[$id]);        
+        }
+      
+      // other message at this position
+      if (isset($cache_index[$id]))
+        {
+        $this->remove_message_cache($cache_key, $id);
+        unset($cache_index[$id]);
+        }
+        
+
+      // fetch complete headers and add to cache
+      $headers = iil_C_FetchHeader($this->conn, $mailbox, $id);
+      $this->add_message_cache($cache_key, $headers->id, $headers);
+      }
+
+    // those ids that are still in cache_index have been deleted      
+    if (!empty($cache_index))
+      {
+      foreach ($cache_index as $id => $uid)
+        $this->remove_message_cache($cache_key, $id);
+      }
+    }
+
+
+  /**
+   * Invoke search request to IMAP server
+   *
+   * @param  string  mailbox name to search in
+   * @param  string  search criteria (ALL, TO, FROM, SUBJECT, etc)
+   * @param  string  search string
+   * @return array   search results as list of message ids
+   * @access public
+   */
+  function search($mbox_name='', $criteria='ALL', $str=NULL, $charset=NULL)
+    {
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+
+    // have an array of criterias => execute multiple searches
+    if (is_array($criteria) && $str)
+      {
+      $results = array();
+      foreach ($criteria as $crit)
+        if ($search_result = $this->search($mbox_name, $crit, $str, $charset))
+          $results = array_merge($results, $search_result);
+      
+      $results = array_unique($results);
+      $this->set_search_set($criteria, $str, $results, $charset);
+      return $results;
+      }
+    else if ($str && $criteria)
+      {
+      $search = (!empty($charset) ? "CHARSET $charset " : '') . sprintf("%s {%d}\r\n%s", $criteria, strlen($str), $str);
+      $results = $this->_search_index($mailbox, $search);
+
+      // try search with ISO charset (should be supported by server)
+      if (empty($results) && !empty($charset) && $charset!='ISO-8859-1')
+        $results = $this->search($mbox_name, $criteria, rcube_charset_convert($str, $charset, 'ISO-8859-1'), 'ISO-8859-1');
+      
+      $this->set_search_set($criteria, $str, $results, $charset);
+      return $results;
+      }
+    else
+      return $this->_search_index($mailbox, $criteria);
+    }    
+
+
+  /**
+   * Private search method
+   *
+   * @return array   search results as list of message ids
+   * @access private
+   * @see rcube_imap::search()
+   */
+  function _search_index($mailbox, $criteria='ALL')
+    {
+    $a_messages = iil_C_Search($this->conn, $mailbox, $criteria);
+    // clean message list (there might be some empty entries)
+    if (is_array($a_messages))
+      {
+      foreach ($a_messages as $i => $val)
+        if (empty($val))
+          unset($a_messages[$i]);
+      }
+        
+    return $a_messages;
+    }
+    
+  
+  /**
+   * Refresh saved search set
+   *
+   * @return array Current search set
+   */
+  function refresh_search()
+    {
+    if (!empty($this->search_subject) && !empty($this->search_string))
+      $this->search_set = $this->search('', $this->search_subject, $this->search_string, $this->search_charset);
+      
+    return $this->get_search_set();
+    }
+  
+  
+  /**
+   * Check if the given message ID is part of the current search set
+   *
+   * @return boolean True on match or if no search request is stored
+   */
+  function in_searchset($msgid)
+  {
+    if (!empty($this->search_string))
+      return in_array("$msgid", (array)$this->search_set, true);
+    else
+      return true;
+  }
+
+
+  /**
+   * Return message headers object of a specific message
+   *
+   * @param int     Message ID
+   * @param string  Mailbox to read from 
+   * @param boolean True if $id is the message UID
+   * @return object Message headers representation
+   */
+  function get_headers($id, $mbox_name=NULL, $is_uid=TRUE)
+    {
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    $uid = $is_uid ? $id : $this->_id2uid($id);
+
+    // get cached headers
+    if ($uid && ($headers = &$this->get_cached_message($mailbox.'.msg', $uid)))
+      return $headers;
+
+    $headers = iil_C_FetchHeader($this->conn, $mailbox, $id, $is_uid);
+
+    // write headers cache
+    if ($headers)
+      {
+      if ($headers->uid && $headers->id)
+        $this->uid_id_map[$mailbox][$headers->uid] = $headers->id;
+
+      $this->add_message_cache($mailbox.'.msg', $headers->id, $headers);
+      }
+
+    return $headers;
+    }
+
+
+  /**
+   * Fetch body structure from the IMAP server and build
+   * an object structure similar to the one generated by PEAR::Mail_mimeDecode
+   *
+   * @param int Message UID to fetch
+   * @return object stdClass Message part tree or False on failure
+   */
+  function &get_structure($uid)
+    {
+    $cache_key = $this->mailbox.'.msg';
+    $headers = &$this->get_cached_message($cache_key, $uid, true);
+
+    // return cached message structure
+    if (is_object($headers) && is_object($headers->structure))
+      return $headers->structure;
+    
+    // resolve message sequence number
+    if (!($msg_id = $this->_uid2id($uid)))
+      return FALSE;
+
+    $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); 
+    $structure = iml_GetRawStructureArray($structure_str);
+    $struct = false;
+
+    // parse structure and add headers
+    if (!empty($structure))
+      {
+      $this->_msg_id = $msg_id;
+      $headers = $this->get_headers($uid);
+      
+      $struct = &$this->_structure_part($structure);
+      $struct->headers = get_object_vars($headers);
+
+      // don't trust given content-type
+      if (empty($struct->parts) && !empty($struct->headers['ctype']))
+        {
+        $struct->mime_id = '1';
+        $struct->mimetype = strtolower($struct->headers['ctype']);
+        list($struct->ctype_primary, $struct->ctype_secondary) = explode('/', $struct->mimetype);
+        }
+
+      // write structure to cache
+      if ($this->caching_enabled)
+        $this->add_message_cache($cache_key, $msg_id, $headers, $struct);
+      }
+      
+    return $struct;
+    }
+
+  
+  /**
+   * Build message part object
+   *
+   * @access private
+   */
+  function &_structure_part($part, $count=0, $parent='')
+    {
+    $struct = new rcube_message_part;
+    $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count";
+    
+    // multipart
+    if (is_array($part[0]))
+      {
+      $struct->ctype_primary = 'multipart';
+      
+      // find first non-array entry
+      for ($i=1; $i<count($part); $i++)
+        if (!is_array($part[$i]))
+          {
+          $struct->ctype_secondary = strtolower($part[$i]);
+          break;
+          }
+          
+      $struct->mimetype = 'multipart/'.$struct->ctype_secondary;
+
+      $struct->parts = array();
+      for ($i=0, $count=0; $i<count($part); $i++)
+        if (is_array($part[$i]) && count($part[$i]) > 3)
+          $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id);
+          
+      return $struct;
+      }
+    
+    
+    // regular part
+    $struct->ctype_primary = strtolower($part[0]);
+    $struct->ctype_secondary = strtolower($part[1]);
+    $struct->mimetype = $struct->ctype_primary.'/'.$struct->ctype_secondary;
+
+    // read content type parameters
+    if (is_array($part[2]))
+      {
+      $struct->ctype_parameters = array();
+      for ($i=0; $i<count($part[2]); $i+=2)
+        $struct->ctype_parameters[strtolower($part[2][$i])] = $part[2][$i+1];
+        
+      if (isset($struct->ctype_parameters['charset']))
+        $struct->charset = $struct->ctype_parameters['charset'];
+      }
+    
+    // read content encoding
+    if (!empty($part[5]) && $part[5]!='NIL')
+      {
+      $struct->encoding = strtolower($part[5]);
+      $struct->headers['content-transfer-encoding'] = $struct->encoding;
+      }
+    
+    // get part size
+    if (!empty($part[6]) && $part[6]!='NIL')
+      $struct->size = intval($part[6]);
+
+    // read part disposition
+    $di = count($part) - 2;
+    if ((is_array($part[$di]) && count($part[$di]) == 2 && is_array($part[$di][1])) ||
+        (is_array($part[--$di]) && count($part[$di]) == 2))
+      {
+      $struct->disposition = strtolower($part[$di][0]);
+
+      if (is_array($part[$di][1]))
+        for ($n=0; $n<count($part[$di][1]); $n+=2)
+          $struct->d_parameters[strtolower($part[$di][1][$n])] = $part[$di][1][$n+1];
+      }
+      
+    // get child parts
+    if (is_array($part[8]) && $di != 8)
+      {
+      $struct->parts = array();
+      for ($i=0, $count=0; $i<count($part[8]); $i++)
+        if (is_array($part[8][$i]) && count($part[8][$i]) > 5)
+          $struct->parts[] = $this->_structure_part($part[8][$i], ++$count, $struct->mime_id);
+      }
+
+    // get part ID
+    if (!empty($part[3]) && $part[3]!='NIL')
+      {
+      $struct->content_id = $part[3];
+      $struct->headers['content-id'] = $part[3];
+    
+      if (empty($struct->disposition))
+        $struct->disposition = 'inline';
+      }
+
+    // fetch message headers if message/rfc822
+    if ($struct->ctype_primary=='message')
+      {
+      $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER');
+      $struct->headers = $this->_parse_headers($headers);
+      
+      if (is_array($part[8]) && empty($struct->parts))
+        $struct->parts[] = $this->_structure_part($part[8], ++$count, $struct->mime_id);
+      }
+
+    // normalize filename property
+    if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name'])
+    {
+      $struct->filename = rcube_imap::decode_mime_string($filename_mime, 
+           $struct->charset ? $struct->charset : rc_detect_encoding($filename_mime, $this->default_charset));
+    }
+    else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*'])
+    {
+      // decode filename according to RFC 2231, Section 4
+      list($filename_charset,, $filename_urlencoded) = split('\'', $filename_encoded);
+      $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset);
+    }
+    else if (!empty($struct->headers['content-description']))
+      $struct->filename = rcube_imap::decode_mime_string($struct->headers['content-description'],
+           $struct->charset ? $struct->charset : rc_detect_encoding($struct->headers['content-description'],$this->default_charset));
+      
+    return $struct;
+    }
+    
+  
+  /**
+   * Fetch message body of a specific message from the server
+   *
+   * @param  int    Message UID
+   * @param  string Part number
+   * @param  object rcube_message_part Part object created by get_structure()
+   * @param  mixed  True to print part, ressource to write part contents in
+   * @return string Message/part body if not printed
+   */
+  function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL)
+    {
+    if (!($msg_id = $this->_uid2id($uid)))
+      return FALSE;
+    
+    // get part encoding if not provided
+    if (!is_object($o_part))
+      {
+      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); 
+      $structure = iml_GetRawStructureArray($structure_str);
+      $part_type = iml_GetPartTypeCode($structure, $part);
+      $o_part = new rcube_message_part;
+      $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other');
+      $o_part->encoding = strtolower(iml_GetPartEncodingString($structure, $part));
+      $o_part->charset = iml_GetPartCharset($structure, $part);
+      }
+      
+    // TODO: Add caching for message parts
+
+    if ($print)
+      {
+      $mode = $o_part->encoding == 'base64' ? 3 : ($o_part->encoding == 'quoted-printable' ? 1 : 2);
+      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, $mode);
+      
+      // we have to decode the part manually before printing
+      if ($mode == 1)
+        {
+        echo $this->mime_decode($body, $o_part->encoding);
+        $body = true;
+        }
+      }
+    else
+      {
+      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1);
+
+      // decode part body
+      if ($o_part->encoding)
+        $body = $this->mime_decode($body, $o_part->encoding);
+
+      // convert charset (if text or message part)
+      if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message')
+        {
+        // assume default if no charset specified
+        if (empty($o_part->charset))
+          $o_part->charset = $this->default_charset;
+
+        $body = rcube_charset_convert($body, $o_part->charset);
+        }
+      }
+
+    return $body;
+    }
+
+
+  /**
+   * Fetch message body of a specific message from the server
+   *
+   * @param  int    Message UID
+   * @return string Message/part body
+   * @see    rcube_imap::get_message_part()
+   */
+  function &get_body($uid, $part=1)
+    {
+    $headers = $this->get_headers($uid);
+    return rcube_charset_convert(
+      $this->mime_decode($this->get_message_part($uid, $part), 'quoted-printable'),
+      $headers->charset ? $headers->charset : $this->default_charset);
+    }
+
+
+  /**
+   * Returns the whole message source as string
+   *
+   * @param int  Message UID
+   * @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);
+
+    return $body;    
+    }
+    
+
+  /**
+   * Sends the whole message source to stdout
+   *
+   * @param int  Message UID
+   */ 
+  function print_raw_body($uid)
+    {
+    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);
+    }
+
+
+  /**
+   * Set message flag to one or several messages
+   *
+   * @param mixed  Message UIDs as array or as comma-separated string
+   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
+   * @return boolean True on success, False on failure
+   */
+  function set_flag($uids, $flag)
+    {
+    $flag = strtoupper($flag);
+    $msg_ids = array();
+    if (!is_array($uids))
+      $uids = explode(',',$uids);
+      
+    foreach ($uids as $uid) {
+      $msg_ids[$uid] = $this->_uid2id($uid);
+    }
+      
+    if ($flag=='UNDELETED')
+      $result = iil_C_Undelete($this->conn, $this->mailbox, join(',', array_values($msg_ids)));
+    else if ($flag=='UNSEEN')
+      $result = iil_C_Unseen($this->conn, $this->mailbox, join(',', array_values($msg_ids)));
+    else
+      $result = iil_C_Flag($this->conn, $this->mailbox, join(',', array_values($msg_ids)), $flag);
+
+    // reload message headers if cached
+    $cache_key = $this->mailbox.'.msg';
+    if ($this->caching_enabled)
+      {
+      foreach ($msg_ids as $uid => $id)
+        {
+        if ($cached_headers = $this->get_cached_message($cache_key, $uid))
+          {
+          $this->remove_message_cache($cache_key, $id);
+          //$this->get_headers($uid);
+          }
+        }
+
+      // close and re-open connection
+      // this prevents connection problems with Courier 
+      $this->reconnect();
+      }
+
+    // set nr of messages that were flaged
+    $count = count($msg_ids);
+
+    // clear message count cache
+    if ($result && $flag=='SEEN')
+      $this->_set_messagecount($this->mailbox, 'UNSEEN', $count*(-1));
+    else if ($result && $flag=='UNSEEN')
+      $this->_set_messagecount($this->mailbox, 'UNSEEN', $count);
+    else if ($result && $flag=='DELETED')
+      $this->_set_messagecount($this->mailbox, 'ALL', $count*(-1));
+
+    return $result;
+    }
+
+
+  /**
+   * 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);
+    $mailbox = $this->_mod_mailbox($mbox_name);
+
+    // make sure mailbox exists
+    if (in_array($mailbox, $this->_list_mailboxes()))
+      $saved = iil_C_Append($this->conn, $mailbox, $message);
+
+    if ($saved)
+      {
+      // increase messagecount of the target mailbox
+      $this->_set_messagecount($mailbox, 'ALL', 1);
+      }
+          
+    return $saved;
+    }
+
+
+  /**
+   * Move a message from one mailbox to another
+   *
+   * @param string List of UIDs to move, separated by comma
+   * @param string Target mailbox
+   * @param string Source mailbox
+   * @return boolean True on success, False on error
+   */
+  function move_message($uids, $to_mbox, $from_mbox='')
+    {
+    $to_mbox_in = stripslashes($to_mbox);
+    $from_mbox = stripslashes($from_mbox);
+    $to_mbox = $this->_mod_mailbox($to_mbox_in);
+    $from_mbox = $from_mbox ? $this->_mod_mailbox($from_mbox) : $this->mailbox;
+
+    // make sure mailbox exists
+    if (!in_array($to_mbox, $this->_list_mailboxes()))
+      {
+      if (in_array($to_mbox_in, $this->default_folders))
+        $this->create_mailbox($to_mbox_in, TRUE);
+      else
+        return FALSE;
+      }
+
+    // convert the list of uids to array
+    $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL);
+    
+    // exit if no message uids are specified
+    if (!is_array($a_uids))
+      return false;
+
+    // convert uids to message ids
+    $a_mids = array();
+    foreach ($a_uids as $uid)
+      $a_mids[] = $this->_uid2id($uid, $from_mbox);
+
+    $iil_move = iil_C_Move($this->conn, join(',', $a_mids), $from_mbox, $to_mbox);
+    $moved = !($iil_move === false || $iil_move < 0);
+    
+    // send expunge command in order to have the moved message
+    // really deleted from the source mailbox
+    if ($moved) {
+      $this->_expunge($from_mbox, FALSE);
+      $this->_clear_messagecount($from_mbox);
+      $this->_clear_messagecount($to_mbox);
+    }
+    // moving failed
+    else if (rcmail::get_instance()->config->get('delete_always', false)) {
+      return iil_C_Delete($this->conn, $from_mbox, join(',', $a_mids));
+    }
+      
+    // remove message ids from search set
+    if ($moved && $this->search_set && $from_mbox == $this->mailbox)
+      $this->search_set = array_diff($this->search_set, $a_mids);
+
+    // update cached message headers
+    $cache_key = $from_mbox.'.msg';
+    if ($moved && ($a_cache_index = $this->get_message_cache_index($cache_key)))
+      {
+      $start_index = 100000;
+      foreach ($a_uids as $uid)
+        {
+        if (($index = array_search($uid, $a_cache_index)) !== FALSE)
+          $start_index = min($index, $start_index);
+        }
+
+      // clear cache from the lowest index on
+      $this->clear_message_cache($cache_key, $start_index);
+      }
+
+    return $moved;
+    }
+
+
+  /**
+   * Mark messages as deleted and expunge mailbox
+   *
+   * @param string List of UIDs to move, separated by comma
+   * @param string Source mailbox
+   * @return boolean True on success, False on error
+   */
+  function delete_message($uids, $mbox_name='')
+    {
+    $mbox_name = stripslashes($mbox_name);
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+
+    // convert the list of uids to array
+    $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL);
+    
+    // exit if no message uids are specified
+    if (!is_array($a_uids))
+      return false;
+
+    // convert uids to message ids
+    $a_mids = array();
+    foreach ($a_uids as $uid)
+      $a_mids[] = $this->_uid2id($uid, $mailbox);
+        
+    $deleted = iil_C_Delete($this->conn, $mailbox, join(',', $a_mids));
+    
+    // send expunge command in order to have the deleted message
+    // really deleted from the mailbox
+    if ($deleted)
+      {
+      $this->_expunge($mailbox, FALSE);
+      $this->_clear_messagecount($mailbox);
+      }
+
+    // remove message ids from search set
+    if ($deleted && $this->search_set && $mailbox == $this->mailbox)
+      $this->search_set = array_diff($this->search_set, $a_mids);
+
+    // remove deleted messages from cache
+    $cache_key = $mailbox.'.msg';
+    if ($deleted && ($a_cache_index = $this->get_message_cache_index($cache_key)))
+      {
+      $start_index = 100000;
+      foreach ($a_uids as $uid)
+        {
+        if (($index = array_search($uid, $a_cache_index)) !== FALSE)
+          $start_index = min($index, $start_index);
+        }
+
+      // clear cache from the lowest index on
+      $this->clear_message_cache($cache_key, $start_index);
+      }
+
+    return $deleted;
+    }
+
+
+  /**
+   * Clear all messages in a specific mailbox
+   *
+   * @param string Mailbox name
+   * @return int Above 0 on success
+   */
+  function clear_mailbox($mbox_name=NULL)
+    {
+    $mbox_name = stripslashes($mbox_name);
+    $mailbox = !empty($mbox_name) ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    $msg_count = $this->_messagecount($mailbox, 'ALL');
+    
+    if ($msg_count>0)
+      {
+      $cleared = iil_C_ClearFolder($this->conn, $mailbox);
+      
+      // make sure the message count cache is cleared as well
+      if ($cleared)
+        {
+        $this->clear_message_cache($mailbox.'.msg');      
+        $a_mailbox_cache = $this->get_cache('messagecount');
+        unset($a_mailbox_cache[$mailbox]);
+        $this->update_cache('messagecount', $a_mailbox_cache);
+        }
+        
+      return $cleared;
+      }
+    else
+      return 0;
+    }
+
+
+  /**
+   * Send IMAP expunge command and clear cache
+   *
+   * @param string Mailbox name
+   * @param boolean False if cache should not be cleared
+   * @return boolean True on success
+   */
+  function expunge($mbox_name='', $clear_cache=TRUE)
+    {
+    $mbox_name = stripslashes($mbox_name);
+    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+    return $this->_expunge($mailbox, $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_messagecount($mailbox);
+      }
+      
+    return $result;
+    }
+
+
+  /* --------------------------------
+   *        folder managment
+   * --------------------------------*/
+
+
+  /**
+   * Get a list of all folders available on the IMAP server
+   * 
+   * @param string IMAP root dir
+   * @return array Indexed array with folder names
+   */
+  function list_unsubscribed($root='')
+    {
+    static $sa_unsubscribed;
+    
+    if (is_array($sa_unsubscribed))
+      return $sa_unsubscribed;
+      
+    // retrieve list of folders from IMAP server
+    $a_mboxes = iil_C_ListMailboxes($this->conn, $this->_mod_mailbox($root), '*');
+
+    // modify names with root dir
+    foreach ($a_mboxes as $mbox_name)
+      {
+      $name = $this->_mod_mailbox($mbox_name, 'out');
+      if (strlen($name))
+        $a_folders[] = $name;
+      }
+
+    // filter folders and sort them
+    $sa_unsubscribed = $this->_sort_mailbox_list($a_folders);
+    return $sa_unsubscribed;
+    }
+
+
+  /**
+   * Get mailbox quota information
+   * added by Nuny
+   * 
+   * @return mixed Quota info or False if not supported
+   */
+  function get_quota()
+    {
+    if ($this->get_capability('QUOTA'))
+      return iil_C_GetQuota($this->conn);
+       
+    return FALSE;
+    }
+
+
+  /**
+   * Subscribe to a specific mailbox(es)
+   *
+   * @param array Mailbox name(s)
+   * @return boolean True on success
+   */ 
+  function subscribe($a_mboxes)
+    {
+    if (!is_array($a_mboxes))
+      $a_mboxes = array($a_mboxes);
+
+    // let this common function do the main work
+    return $this->_change_subscription($a_mboxes, 'subscribe');
+    }
+
+
+  /**
+   * Unsubscribe mailboxes
+   *
+   * @param array Mailbox name(s)
+   * @return boolean True on success
+   */
+  function unsubscribe($a_mboxes)
+    {
+    if (!is_array($a_mboxes))
+      $a_mboxes = array($a_mboxes);
+
+    // let this common function do the main work
+    return $this->_change_subscription($a_mboxes, 'unsubscribe');
+    }
+
+
+  /**
+   * Create a new mailbox on the server and register it in local cache
+   *
+   * @param string  New mailbox name (as utf-7 string)
+   * @param boolean True if the new mailbox should be subscribed
+   * @param string  Name of the created mailbox, false on error
+   */
+  function create_mailbox($name, $subscribe=FALSE)
+    {
+    $result = FALSE;
+    
+    // replace backslashes
+    $name = preg_replace('/[\\\]+/', '-', $name);
+
+    // reduce mailbox name to 100 chars
+    $name = substr($name, 0, 100);
+
+    $abs_name = $this->_mod_mailbox($name);
+    $a_mailbox_cache = $this->get_cache('mailboxes');
+
+    if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array($abs_name, $a_mailbox_cache)))
+      $result = iil_C_CreateFolder($this->conn, $abs_name);
+
+    // try to subscribe it
+    if ($result && $subscribe)
+      $this->subscribe($name);
+
+    return $result ? $name : FALSE;
+    }
+
+
+  /**
+   * Set a new name to an existing mailbox
+   *
+   * @param string Mailbox to rename (as utf-7 string)
+   * @param string New mailbox name (as utf-7 string)
+   * @return string Name of the renames mailbox, False on error
+   */
+  function rename_mailbox($mbox_name, $new_name)
+    {
+    $result = FALSE;
+
+    // replace backslashes
+    $name = preg_replace('/[\\\]+/', '-', $new_name);
+        
+    // encode mailbox name and reduce it to 100 chars
+    $name = substr($new_name, 0, 100);
+
+    // make absolute path
+    $mailbox = $this->_mod_mailbox($mbox_name);
+    $abs_name = $this->_mod_mailbox($name);
+    
+    // check if mailbox is subscribed
+    $a_subscribed = $this->_list_mailboxes();
+    $subscribed = in_array($mailbox, $a_subscribed);
+    
+    // unsubscribe folder
+    if ($subscribed)
+      iil_C_UnSubscribe($this->conn, $mailbox);
+
+    if (strlen($abs_name))
+      $result = iil_C_RenameFolder($this->conn, $mailbox, $abs_name);
+
+    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');      
+      }
+
+    // try to subscribe it
+    if ($result && $subscribed)
+      iil_C_Subscribe($this->conn, $abs_name);
+
+    return $result ? $name : FALSE;
+    }
+
+
+  /**
+   * Remove mailboxes from server
+   *
+   * @param string Mailbox name
+   * @return boolean True on success
+   */
+  function delete_mailbox($mbox_name)
+    {
+    $deleted = FALSE;
+
+    if (is_array($mbox_name))
+      $a_mboxes = $mbox_name;
+    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)
+        {
+        $mailbox = $this->_mod_mailbox($mbox_name);
+
+        // unsubscribe mailbox before deleting
+        iil_C_UnSubscribe($this->conn, $mailbox);
+
+        // send delete command to server
+        $result = iil_C_DeleteFolder($this->conn, $mailbox);
+        if ($result>=0)
+          $deleted = TRUE;
+
+        foreach ($all_mboxes as $c_mbox)
+          {
+          $regex = preg_quote($mailbox . $this->delimiter, '/');
+          $regex = '/^' . $regex . '/';
+          if (preg_match($regex, $c_mbox))
+            {
+            iil_C_UnSubscribe($this->conn, $c_mbox);
+            $result = iil_C_DeleteFolder($this->conn, $c_mbox);
+            if ($result>=0)
+              $deleted = TRUE;
+            }
+          }
+        }
+
+    // clear mailboxlist cache
+    if ($deleted)
+      {
+      $this->clear_message_cache($mailbox.'.msg');
+      $this->clear_cache('mailboxes');
+      }
+
+    return $deleted;
+    }
+
+
+  /**
+   * Create all folders specified as default
+   */
+  function create_default_folders()
+    {
+    $a_folders = iil_C_ListMailboxes($this->conn, $this->_mod_mailbox(''), '*');
+    $a_subscribed = iil_C_ListSubscribed($this->conn, $this->_mod_mailbox(''), '*');
+    
+    // create default folders if they do not exist
+    foreach ($this->default_folders as $folder)
+      {
+      $abs_name = $this->_mod_mailbox($folder);
+      if (!in_array_nocase($abs_name, $a_folders))
+        $this->create_mailbox($folder, TRUE);
+      else if (!in_array_nocase($abs_name, $a_subscribed))
+        $this->subscribe($folder);
+      }
+    }
+
+
+
+  /* --------------------------------
+   *   internal caching methods
+   * --------------------------------*/
+
+  /**
+   * @access private
+   */
+  function set_caching($set)
+    {
+    if ($set && is_object($this->db))
+      $this->caching_enabled = TRUE;
+    else
+      $this->caching_enabled = FALSE;
+    }
+
+  /**
+   * @access private
+   */
+  function get_cache($key)
+    {
+    // read cache
+    if (!isset($this->cache[$key]) && $this->caching_enabled)
+      {
+      $cache_data = $this->_read_cache_record('IMAP.'.$key);
+      $this->cache[$key] = strlen($cache_data) ? unserialize($cache_data) : FALSE;
+      }
+    
+    return $this->cache[$key];
+    }
+
+  /**
+   * @access private
+   */
+  function update_cache($key, $data)
+    {
+    $this->cache[$key] = $data;
+    $this->cache_changed = TRUE;
+    $this->cache_changes[$key] = TRUE;
+    }
+
+  /**
+   * @access private
+   */
+  function write_cache()
+    {
+    if ($this->caching_enabled && $this->cache_changed)
+      {
+      foreach ($this->cache as $key => $data)
+        {
+        if ($this->cache_changes[$key])
+          $this->_write_cache_record('IMAP.'.$key, serialize($data));
+        }
+      }    
+    }
+
+  /**
+   * @access private
+   */
+  function clear_cache($key=NULL)
+    {
+    if (!$this->caching_enabled)
+      return;
+    
+    if ($key===NULL)
+      {
+      foreach ($this->cache as $key => $data)
+        $this->_clear_cache_record('IMAP.'.$key);
+
+      $this->cache = array();
+      $this->cache_changed = FALSE;
+      $this->cache_changes = array();
+      }
+    else
+      {
+      $this->_clear_cache_record('IMAP.'.$key);
+      $this->cache_changes[$key] = FALSE;
+      unset($this->cache[$key]);
+      }
+    }
+
+  /**
+   * @access private
+   */
+  function _read_cache_record($key)
+    {
+    $cache_data = FALSE;
+    
+    if ($this->db)
+      {
+      // get cached data from DB
+      $sql_result = $this->db->query(
+        "SELECT cache_id, data
+         FROM ".get_table_name('cache')."
+         WHERE  user_id=?
+         AND    cache_key=?",
+        $_SESSION['user_id'],
+        $key);
+
+      if ($sql_arr = $this->db->fetch_assoc($sql_result))
+        {
+        $cache_data = $sql_arr['data'];
+        $this->cache_keys[$key] = $sql_arr['cache_id'];
+        }
+      }
+
+    return $cache_data;
+    }
+
+  /**
+   * @access private
+   */
+  function _write_cache_record($key, $data)
+    {
+    if (!$this->db)
+      return FALSE;
+
+    // check if we already have a cache entry for this key
+    if (!isset($this->cache_keys[$key]))
+      {
+      $sql_result = $this->db->query(
+        "SELECT cache_id
+         FROM ".get_table_name('cache')."
+         WHERE  user_id=?
+         AND    cache_key=?",
+        $_SESSION['user_id'],
+        $key);
+                                     
+      if ($sql_arr = $this->db->fetch_assoc($sql_result))
+        $this->cache_keys[$key] = $sql_arr['cache_id'];
+      else
+        $this->cache_keys[$key] = FALSE;
+      }
+
+    // update existing cache record
+    if ($this->cache_keys[$key])
+      {
+      $this->db->query(
+        "UPDATE ".get_table_name('cache')."
+         SET    created=".$this->db->now().",
+                data=?
+         WHERE  user_id=?
+         AND    cache_key=?",
+        $data,
+        $_SESSION['user_id'],
+        $key);
+      }
+    // add new cache record
+    else
+      {
+      $this->db->query(
+        "INSERT INTO ".get_table_name('cache')."
+         (created, user_id, cache_key, data)
+         VALUES (".$this->db->now().", ?, ?, ?)",
+        $_SESSION['user_id'],
+        $key,
+        $data);
+      }
+    }
+
+  /**
+   * @access private
+   */
+  function _clear_cache_record($key)
+    {
+    $this->db->query(
+      "DELETE FROM ".get_table_name('cache')."
+       WHERE  user_id=?
+       AND    cache_key=?",
+      $_SESSION['user_id'],
+      $key);
+    }
+
+
+
+  /* --------------------------------
+   *   message caching methods
+   * --------------------------------*/
+   
+
+  /**
+   * 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)
+      return -3;
+
+    $cache_index = $this->get_message_cache_index($cache_key, TRUE);
+    $msg_count = $this->_messagecount($mailbox);
+    $cache_count = count($cache_index);
+
+    // console("Cache check: $msg_count !== ".count($cache_index));
+
+    if ($cache_count==$msg_count)
+      {
+      // get highest index
+      $header = iil_C_FetchHeader($this->conn, $mailbox, "$msg_count");
+      $cache_uid = array_pop($cache_index);
+      
+      // uids of highest message matches -> cache seems OK
+      if ($cache_uid == $header->uid)
+        return 1;
+
+      // cache is dirty
+      return -1;
+      }
+    // if cache count differs less than 10% report as dirty
+    else if (abs($msg_count - $cache_count) < $msg_count/10)
+      return -1;
+    else
+      return -2;
+    }
+
+  /**
+   * @access private
+   */
+  function get_message_cache($key, $from, $to, $sort_field, $sort_order)
+    {
+    $cache_key = "$key:$from:$to:$sort_field:$sort_order";
+    $db_header_fields = array('idx', 'uid', 'subject', 'from', 'to', 'cc', 'date', 'size');
+    
+    if (!in_array($sort_field, $db_header_fields))
+      $sort_field = 'idx';
+    
+    if ($this->caching_enabled && !isset($this->cache[$cache_key]))
+      {
+      $this->cache[$cache_key] = array();
+      $sql_result = $this->db->limitquery(
+        "SELECT idx, uid, headers
+         FROM ".get_table_name('messages')."
+         WHERE  user_id=?
+         AND    cache_key=?
+         ORDER BY ".$this->db->quoteIdentifier($sort_field)." ".
+         strtoupper($sort_order),
+        $from,
+        $to-$from,
+        $_SESSION['user_id'],
+        $key);
+
+      while ($sql_arr = $this->db->fetch_assoc($sql_result))
+        {
+        $uid = $sql_arr['uid'];
+        $this->cache[$cache_key][$uid] = 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)
+    {
+    $internal_key = '__single_msg';
+    
+    if ($this->caching_enabled && (!isset($this->cache[$internal_key][$uid]) ||
+        ($struct && empty($this->cache[$internal_key][$uid]->structure))))
+      {
+      $sql_select = "idx, uid, headers" . ($struct ? ", structure" : '');
+      $sql_result = $this->db->query(
+        "SELECT $sql_select
+         FROM ".get_table_name('messages')."
+         WHERE  user_id=?
+         AND    cache_key=?
+         AND    uid=?",
+        $_SESSION['user_id'],
+        $key,
+        $uid);
+
+      if ($sql_arr = $this->db->fetch_assoc($sql_result))
+        {
+        $this->cache[$internal_key][$uid] = unserialize($sql_arr['headers']);
+        if (is_object($this->cache[$internal_key][$uid]) && !empty($sql_arr['structure']))
+          $this->cache[$internal_key][$uid]->structure = unserialize($sql_arr['structure']);
+        }
+      }
+
+    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();
+    
+    // empty key -> empty array
+    if (!$this->caching_enabled || empty($key))
+      return array();
+    
+    if (!empty($sa_message_index[$key]) && !$force)
+      return $sa_message_index[$key];
+    
+    $sa_message_index[$key] = array();
+    $sql_result = $this->db->query(
+      "SELECT idx, uid
+       FROM ".get_table_name('messages')."
+       WHERE  user_id=?
+       AND    cache_key=?
+       ORDER BY ".$this->db->quote_identifier($sort_col)." ".$sort_order,
+      $_SESSION['user_id'],
+      $key);
+
+    while ($sql_arr = $this->db->fetch_assoc($sql_result))
+      $sa_message_index[$key][$sql_arr['idx']] = $sql_arr['uid'];
+      
+    return $sa_message_index[$key];
+    }
+
+  /**
+   * @access private
+   */
+  function add_message_cache($key, $index, $headers, $struct=null)
+    {
+    if (empty($key) || !is_object($headers) || empty($headers->uid))
+        return;
+    
+    // add to internal (fast) cache
+    $this->cache['__single_msg'][$headers->uid] = $headers;
+    $this->cache['__single_msg'][$headers->uid]->structure = $struct;
+    
+    // no further caching
+    if (!$this->caching_enabled)
+      return;
+    
+    // check for an existing record (probly headers are cached but structure not)
+    $sql_result = $this->db->query(
+        "SELECT message_id
+         FROM ".get_table_name('messages')."
+         WHERE  user_id=?
+         AND    cache_key=?
+         AND    uid=?
+         AND    del<>1",
+        $_SESSION['user_id'],
+        $key,
+        $headers->uid);
+
+    // update cache record
+    if ($sql_arr = $this->db->fetch_assoc($sql_result))
+      {
+      $this->db->query(
+        "UPDATE ".get_table_name('messages')."
+         SET   idx=?, headers=?, structure=?
+         WHERE message_id=?",
+        $index,
+        serialize($headers),
+        is_object($struct) ? serialize($struct) : NULL,
+        $sql_arr['message_id']
+        );
+      }
+    else  // insert new record
+      {
+      $this->db->query(
+        "INSERT INTO ".get_table_name('messages')."
+         (user_id, del, cache_key, created, idx, uid, subject, ".$this->db->quoteIdentifier('from').", ".$this->db->quoteIdentifier('to').", cc, date, size, headers, structure)
+         VALUES (?, 0, ?, ".$this->db->now().", ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?, ?)",
+        $_SESSION['user_id'],
+        $key,
+        $index,
+        $headers->uid,
+        (string)substr($this->decode_header($headers->subject, TRUE), 0, 128),
+        (string)substr($this->decode_header($headers->from, TRUE), 0, 128),
+        (string)substr($this->decode_header($headers->to, TRUE), 0, 128),
+        (string)substr($this->decode_header($headers->cc, TRUE), 0, 128),
+        (int)$headers->size,
+        serialize($headers),
+        is_object($struct) ? serialize($struct) : NULL
+        );
+      }
+    }
+    
+  /**
+   * @access private
+   */
+  function remove_message_cache($key, $index)
+    {
+    if (!$this->caching_enabled)
+      return;
+    
+    $this->db->query(
+      "DELETE FROM ".get_table_name('messages')."
+       WHERE  user_id=?
+       AND    cache_key=?
+       AND    idx=?",
+      $_SESSION['user_id'],
+      $key,
+      $index);
+    }
+
+  /**
+   * @access private
+   */
+  function clear_message_cache($key, $start_index=1)
+    {
+    if (!$this->caching_enabled)
+      return;
+    
+    $this->db->query(
+      "DELETE FROM ".get_table_name('messages')."
+       WHERE  user_id=?
+       AND    cache_key=?
+       AND    idx>=?",
+      $_SESSION['user_id'],
+      $key,
+      $start_index);
+    }
+
+
+
+
+  /* --------------------------------
+   *   encoding/decoding methods
+   * --------------------------------*/
+
+  /**
+   * Split an address list into a structured array list
+   *
+   * @param string  Input string
+   * @param int     List only this number of addresses
+   * @param boolean Decode address strings
+   * @return array  Indexed list of addresses
+   */
+  function decode_address_list($input, $max=null, $decode=true)
+    {
+    $a = $this->_parse_address_list($input, $decode);
+    $out = array();
+    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
+    $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]';
+    
+    if (!is_array($a))
+      return $out;
+
+    $c = count($a);
+    $j = 0;
+
+    foreach ($a as $val)
+      {
+      $j++;
+      $address = $val['address'];
+      $name = preg_replace(array('/^[\'"]/', '/[\'"]$/'), '', trim($val['name']));
+      if ($name && $address && $name != $address)
+        $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
+      else if ($address)
+        $string = $address;
+      else if ($name)
+        $string = $name;
+      
+      $out[$j] = array('name' => $name,
+                       'mailto' => $address,
+                       'string' => $string);
+              
+      if ($max && $j==$max)
+        break;
+      }
+    
+    return $out;
+    }
+
+
+  /**
+   * Decode a message header value
+   *
+   * @param string  Header value
+   * @param boolean Remove quotes if necessary
+   * @return string Decoded string
+   */
+  function decode_header($input, $remove_quotes=FALSE)
+    {
+    $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset);
+    if ($str{0}=='"' && $remove_quotes)
+      $str = str_replace('"', '', $str);
+    
+    return $str;
+    }
+
+
+  /**
+   * Decode a mime-encoded string to internal charset
+   *
+   * @param string  Header value
+   * @param string  Fallback charset if none specified
+   * @return string Decoded string
+   * @static
+   */
+  function decode_mime_string($input, $fallback=null)
+    {
+    $out = '';
+
+    $pos = strpos($input, '=?');
+    if ($pos !== false)
+      {
+      // rfc: all line breaks or other characters not found 
+      // in the Base64 Alphabet must be ignored by decoding software
+      // delete all blanks between MIME-lines, differently we can 
+      // receive unnecessary blanks and broken utf-8 symbols
+      $input = preg_replace("/\?=\s+=\?/", '?==?', $input);
+
+      $out = substr($input, 0, $pos);
+  
+      $end_cs_pos = strpos($input, "?", $pos+2);
+      $end_en_pos = strpos($input, "?", $end_cs_pos+1);
+      $end_pos = strpos($input, "?=", $end_en_pos+1);
+  
+      $encstr = substr($input, $pos+2, ($end_pos-$pos-2));
+      $rest = substr($input, $end_pos+2);
+
+      $out .= rcube_imap::_decode_mime_string_part($encstr);
+      $out .= rcube_imap::decode_mime_string($rest, $fallback);
+
+      return $out;
+      }
+
+    // no encoding information, use fallback
+    return rcube_charset_convert($input, 
+      !empty($fallback) ? $fallback : rcmail::get_instance()->config->get('default_charset', 'ISO-8859-1'));
+    }
+
+
+  /**
+   * Decode a part of a mime-encoded string
+   *
+   * @access private
+   */
+  function _decode_mime_string_part($str)
+    {
+    $a = explode('?', $str);
+    $count = count($a);
+
+    // should be in format "charset?encoding?base64_string"
+    if ($count >= 3)
+      {
+      for ($i=2; $i<$count; $i++)
+        $rest.=$a[$i];
+
+      if (($a[1]=="B")||($a[1]=="b"))
+        $rest = base64_decode($rest);
+      else if (($a[1]=="Q")||($a[1]=="q"))
+        {
+        $rest = str_replace("_", " ", $rest);
+        $rest = quoted_printable_decode($rest);
+        }
+
+      return rcube_charset_convert($rest, $a[0]);
+      }
+    else
+      return $str;    // we dont' know what to do with this  
+    }
+
+
+  /**
+   * Decode a mime part
+   *
+   * @param string Input string
+   * @param string Part encoding
+   * @return string Decoded string
+   * @access private
+   */
+  function mime_decode($input, $encoding='7bit')
+    {
+    switch (strtolower($encoding))
+      {
+      case '7bit':
+        return $input;
+        break;
+      
+      case 'quoted-printable':
+        return quoted_printable_decode($input);
+        break;
+      
+      case 'base64':
+        return base64_decode($input);
+        break;
+      
+      default:
+        return $input;
+      }
+    }
+
+
+  /**
+   * 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']))
+      return rcube_charset_convert($body, $ctype_param['charset']);
+
+    // defaults to what is specified in the class header
+    return rcube_charset_convert($body,  $this->default_charset);
+    }
+
+
+  /**
+   * Translate UID to message ID
+   *
+   * @param int    Message UID
+   * @param string Mailbox name
+   * @return int   Message ID
+   */
+  function get_id($uid, $mbox_name=NULL) 
+    {
+      $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);
+    }
+
+
+
+  /* --------------------------------
+   *         private methods
+   * --------------------------------*/
+
+
+  /**
+   * @access private
+   */
+  function _mod_mailbox($mbox_name, $mode='in')
+    {
+    if ((!empty($this->root_ns) && $this->root_ns == $mbox_name) || $mbox_name == 'INBOX')
+      return $mbox_name;
+
+    if (!empty($this->root_dir) && $mode=='in') 
+      $mbox_name = $this->root_dir.$this->delimiter.$mbox_name;
+    else if (strlen($this->root_dir) && $mode=='out') 
+      $mbox_name = substr($mbox_name, strlen($this->root_dir)+1);
+
+    return $mbox_name;
+    }
+
+  /**
+   * Validate the given input and save to local properties
+   * @access private
+   */
+  function _set_sort_order($sort_field, $sort_order)
+  {
+    if ($sort_field != null)
+      $this->sort_field = asciiwords($sort_field);
+    if ($sort_order != null)
+      $this->sort_order = strtoupper($sort_order) == 'DESC' ? 'DESC' : 'ASC';
+  }
+
+  /**
+   * Sort mailboxes first by default folders and then in alphabethical order
+   * @access private
+   */
+  function _sort_mailbox_list($a_folders)
+    {
+    $a_out = $a_defaults = $folders = array();
+
+    $delimiter = $this->get_hierarchy_delimiter();
+
+    // find default folders and skip folders starting with '.'
+    foreach ($a_folders as $i => $folder)
+      {
+      if ($folder{0}=='.')
+        continue;
+
+      if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
+        $a_defaults[$p] = $folder;
+      else
+        $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF-7'));
+      }
+
+    asort($folders, SORT_LOCALE_STRING);
+    ksort($a_defaults);
+
+    $folders = array_merge($a_defaults, array_keys($folders));
+
+    // finally we must rebuild the list to move 
+    // subfolders of default folders to their place
+    while (list($key, $folder) = each($folders)) {
+      $a_out[] = $folder;
+      unset($folders[$key]);
+      if (in_array(strtolower($folder), $this->default_folders_lc)) {
+       foreach ($folders as $idx => $f) {
+         if (strpos($f, $folder.$delimiter) === 0) {
+           $a_out[] = $f;
+           unset($folders[$idx]);
+           }
+         }
+       reset($folders);  
+       }
+      }
+
+    return $a_out;
+    }
+
+  /**
+   * @access private
+   */
+  function _uid2id($uid, $mbox_name=NULL)
+    {
+    if (!$mbox_name)
+      $mbox_name = $this->mailbox;
+      
+    if (!isset($this->uid_id_map[$mbox_name][$uid]))
+      $this->uid_id_map[$mbox_name][$uid] = iil_C_UID2ID($this->conn, $mbox_name, $uid);
+
+    return $this->uid_id_map[$mbox_name][$uid];
+    }
+
+  /**
+   * @access private
+   */
+  function _id2uid($id, $mbox_name=NULL)
+    {
+    if (!$mbox_name)
+      $mbox_name = $this->mailbox;
+      
+    $index = array_flip((array)$this->uid_id_map[$mbox_name]);
+    if (isset($index[$id]))
+      $uid = $index[$id];
+    else
+      {
+      $uid = iil_C_ID2UID($this->conn, $mbox_name, $id);
+      $this->uid_id_map[$mbox_name][$uid] = $id;
+      }
+    
+    return $uid;
+    }
+
+
+  /**
+   * Parse string or array of server capabilities and put them in internal array
+   * @access private
+   */
+  function _parse_capability($caps)
+    {
+    if (!is_array($caps))
+      $cap_arr = explode(' ', $caps);
+    else
+      $cap_arr = $caps;
+    
+    foreach ($cap_arr as $cap)
+      {
+      if ($cap=='CAPABILITY')
+        continue;
+
+      if (strpos($cap, '=')>0)
+        {
+        list($key, $value) = explode('=', $cap);
+        if (!is_array($this->capabilities[$key]))
+          $this->capabilities[$key] = array();
+          
+        $this->capabilities[$key][] = $value;
+        }
+      else
+        $this->capabilities[$cap] = TRUE;
+      }
+    }
+
+
+  /**
+   * Subscribe/unsubscribe a list of mailboxes and update local cache
+   * @access private
+   */
+  function _change_subscription($a_mboxes, $mode)
+    {
+    $updated = FALSE;
+    
+    if (is_array($a_mboxes))
+      foreach ($a_mboxes as $i => $mbox_name)
+        {
+        $mailbox = $this->_mod_mailbox($mbox_name);
+        $a_mboxes[$i] = $mailbox;
+
+        if ($mode=='subscribe')
+          $result = iil_C_Subscribe($this->conn, $mailbox);
+        else if ($mode=='unsubscribe')
+          $result = iil_C_UnSubscribe($this->conn, $mailbox);
+
+        if ($result>=0)
+          $updated = TRUE;
+        }
+        
+    // get cached mailbox list    
+    if ($updated)
+      {
+      $a_mailbox_cache = $this->get_cache('mailboxes');
+      if (!is_array($a_mailbox_cache))
+        return $updated;
+
+      // modify cached list
+      if ($mode=='subscribe')
+        $a_mailbox_cache = array_merge($a_mailbox_cache, $a_mboxes);
+      else if ($mode=='unsubscribe')
+        $a_mailbox_cache = array_diff($a_mailbox_cache, $a_mboxes);
+        
+      // write mailboxlist to cache
+      $this->update_cache('mailboxes', $this->_sort_mailbox_list($a_mailbox_cache));
+      }
+
+    return $updated;
+    }
+
+
+  /**
+   * Increde/decrese messagecount for a specific mailbox
+   * @access private
+   */
+  function _set_messagecount($mbox_name, $mode, $increment)
+    {
+    $a_mailbox_cache = FALSE;
+    $mailbox = $mbox_name ? $mbox_name : $this->mailbox;
+    $mode = strtoupper($mode);
+
+    $a_mailbox_cache = $this->get_cache('messagecount');
+    
+    if (!is_array($a_mailbox_cache[$mailbox]) || !isset($a_mailbox_cache[$mailbox][$mode]) || !is_numeric($increment))
+      return FALSE;
+    
+    // add incremental value to messagecount
+    $a_mailbox_cache[$mailbox][$mode] += $increment;
+    
+    // there's something wrong, delete from cache
+    if ($a_mailbox_cache[$mailbox][$mode] < 0)
+      unset($a_mailbox_cache[$mailbox][$mode]);
+
+    // write back to cache
+    $this->update_cache('messagecount', $a_mailbox_cache);
+    
+    return TRUE;
+    }
+
+
+  /**
+   * Remove messagecount of a specific mailbox from cache
+   * @access private
+   */
+  function _clear_messagecount($mbox_name='')
+    {
+    $a_mailbox_cache = FALSE;
+    $mailbox = $mbox_name ? $mbox_name : $this->mailbox;
+
+    $a_mailbox_cache = $this->get_cache('messagecount');
+
+    if (is_array($a_mailbox_cache[$mailbox]))
+      {
+      unset($a_mailbox_cache[$mailbox]);
+      $this->update_cache('messagecount', $a_mailbox_cache);
+      }
+    }
+
+
+  /**
+   * Split RFC822 header string into an associative array
+   * @access private
+   */
+  function _parse_headers($headers)
+    {
+    $a_headers = array();
+    $lines = explode("\n", $headers);
+    $c = count($lines);
+    for ($i=0; $i<$c; $i++)
+      {
+      if ($p = strpos($lines[$i], ': '))
+        {
+        $field = strtolower(substr($lines[$i], 0, $p));
+        $value = trim(substr($lines[$i], $p+1));
+        if (!empty($value))
+          $a_headers[$field] = $value;
+        }
+      }
+    
+    return $a_headers;
+    }
+
+
+  /**
+   * @access private
+   */
+  function _parse_address_list($str, $decode=true)
+    {
+    // remove any newlines and carriage returns before
+    $a = $this->_explode_quoted_string('[,;]', preg_replace( "/[\r\n]/", " ", $str));
+    $result = array();
+    
+    foreach ($a as $key => $val)
+      {
+      $val = preg_replace("/([\"\w])</", "$1 <", $val);
+      $sub_a = $this->_explode_quoted_string(' ', $decode ? $this->decode_header($val) : $val);
+      $result[$key]['name'] = '';
+
+      foreach ($sub_a as $k => $v)
+        {
+        if (strpos($v, '@') > 0)
+          $result[$key]['address'] = str_replace('<', '', str_replace('>', '', $v));
+        else
+          $result[$key]['name'] .= (empty($result[$key]['name'])?'':' ').str_replace("\"",'',stripslashes($v));
+        }
+        
+      if (empty($result[$key]['name']))
+        $result[$key]['name'] = $result[$key]['address'];        
+      }
+    
+    return $result;
+    }
+
+
+  /**
+   * @access private
+   */
+  function _explode_quoted_string($delimiter, $string)
+    {
+    $result = array();
+    $strlen = strlen($string);
+    for ($q=$p=$i=0; $i < $strlen; $i++)
+    {
+      if ($string{$i} == "\"" && $string{$i-1} != "\\")
+        $q = $q ? false : true;
+      else if (!$q && preg_match("/$delimiter/", $string{$i}))
+      {
+        $result[] = substr($string, $p, $i - $p);
+        $p = $i + 1;
+      }
+    }
+    
+    $result[] = substr($string, $p);
+    return $result;
+    }
+
+}  // end class rcube_imap
+
+
+/**
+ * Class representing a message part
+ *
+ * @package Mail
+ */
+class rcube_message_part
+{
+  var $mime_id = '';
+  var $ctype_primary = 'text';
+  var $ctype_secondary = 'plain';
+  var $mimetype = 'text/plain';
+  var $disposition = '';
+  var $filename = '';
+  var $encoding = '8bit';
+  var $charset = '';
+  var $size = 0;
+  var $headers = array();
+  var $d_parameters = array();
+  var $ctype_parameters = array();
+
+}
+
+
+/**
+ * Class for sorting an array of iilBasicHeader objects in a predetermined order.
+ *
+ * @package Mail
+ * @author Eric Stadtherr
+ */
+class rcube_header_sorter
+{
+   var $sequence_numbers = array();
+   
+   /**
+    * Set the predetermined sort order.
+    *
+    * @param array Numerically indexed array of IMAP message sequence numbers
+    */
+   function set_sequence_numbers($seqnums)
+   {
+      $this->sequence_numbers = array_flip($seqnums);
+   }
+   /**
+    * Sort the array of header objects
+    *
+    * @param array Array of iilBasicHeader objects indexed by UID
+    */
+   function sort_headers(&$headers)
+   {
+      /*
+       * uksort would work if the keys were the sequence number, but unfortunately
+       * the keys are the UIDs.  We'll use uasort instead and dereference the value
+       * to get the sequence number (in the "id" field).
+       * 
+       * uksort($headers, array($this, "compare_seqnums")); 
+       */
+       uasort($headers, array($this, "compare_seqnums"));
+   }
+   /**
+    * Sort method called by uasort()
+    */
+   function compare_seqnums($a, $b)
+   {
+      // First get the sequence number from the header object (the 'id' field).
+      $seqa = $a->id;
+      $seqb = $b->id;
+      
+      // then find each sequence number in my ordered list
+      $posa = isset($this->sequence_numbers[$seqa]) ? intval($this->sequence_numbers[$seqa]) : -1;
+      $posb = isset($this->sequence_numbers[$seqb]) ? intval($this->sequence_numbers[$seqb]) : -1;
+      
+      // return the relative position as the comparison value
+      return $posa - $posb;
+   }
+}
+
+
+/**
+ * Add quoted-printable encoding to a given 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)
+  {
+  $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
+  $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
+  $eol = "\r\n";
+  $escape = "=";
+  $output = "";
+
+  while( list(, $line) = each($lines))
+    {
+    //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
+    $linlen = strlen($line);
+    $newline = "";
+    for($i = 0; $i < $linlen; $i++)
+      {
+      $c = substr( $line, $i, 1 );
+      $dec = ord( $c );
+      if ( ( $i == 0 ) && ( $dec == 46 ) ) // convert first point in the line into =2E
+        {
+        $c = "=2E";
+        }
+      if ( $dec == 32 )
+        {
+        if ( $i == ( $linlen - 1 ) ) // convert space at eol only
+          {
+          $c = "=20";
+          }
+        else if ( $space_conv )
+          {
+          $c = "=20";
+          }
+        }
+      else if ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) )  // always encode "\t", which is *not* required
+        {
+        $h2 = floor($dec/16);
+        $h1 = floor($dec%16);
+        $c = $escape.$hex["$h2"].$hex["$h1"];
+        }
+         
+      if ( (strlen($newline) + strlen($c)) >= $line_max )  // CRLF is not counted
+        {
+        $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
+        $newline = "";
+        // check if newline first character will be point or not
+        if ( $dec == 46 )
+          {
+          $c = "=2E";
+          }
+        }
+      $newline .= $c;
+      } // end of for
+    $output .= $newline.$eol;
+    } // end of while
+
+  return trim($output);
+  }
+
+
diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php
new file mode 100644 (file)
index 0000000..a633f85
--- /dev/null
@@ -0,0 +1,241 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_json_output.php                                 |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Class to handle HTML page output using a skin template.             |
+ |   Extends rcube_html_page class from rcube_shared.inc                 |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id:  $
+
+*/
+
+
+/**
+ * View class to produce JSON responses
+ *
+ * @package View
+ */
+class rcube_json_output
+{
+    private $config;
+    private $charset = 'UTF-8';
+    private $env = array();
+    private $texts = array();
+    private $commands = array();
+
+    public $task = '';
+    public $ajax_call = true;
+    
+    
+    /**
+     * Constructor
+     */
+    public function __construct($task)
+    {
+        $this->task   = $task;
+        $this->config = rcmail::get_instance()->config;
+    }
+    
+    
+    /**
+     * Set environment variable
+     *
+     * @param string Property name
+     * @param mixed Property value
+     */
+    public function set_env($name, $value)
+    {
+        $this->env[$name] = $value;
+    }
+    
+    /**
+     * @ignore
+     */
+    public function set_pagetitle($title)
+    {
+       $name = $this->config->get('product_name');
+       $this->command('set_pagetitle', JQ(empty($name) ? $title : $name.' :: '.$title));
+    }
+
+    /**
+     * @ignore
+     */
+    function set_charset($charset)
+    {
+        // ignore: $this->charset = $charset;
+    }
+
+
+    /**
+     * Get charset for output
+     *
+     * @return string Output charset
+     */
+    function get_charset()
+    {
+        return $this->charset;
+    }
+
+
+    /**
+     * Register a template object handler
+     *
+     * @param  string Object name
+     * @param  string Function name to call
+     * @return void
+     */
+    public function add_handler($obj, $func)
+    {
+        // ignore
+    }
+
+    /**
+     * Register a list of template object handlers
+     *
+     * @param  array Hash array with object=>handler pairs
+     * @return void
+     */
+    public function add_handlers($arr)
+    {
+        // ignore
+    }
+    
+    
+    /**
+     * Call a client method
+     *
+     * @param string Method to call
+     * @param ... Additional arguments
+     */
+    public function command()
+    {
+        $this->commands[] = func_get_args();
+    }
+    
+    
+    /**
+     * Add a localized label to the client environment
+     */
+    public function add_label()
+    {
+        $arg_list = func_get_args();
+        foreach ($arg_list as $i => $name) {
+            $this->texts[$name] = rcube_label($name);
+        }
+    }
+    
+
+    /**
+     * Invoke display_message command
+     *
+     * @param string Message to display
+     * @param string Message type [notice|confirm|error]
+     * @param array Key-value pairs to be replaced in localized text
+     * @uses self::command()
+     */
+    public function show_message($message, $type='notice', $vars=null)
+    {
+        $this->command(
+            'display_message',
+            rcube_label(array('name' => $message, 'vars' => $vars)),
+            $type
+        );
+    }
+    
+    /**
+     * Delete all stored env variables and commands
+     */
+    public public function reset()
+    {
+        $this->env = array();
+        $this->texts = array();
+        $this->commands = array();
+    }
+    
+    
+    /**
+     * Send an AJAX response to the client.
+     */
+    public function send()
+    {
+        $this->remote_response();
+        exit;
+    }
+    
+    
+    /**
+     * Send an AJAX response with executable JS code
+     *
+     * @param  string  Additional JS code
+     * @param  boolean True if output buffer should be flushed
+     * @return void
+     * @deprecated
+     */
+    public function remote_response($add='', $flush=false)
+    {
+        static $s_header_sent = false;
+
+        if (!$s_header_sent) {
+            $s_header_sent = true;
+            send_nocacheing_headers();
+            header('Content-Type: application/x-javascript; charset=' . $this->get_charset());
+            print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n";
+        }
+
+        // unset default env vars
+        unset($this->env['task'], $this->env['action'], $this->env['comm_path']);
+
+        // send response code
+        echo $this->get_js_commands() . $add;
+
+        // flush the output buffer
+        if ($flush)
+            flush();
+    }
+    
+    
+    /**
+     * Return executable javascript code for all registered commands
+     *
+     * @return string $out
+     */
+    private function get_js_commands()
+    {
+        $out = '';
+       
+       if (sizeof($this->env))
+           $out .= 'this.set_env('.json_serialize($this->env).");\n";
+        
+        foreach($this->texts as $name => $text) {
+            $out .= sprintf("this.add_label('%s', '%s');\n", $name, JQ($text));
+        }
+
+        foreach ($this->commands as $i => $args) {
+            $method = array_shift($args);
+            foreach ($args as $i => $arg) {
+                $args[$i] = json_serialize($arg);
+            }
+
+            $out .= sprintf(
+                "this.%s(%s);\n",
+                preg_replace('/^parent\./', '', $method),
+                implode(',', $args)
+            );
+        }
+
+        return $out;
+    }
+}
+
+
diff --git a/program/include/rcube_ldap.inc b/program/include/rcube_ldap.inc
deleted file mode 100644 (file)
index bdfcc31..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-<?php
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_ldap.inc                                        |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Interface to an LDAP address directory                              |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: rcube_ldap.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-
-/**
- * Model class to access an LDAP address directory
- *
- * @package Addressbook
- */
-class rcube_ldap
-{
-  var $conn;
-  var $prop = array();
-  var $fieldmap = array();
-  
-  var $filter = '';
-  var $result = null;
-  var $ldap_result = null;
-  var $sort_col = '';
-  
-  /** public properties */
-  var $primary_key = 'ID';
-  var $readonly = true;
-  var $list_page = 1;
-  var $page_size = 10;
-  var $ready = false;
-  
-  
-  /**
-   * Object constructor
-   *
-   * @param array LDAP connection properties
-   * @param integer User-ID
-   */
-  function __construct($p)
-  {
-    $this->prop = $p;
-    
-    foreach ($p as $prop => $value)
-      if (preg_match('/^(.+)_field$/', $prop, $matches))
-        $this->fieldmap[$matches[1]] = $value;
-    
-    $this->connect();
-  }
-
-  /**
-   * PHP 4 object constructor
-   *
-   * @see  rcube_ldap::__construct()
-   */
-  function rcube_ldap($p)
-  {
-    $this->__construct($p);
-  }
-  
-
-  /**
-   * Establish a connection to the LDAP server
-   */
-  function connect()
-  {
-    if (!function_exists('ldap_connect'))
-      raise_error(array('type' => 'ldap', 'message' => "No ldap support in this installation of PHP"), true);
-
-    if (is_resource($this->conn))
-      return true;
-    
-    if (!is_array($this->prop['hosts']))
-      $this->prop['hosts'] = array($this->prop['hosts']);
-
-    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['ldap_version']);
-        $this->prop['host'] = $host;
-        $this->conn = $lc;
-        break;
-      }
-    }
-    
-    if (is_resource($this->conn))
-    {
-      $this->ready = true;
-      if (!empty($this->prop['bind_dn']) && !empty($this->prop['bind_pass']))
-        $this->ready = $this->bind($this->prop['bind_dn'], $this->prop['bind_pass']);
-    }
-    else
-      raise_error(array('type' => 'ldap', 'message' => "Could not connect to any LDAP server, tried $host:{$this->prop[port]} last"), true);
-  }
-
-
-  /**
-   * 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)
-  {
-    if (!$this->conn) {
-      return false;
-    }
-    
-    if (ldap_bind($this->conn, $dn, $pass)) {
-      return true;
-    }
-
-    raise_error(array(
-        'code' => ldap_errno($this->conn),
-        'type' => 'ldap',
-        'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)),
-        true);
-
-    return false;
-  }
-
-
-  /**
-   * Close connection to LDAP server
-   */
-  function close()
-  {
-    if ($this->conn)
-    {
-      @ldap_unbind($this->conn);
-      $this->conn = null;
-    }
-  }
-
-
-  /**
-   * Set internal list page
-   *
-   * @param  number  Page number to list
-   * @access public
-   */
-  function set_page($page)
-  {
-    $this->list_page = (int)$page;
-  }
-
-
-  /**
-   * Set internal page size
-   *
-   * @param  number  Number of messages to display on one page
-   * @access public
-   */
-  function set_pagesize($size)
-  {
-    $this->page_size = (int)$size;
-  }
-
-
-  /**
-   * Save a search string for future listings
-   *
-   * @param string Filter string
-   */
-  function set_search_set($filter)
-  {
-    $this->filter = $filter;
-  }
-  
-  
-  /**
-   * Getter for saved search properties
-   *
-   * @return mixed Search properties used by this class
-   */
-  function get_search_set()
-  {
-    return $this->filter;
-  }
-
-
-  /**
-   * Reset all saved results and search parameters
-   */
-  function reset()
-  {
-    $this->result = null;
-    $this->ldap_result = null;
-    $this->filter = '';
-  }
-  
-  
-  /**
-   * 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();
-    
-    // count contacts for this user
-    $this->result = $this->count();
-    
-    // we have a search result resource
-    if ($this->ldap_result && $this->result->count > 0)
-    {
-      if ($this->sort_col && $this->prop['scope'] !== "base")
-        @ldap_sort($this->conn, $this->ldap_result, $this->sort_col);
-        
-      $entries = ldap_get_entries($this->conn, $this->ldap_result);
-      for ($i = $this->result->first; $i < min($entries['count'], $this->result->first + $this->page_size); $i++)
-        $this->result->add($this->_ldap2result($entries[$i]));
-    }
-
-    return $this->result;
-  }
-
-
-  /**
-   * Search contacts
-   *
-   * @param array   List of fields to search in
-   * @param string  Search value
-   * @param boolean True if results are requested, False if count only
-   * @return array  Indexed list of contact records and 'count' value
-   */
-  function search($fields, $value, $strict=false, $select=true)
-  {
-    // special treatment for ID-based search
-    if ($fields == 'ID' || $fields == $this->primary_key)
-    {
-      $ids = explode(',', $value);
-      $result = new rcube_result_set();
-      foreach ($ids as $id)
-        if ($rec = $this->get_record($id, true))
-        {
-          $result->add($rec);
-          $result->count++;
-        }
-      
-      return $result;
-    }
-    
-    $filter = '(|';
-    $wc = !$strict && $this->prop['fuzzy_search'] ? '*' : '';
-    if (is_array($this->prop['search_fields']))
-    {
-      foreach ($this->prop['search_fields'] as $k => $field)
-        $filter .= "($field=$wc" . rcube_ldap::quote_string($value) . "$wc)";
-    }
-    else
-    {
-      foreach ((array)$fields as $field)
-        if ($f = $this->_map_field($field))
-          $filter .= "($f=$wc" . rcube_ldap::quote_string($value) . "$wc)";
-    }
-    $filter .= ')';
-    
-    // avoid double-wildcard if $value is empty
-    $filter = preg_replace('/\*+/', '*', $filter);
-    
-    // add general filter to query
-    if (!empty($this->prop['filter']))
-      $filter = '(&(' . preg_replace('/^\(|\)$/', '', $this->prop['filter']) . ')' . $filter . ')';
-
-    // set filter string and execute search
-    $this->set_search_set($filter);
-    $this->_exec_search();
-    
-    if ($select)
-      $this->list_records();
-    else
-      $this->result = $this->count();
-   
-    return $this->result; 
-  }
-
-
-  /**
-   * Count number of available contacts in database
-   *
-   * @return object rcube_result_set Resultset with values for 'count' and 'first'
-   */
-  function count()
-  {
-    $count = 0;
-    if ($this->conn && $this->ldap_result)
-      $count = ldap_count_entries($this->conn, $this->ldap_result);
-
-    return new rcube_result_set($count, ($this->list_page-1) * $this->page_size);
-  }
-
-
-  /**
-   * Return the last result set
-   *
-   * @return object rcube_result_set Current resultset or NULL if nothing selected yet
-   */
-  function get_result()
-  {
-    return $this->result;
-  }
-  
-  
-  /**
-   * Get a specific contact record
-   *
-   * @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)
-  {
-    $res = null;
-    if ($this->conn && $dn)
-    {
-      $this->ldap_result = @ldap_read($this->conn, base64_decode($dn), "(objectclass=*)", array_values($this->fieldmap));
-      $entry = @ldap_first_entry($this->conn, $this->ldap_result);
-      
-      if ($entry && ($rec = ldap_get_attributes($this->conn, $entry)))
-      {
-        $res = $this->_ldap2result($rec);
-        $this->result = new rcube_result_set(1);
-        $this->result->add($res);
-      }
-    }
-
-    return $assoc ? $res : $this->result;
-  }
-  
-  
-  /**
-   * Create a new contact record
-   *
-   * @param array    Hash array with save data
-   * @return boolean The create record ID on success, False on error
-   */
-  function insert($save_cols)
-  {
-    // TODO
-    return false;
-  }
-  
-  
-  /**
-   * Update a specific contact record
-   *
-   * @param mixed Record identifier
-   * @param array Hash array with save data
-   * @return boolean True on success, False on error
-   */
-  function update($id, $save_cols)
-  {
-    // TODO    
-    return false;
-  }
-  
-  
-  /**
-   * Mark one or more contact records as deleted
-   *
-   * @param array  Record identifiers
-   * @return boolean True on success, False on error
-   */
-  function delete($ids)
-  {
-    // TODO
-    return false;
-  }
-
-
-  /**
-   * Execute the LDAP search based on the stored credentials
-   *
-   * @access private
-   */
-  function _exec_search()
-  {
-    if ($this->conn && $this->filter)
-    {
-      $function = $this->prop['scope'] == 'sub' ? 'ldap_search' : ($this->prop['scope'] == 'base' ? 'ldap_read' : 'ldap_list');
-      $this->ldap_result = $function($this->conn, $this->prop['base_dn'], $this->filter, array_values($this->fieldmap), 0, 0);
-      return true;
-    }
-    else
-      return false;
-  }
-  
-  
-  /**
-   * @access private
-   */
-  function _ldap2result($rec)
-  {
-    $out = array();
-    
-    if ($rec['dn'])
-      $out[$this->primary_key] = base64_encode($rec['dn']);
-    
-    foreach ($this->fieldmap as $rf => $lf)
-    {
-      if ($rec[$lf]['count'])
-        $out[$rf] = $rec[$lf][0];
-    }
-    
-    return $out;
-  }
-  
-  
-  /**
-   * @access private
-   */
-  function _map_field($field)
-  {
-    return $this->fieldmap[$field];
-  }
-  
-  
-  /**
-   * @static
-   */
-  function quote_string($str)
-  {
-    return strtr($str, array('*'=>'\2a', '('=>'\28', ')'=>'\29', '\\'=>'\5c'));
-  }
-
-
-}
-
-?>
diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php
new file mode 100644 (file)
index 0000000..334b129
--- /dev/null
@@ -0,0 +1,624 @@
+<?php
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_ldap.php                                        |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2006-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Interface to an LDAP address directory                              |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_ldap.php 1482 2008-06-06 09:42:31Z alec $
+
+*/
+
+
+/**
+ * Model class to access an LDAP address directory
+ *
+ * @package Addressbook
+ */
+class rcube_ldap
+{
+  var $conn;
+  var $prop = array();
+  var $fieldmap = array();
+  
+  var $filter = '';
+  var $result = null;
+  var $ldap_result = null;
+  var $sort_col = '';
+  
+  /** public properties */
+  var $primary_key = 'ID';
+  var $readonly = true;
+  var $list_page = 1;
+  var $page_size = 10;
+  var $ready = false;
+  
+  
+  /**
+   * Object constructor
+   *
+   * @param array LDAP connection properties
+   * @param integer User-ID
+   */
+  function __construct($p)
+  {
+    $this->prop = $p;
+    
+    foreach ($p as $prop => $value)
+      if (preg_match('/^(.+)_field$/', $prop, $matches))
+        $this->fieldmap[$matches[1]] = $value;
+
+    $this->sort_col = $p["sort"];
+
+    $this->connect();
+  }
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see  rcube_ldap::__construct()
+   */
+  function rcube_ldap($p)
+  {
+    $this->__construct($p);
+  }
+  
+
+  /**
+   * Establish a connection to the LDAP server
+   */
+  function connect()
+  {
+    if (!function_exists('ldap_connect'))
+      raise_error(array('type' => 'ldap', 'message' => "No ldap support in this installation of PHP"), true);
+
+    if (is_resource($this->conn))
+      return true;
+    
+    if (!is_array($this->prop['hosts']))
+      $this->prop['hosts'] = array($this->prop['hosts']);
+
+    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']))
+      {
+       if ($this->prop['use_tls']===true)
+         if (!ldap_start_tls($lc))
+           continue;
+
+        ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $this->prop['ldap_version']);
+        $this->prop['host'] = $host;
+        $this->conn = $lc;
+        break;
+      }
+    }
+    
+    if (is_resource($this->conn))
+    {
+      $this->ready = true;
+
+      if ($this->prop["user_specific"]) {
+        // User specific access, generate the proper values to use.
+        global $CONFIG, $RCMAIL;
+        if (empty($this->prop['bind_pass'])) {
+          // No password set, use the users.
+          $this->prop['bind_pass'] = $RCMAIL->decrypt_passwd($_SESSION["password"]);
+        } // end if
+
+        // Get the pieces needed for variable replacement.
+        // See if the logged in username has an "@" in it.
+        if (is_bool(strstr($_SESSION["username"], "@"))) {
+          // It does not, use the global default.
+          $fu = $_SESSION["username"]."@".$CONFIG["username_domain"];
+          $u = $_SESSION["username"];
+          $d = $CONFIG["username_domain"];
+        } // end if
+        else {
+          // It does.
+          $fu = $_SESSION["username"];
+          // Get the pieces needed for username and domain.
+          list($u, $d) = explode("@", $_SESSION["username"]);
+        } # end else
+
+        // Replace the bind_dn variables.
+        $bind_dn = str_replace(array("%fu", "%u", "%d"),
+                               array($fu, $u, $d),
+                               $this->prop['bind_dn']);
+        $this->prop['bind_dn'] = $bind_dn;
+        // Replace the base_dn variables.
+        $base_dn = str_replace(array("%fu", "%u", "%d"),
+                               array($fu, $u, $d),
+                               $this->prop['base_dn']);
+        $this->prop['base_dn'] = $base_dn;
+
+        $this->ready = $this->bind($this->prop['bind_dn'], $this->prop['bind_pass']);
+      } // end if
+      elseif (!empty($this->prop['bind_dn']) && !empty($this->prop['bind_pass']))
+        $this->ready = $this->bind($this->prop['bind_dn'], $this->prop['bind_pass']);
+    }
+    else
+      raise_error(array('type' => 'ldap', 'message' => "Could not connect to any LDAP server, tried $host:{$this->prop[port]} last"), true);
+
+    // See if the directory is writeable.
+    if ($this->prop['writable']) {
+      $this->readonly = false;
+    } // end if
+
+  }
+
+
+  /**
+   * 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)
+  {
+    if (!$this->conn) {
+      return false;
+    }
+    
+    if (ldap_bind($this->conn, $dn, $pass)) {
+      return true;
+    }
+
+    raise_error(array(
+        'code' => ldap_errno($this->conn),
+        'type' => 'ldap',
+        'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)),
+        true);
+
+    return false;
+  }
+
+
+  /**
+   * Close connection to LDAP server
+   */
+  function close()
+  {
+    if ($this->conn)
+    {
+      @ldap_unbind($this->conn);
+      $this->conn = null;
+    }
+  }
+
+
+  /**
+   * Set internal list page
+   *
+   * @param  number  Page number to list
+   * @access public
+   */
+  function set_page($page)
+  {
+    $this->list_page = (int)$page;
+  }
+
+
+  /**
+   * Set internal page size
+   *
+   * @param  number  Number of messages to display on one page
+   * @access public
+   */
+  function set_pagesize($size)
+  {
+    $this->page_size = (int)$size;
+  }
+
+
+  /**
+   * Save a search string for future listings
+   *
+   * @param string Filter string
+   */
+  function set_search_set($filter)
+  {
+    $this->filter = $filter;
+  }
+  
+  
+  /**
+   * Getter for saved search properties
+   *
+   * @return mixed Search properties used by this class
+   */
+  function get_search_set()
+  {
+    return $this->filter;
+  }
+
+
+  /**
+   * Reset all saved results and search parameters
+   */
+  function reset()
+  {
+    $this->result = null;
+    $this->ldap_result = null;
+    $this->filter = '';
+  }
+  
+  
+  /**
+   * List the current set of contact records
+   *
+   * @param  array  List of cols to show
+   * @param  int    Only return this number of records
+   * @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();
+    
+    // count contacts for this user
+    $this->result = $this->count();
+    
+    // we have a search result resource
+    if ($this->ldap_result && $this->result->count > 0)
+    {
+      if ($this->sort_col && $this->prop['scope'] !== "base")
+        @ldap_sort($this->conn, $this->ldap_result, $this->sort_col);
+
+      $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first;
+      $last_row = $this->result->first + $this->page_size;
+      $last_row = $subset != 0 ? $start_row + abs($subset) : $last_row;
+
+      $entries = ldap_get_entries($this->conn, $this->ldap_result);
+      for ($i = $start_row; $i < min($entries['count'], $last_row); $i++)
+        $this->result->add($this->_ldap2result($entries[$i]));
+    }
+
+    return $this->result;
+  }
+
+
+  /**
+   * Search contacts
+   *
+   * @param array   List of fields to search in
+   * @param string  Search value
+   * @param boolean True if results are requested, False if count only
+   * @return array  Indexed list of contact records and 'count' value
+   */
+  function search($fields, $value, $strict=false, $select=true)
+  {
+    // special treatment for ID-based search
+    if ($fields == 'ID' || $fields == $this->primary_key)
+    {
+      $ids = explode(',', $value);
+      $result = new rcube_result_set();
+      foreach ($ids as $id)
+        if ($rec = $this->get_record($id, true))
+        {
+          $result->add($rec);
+          $result->count++;
+        }
+      
+      return $result;
+    }
+    
+    $filter = '(|';
+    $wc = !$strict && $this->prop['fuzzy_search'] ? '*' : '';
+    if (is_array($this->prop['search_fields']))
+    {
+      foreach ($this->prop['search_fields'] as $k => $field)
+        $filter .= "($field=$wc" . rcube_ldap::quote_string($value) . "$wc)";
+    }
+    else
+    {
+      foreach ((array)$fields as $field)
+        if ($f = $this->_map_field($field))
+          $filter .= "($f=$wc" . rcube_ldap::quote_string($value) . "$wc)";
+    }
+    $filter .= ')';
+    
+    // avoid double-wildcard if $value is empty
+    $filter = preg_replace('/\*+/', '*', $filter);
+    
+    // add general filter to query
+    if (!empty($this->prop['filter']))
+      $filter = '(&(' . preg_replace('/^\(|\)$/', '', $this->prop['filter']) . ')' . $filter . ')';
+
+    // set filter string and execute search
+    $this->set_search_set($filter);
+    $this->_exec_search();
+    
+    if ($select)
+      $this->list_records();
+    else
+      $this->result = $this->count();
+   
+    return $this->result; 
+  }
+
+
+  /**
+   * Count number of available contacts in database
+   *
+   * @return object rcube_result_set Resultset with values for 'count' and 'first'
+   */
+  function count()
+  {
+    $count = 0;
+    if ($this->conn && $this->ldap_result) {
+      $count = ldap_count_entries($this->conn, $this->ldap_result);
+    } // end if
+    elseif ($this->conn) {
+      // We have a connection but no result set, attempt to get one.
+      if (empty($this->filter)) {
+        // The filter is not set, set it.
+        $this->filter = $this->prop['filter'];
+      } // end if
+      $this->_exec_search();
+      if ($this->ldap_result) {
+        $count = ldap_count_entries($this->conn, $this->ldap_result);
+      } // end if
+    } // end else
+
+    return new rcube_result_set($count, ($this->list_page-1) * $this->page_size);
+  }
+
+
+  /**
+   * Return the last result set
+   *
+   * @return object rcube_result_set Current resultset or NULL if nothing selected yet
+   */
+  function get_result()
+  {
+    return $this->result;
+  }
+  
+  
+  /**
+   * Get a specific contact record
+   *
+   * @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)
+  {
+    $res = null;
+    if ($this->conn && $dn)
+    {
+      $this->ldap_result = @ldap_read($this->conn, base64_decode($dn), "(objectclass=*)", array_values($this->fieldmap));
+      $entry = @ldap_first_entry($this->conn, $this->ldap_result);
+      
+      if ($entry && ($rec = ldap_get_attributes($this->conn, $entry)))
+      {
+        // Add in the dn for the entry.
+        $rec["dn"] = base64_decode($dn);
+        $res = $this->_ldap2result($rec);
+        $this->result = new rcube_result_set(1);
+        $this->result->add($res);
+      }
+    }
+
+    return $assoc ? $res : $this->result;
+  }
+  
+  
+  /**
+   * Create a new contact record
+   *
+   * @param array    Hash array with save data
+   * @return encoded record ID on success, False on error
+   */
+  function insert($save_cols)
+  {
+    // Map out the column names to their LDAP ones to build the new entry.
+    $newentry = array();
+    $newentry["objectClass"] = $this->prop["LDAP_Object_Classes"];
+    foreach ($save_cols as $col => $val) {
+      $fld = "";
+      $fld = $this->_map_field($col);
+      if ($fld != "") {
+        // The field does exist, add it to the entry.
+        $newentry[$fld] = $val;
+      } // end if
+    } // end foreach
+
+    // Verify that the required fields are set.
+    // We know that the email address is required as a default of rcube, so
+    // we will default its value into any unfilled required fields.
+    foreach ($this->prop["required_fields"] as $fld) {
+      if (!isset($newentry[$fld])) {
+        $newentry[$fld] = $newentry[$this->_map_field("email")];
+      } // end if
+    } // end foreach
+
+    // Build the new entries DN.
+    $dn = $this->prop["LDAP_rdn"]."=".$newentry[$this->prop["LDAP_rdn"]].",".$this->prop['base_dn'];
+    $res = @ldap_add($this->conn, $dn, $newentry);
+    if ($res === FALSE) {
+      return false;
+    } // end if
+
+    return base64_encode($dn);
+  }
+  
+  
+  /**
+   * Update a specific contact record
+   *
+   * @param mixed Record identifier
+   * @param array Hash array with save data
+   * @return boolean True on success, False on error
+   */
+  function update($id, $save_cols)
+  {
+    $record = $this->get_record($id, true);
+    $result = $this->get_result();
+    $record = $result->first();
+
+    $newdata = array();
+    $replacedata = array();
+    $deletedata = array();
+    foreach ($save_cols as $col => $val) {
+      $fld = "";
+      $fld = $this->_map_field($col);
+      if ($fld != "") {
+        // The field does exist compare it to the ldap record.
+        if ($record[$col] != $val) {
+          // Changed, but find out how.
+          if (!isset($record[$col])) {
+            // Field was not set prior, need to add it.
+            $newdata[$fld] = $val;
+          } // end if
+          elseif ($val == "") {
+            // Field supplied is empty, verify that it is not required.
+            if (!in_array($fld, $this->prop["required_fields"])) {
+              // It is not, safe to clear.
+              $deletedata[$fld] = $record[$col];
+            } // end if
+          } // end elseif
+          else {
+            // The data was modified, save it out.
+            $replacedata[$fld] = $val;
+          } // end else
+        } // end if
+      } // end if
+    } // end foreach
+
+    // Update the entry as required.
+    $dn = base64_decode($id);
+    if (!empty($deletedata)) {
+      // Delete the fields.
+      $res = @ldap_mod_del($this->conn, $dn, $deletedata);
+      if ($res === FALSE) {
+        return false;
+      } // end if
+    } // end if
+
+    if (!empty($replacedata)) {
+      // Replace the fields.
+      $res = @ldap_mod_replace($this->conn, $dn, $replacedata);
+      if ($res === FALSE) {
+        return false;
+      } // end if
+    } // end if
+
+    if (!empty($newdata)) {
+      // Add the fields.
+      $res = @ldap_mod_add($this->conn, $dn, $newdata);
+      if ($res === FALSE) {
+        return false;
+      } // end if
+    } // end if
+
+    return true;
+  }
+  
+  
+  /**
+   * Mark one or more contact records as deleted
+   *
+   * @param array  Record identifiers
+   * @return boolean True on success, False on error
+   */
+  function delete($ids)
+  {
+    if (!is_array($ids)) {
+      // Not an array, break apart the encoded DNs.
+      $dns = explode(",", $ids);
+    } // end if
+
+    foreach ($dns as $id) {
+      $dn = base64_decode($id);
+      // Delete the record.
+      $res = @ldap_delete($this->conn, $dn);
+      if ($res === FALSE) {
+        return false;
+      } // end if
+    } // end foreach
+
+    return true;
+  }
+
+
+  /**
+   * Execute the LDAP search based on the stored credentials
+   *
+   * @access private
+   */
+  function _exec_search()
+  {
+    if ($this->conn && $this->filter)
+    {
+      $function = $this->prop['scope'] == 'sub' ? 'ldap_search' : ($this->prop['scope'] == 'base' ? 'ldap_read' : 'ldap_list');
+      $this->ldap_result = $function($this->conn, $this->prop['base_dn'], $this->filter, array_values($this->fieldmap), 0, 0);
+      return true;
+    }
+    else
+      return false;
+  }
+  
+  
+  /**
+   * @access private
+   */
+  function _ldap2result($rec)
+  {
+    $out = array();
+    
+    if ($rec['dn'])
+      $out[$this->primary_key] = base64_encode($rec['dn']);
+    
+    foreach ($this->fieldmap as $rf => $lf)
+    {
+      if ($rec[$lf]['count'])
+        $out[$rf] = $rec[$lf][0];
+    }
+    
+    return $out;
+  }
+  
+  
+  /**
+   * @access private
+   */
+  function _map_field($field)
+  {
+    return $this->fieldmap[$field];
+  }
+  
+  
+  /**
+   * @static
+   */
+  function quote_string($str)
+  {
+    return strtr($str, array('*'=>'\2a', '('=>'\28', ')'=>'\29', '\\'=>'\5c'));
+  }
+
+
+}
+
+
diff --git a/program/include/rcube_mail_mime.php b/program/include/rcube_mail_mime.php
new file mode 100644 (file)
index 0000000..866786b
--- /dev/null
@@ -0,0 +1,206 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_mail_mime.php                                   |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2007-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Extend PEAR:Mail_mime class and override encodeHeaders method       |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: sendmail.inc 506 2007-03-14 00:39:51Z thomasb $
+
+*/
+
+
+/**
+ * Replacement PEAR:Mail_mime with some additional or overloaded methods
+ *
+ * @package Mail
+ */
+class rcube_mail_mime extends Mail_mime
+{
+  /**
+   * Set build parameters
+   */
+  function setParam($param)
+  {
+    if (is_array($param)) {
+      $this->_build_params = array_merge($this->_build_params, $param);
+    }
+  }
+  
+  /**
+   * Adds an image to the list of embedded images.
+   *
+   * @param  string  $file       The image file name OR image data itself
+   * @param  string  $c_type     The content type
+   * @param  string  $name       The filename of the image.
+   *                             Only use if $file is the image data
+   * @param  bool    $isfilename Whether $file is a filename or not
+   *                             Defaults to true
+   * @param  string  $contentid  Desired Content-ID of MIME part
+   *                             Defaults to generated unique ID
+   * @return mixed   true on success or PEAR_Error object
+   * @access public
+   */
+  function addHTMLImage($file, $c_type='application/octet-stream', $name = '', $isfilename = true, $contentid = '')
+  {
+    $filedata = ($isfilename === true) ? $this->_file2str($file) : $file;
+    if ($isfilename === true) {
+      $filename = ($name == '' ? $file : $name);
+    }
+    else {
+      $filename = $name;
+    }
+
+    if (PEAR::isError($filedata)) {
+        return $filedata;
+    }
+
+    if ($contentid == '') {
+       $contentid = md5(uniqid(time()));
+    }
+
+    $this->_html_images[] = array(
+      'body'   => $filedata,
+      'name'   => $filename,
+      'c_type' => $c_type,
+      'cid'    => $contentid
+    );
+
+    return true;
+  }
+  
+  
+  /**
+  * returns the HTML body portion of the message
+  * @return string HTML body of the message
+  * @access public
+  */
+  function getHTMLBody()
+  {
+     return $this->_htmlbody;
+  }
+  
+  
+  /**
+   * Creates a new mimePart object, using multipart/mixed as
+   * the initial content-type and returns it during the
+   * build process.
+   *
+   * @return object  The multipart/mixed mimePart object
+   * @access private
+   */
+  function &_addMixedPart()
+  {
+    $params['content_type'] = $this->_headers['Content-Type'] ? $this->_headers['Content-Type'] : 'multipart/mixed';
+    $ret = new Mail_mimePart('', $params);
+    return $ret;
+  }
+  
+  
+  /**
+   * Encodes a header as per RFC2047
+   *
+   * @param  array $input The header data to encode
+   * @param  array $params Extra build parameters
+   * @return array Encoded data
+   * @access private
+   * @override
+   */
+  function _encodeHeaders($input, $params = array())
+  {
+    $maxlen = 73;
+    $params += $this->_build_params;
+    
+    foreach ($input as $hdr_name => $hdr_value)
+    {
+      // if header contains e-mail addresses
+      if (preg_match('/\s<.+@[a-z0-9\-\.]+\.[a-z]+>/U', $hdr_value)) {
+        $chunks = $this->_explode_quoted_string(',', $hdr_value);
+      }
+      else {
+        $chunks = array($hdr_value);
+      }
+
+      $hdr_value = '';
+      $line_len = 0;
+
+      foreach ($chunks as $i => $value) {
+        $value = trim($value);
+
+        //This header contains non ASCII chars and should be encoded.
+        if (preg_match('#[\x80-\xFF]{1}#', $value)) {
+          $suffix = '';
+          // Don't encode e-mail address
+          if (preg_match('/(.+)\s(<.+@[a-z0-9\-\.]+>)$/Ui', $value, $matches)) {
+            $value = $matches[1];
+            $suffix = ' '.$matches[2];
+          }
+
+          switch ($params['head_encoding']) {
+            case 'base64':
+            // Base64 encoding has been selected.
+            $mode = 'B';
+            $encoded = base64_encode($value);
+            break;
+
+            case 'quoted-printable':
+            default:
+            // quoted-printable encoding has been selected
+            $mode = 'Q';
+            $encoded = preg_replace('/([\x2C\x3F\x80-\xFF])/e', "'='.sprintf('%02X', ord('\\1'))", $value);
+            // replace spaces with _
+            $encoded = str_replace(' ', '_', $encoded);
+          }
+
+          $value = '=?' . $params['head_charset'] . '?' . $mode . '?' . $encoded . '?=' . $suffix;
+        }
+
+        // add chunk to output string by regarding the header maxlen
+        $len = strlen($value);
+        if ($i == 0 || $line_len + $len < $maxlen) {
+          $hdr_value .= ($i>0?', ':'') . $value;
+          $line_len += $len + ($i>0?2:0);
+        }
+        else {
+          $hdr_value .= ($i>0?', ':'') . "\n " . $value;
+          $line_len = $len;
+        }
+      }
+
+      $input[$hdr_name] = $hdr_value;
+    }
+
+    return $input;
+  }
+
+
+  function _explode_quoted_string($delimiter, $string)
+  {
+    $result = array();
+    $strlen = strlen($string);
+    for ($q=$p=$i=0; $i < $strlen; $i++) {
+      if ($string{$i} == "\"" && $string{$i-1} != "\\") {
+        $q = $q ? false : true;
+      }
+      else if (!$q && $string{$i} == $delimiter) {
+        $result[] = substr($string, $p, $i - $p);
+        $p = $i + 1;
+      }
+    }
+    
+    $result[] = substr($string, $p);
+    return $result;
+  }
+
+}
+
diff --git a/program/include/rcube_mdb2.inc b/program/include/rcube_mdb2.inc
deleted file mode 100644 (file)
index 3f13a75..0000000
+++ /dev/null
@@ -1,620 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_mdb2.inc                                        |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   PEAR:DB wrapper class that implements PEAR MDB2 functions           |
- |   See http://pear.php.net/package/MDB2                                |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Lukas Kahwe Smith <smith@pooteeweet.org>                      |
- +-----------------------------------------------------------------------+
-
- $Id: rcube_mdb2.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-
-/**
- * Obtain the PEAR::DB class that is used for abstraction
- */
-require_once('MDB2.php');
-
-
-/**
- * Database independent query interface
- *
- * This is a wrapper for the PEAR::MDB2 class
- *
- * @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_mdb2
-  {
-  var $db_dsnw;               // DSN for write operations
-  var $db_dsnr;               // DSN for read operations
-  var $db_connected = false;  // Already connected ?
-  var $db_mode = '';          // Connection mode
-  var $db_handle = 0;         // Connection handle
-  var $db_error = false;
-  var $db_error_msg = '';
-  var $debug_mode = false;
-
-  var $a_query_results = array('dummy');
-  var $last_res_id = 0;
-
-
-  /**
-   * Object constructor
-   *
-   * @param  string  DSN for read/write operations
-   * @param  string  Optional DSN for read only operations
-   */
-  function __construct($db_dsnw, $db_dsnr='', $pconn=false)
-    {
-    if ($db_dsnr=='')
-      $db_dsnr=$db_dsnw;
-
-    $this->db_dsnw = $db_dsnw;
-    $this->db_dsnr = $db_dsnr;
-    $this->db_pconn = $pconn;
-    
-    $dsn_array = MDB2::parseDSN($db_dsnw);
-    $this->db_provider = $dsn_array['phptype'];
-    }
-
-
-  /**
-   * PHP 4 object constructor
-   *
-   * @see  rcube_mdb2::__construct
-   */
-  function rcube_db($db_dsnw,$db_dsnr='')
-    {
-    $this->__construct($db_dsnw,$db_dsnr);
-    }
-
-
-  /**
-   * Connect to specific database
-   *
-   * @param  string  DSN for DB connections
-   * @return object  PEAR database handle
-   * @access private
-   */
-  function dsn_connect($dsn)
-    {
-    // Use persistent connections if available
-    $dbh = MDB2::connect($dsn, array(
-        'persistent' => $this->db_pconn,
-        'emulate_prepared' => $this->debug_mode,
-        'debug' => $this->debug_mode,
-        'debug_handler' => 'mdb2_debug_handler',
-        'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL));
-
-    if (MDB2::isError($dbh))
-      {
-      $this->db_error = TRUE;
-      $this->db_error_msg = $dbh->getMessage();
-      
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__,
-        'file' => __FILE__, 'message' => $dbh->getUserInfo()), TRUE, FALSE);
-      }
-    else if ($this->db_provider=='sqlite')
-      {
-      $dsn_array = MDB2::parseDSN($dsn);
-      if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
-        $this->_sqlite_create_database($dbh, $this->sqlite_initials);
-      }
-    else
-      $dbh->setCharset('utf8');
-
-    return $dbh;
-    }
-
-
-  /**
-   * Connect to appropiate databse
-   * depending on the operation
-   *
-   * @param  string  Connection mode (r|w)
-   * @access public
-   */
-  function db_connect($mode)
-    {
-    $this->db_mode = $mode;
-
-    // Already connected
-    if ($this->db_connected)
-      {
-      // no replication, current connection is ok
-      if ($this->db_dsnw==$this->db_dsnr)
-        return;
-
-      // connected to master, current connection is ok
-      if ($this->db_mode=='w')
-        return;
-
-      // Same mode, current connection is ok
-      if ($this->db_mode==$mode)
-        return;
-      }
-
-    if ($mode=='r')
-      $dsn = $this->db_dsnr;
-    else
-      $dsn = $this->db_dsnw;
-
-    $this->db_handle = $this->dsn_connect($dsn);
-    $this->db_connected = true;
-    }
-
-
-  /**
-   * Activate/deactivate debug mode
-   *
-   * @param boolean True if SQL queries should be logged
-   */
-  function set_debug($dbg = true)
-  {
-    $this->debug_mode = $dbg;
-    if ($this->db_connected)
-    {
-      $this->db_handle->setOption('debug', $dbg);
-      $this->db_handle->setOption('emulate_prepared', $dbg);
-    }
-  }
-
-    
-  /**
-   * Getter for error state
-   *
-   * @param  boolean  True on error
-   */
-  function is_error()
-    {
-    return $this->db_error ? $this->db_error_msg : FALSE;
-    }
-    
-
-  /**
-   * Execute a SQL query
-   *
-   * @param  string  SQL query to execute
-   * @param  mixed   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access public
-   */
-  function query()
-    {
-    $params = func_get_args();
-    $query = array_shift($params);
-
-    return $this->_query($query, 0, 0, $params);
-    }
-
-
-  /**
-   * Execute a SQL query with limits
-   *
-   * @param  string  SQL query to execute
-   * @param  number  Offset for LIMIT statement
-   * @param  number  Number of rows for LIMIT statement
-   * @param  mixed   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access public
-   */
-  function limitquery()
-    {
-    $params = func_get_args();
-    $query = array_shift($params);
-    $offset = array_shift($params);
-    $numrows = array_shift($params);
-
-    return $this->_query($query, $offset, $numrows, $params);
-    }
-
-
-  /**
-   * Execute a SQL query with limits
-   *
-   * @param  string  SQL query to execute
-   * @param  number  Offset for LIMIT statement
-   * @param  number  Number of rows for LIMIT statement
-   * @param  array   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access private
-   */
-  function _query($query, $offset, $numrows, $params)
-    {
-    // Read or write ?
-    if (strtolower(trim(substr($query,0,6)))=='select')
-      $mode='r';
-    else
-      $mode='w';
-
-    $this->db_connect($mode);
-
-    if ($this->db_provider == 'sqlite')
-      $this->_sqlite_prepare();
-
-    if ($numrows || $offset)
-      $result = $this->db_handle->setLimit($numrows,$offset);
-
-    if (empty($params))
-        $result = $this->db_handle->query($query);
-    else
-      {
-      $params = (array)$params;
-      $q = $this->db_handle->prepare($query);
-      if ($this->db_handle->isError($q))
-        {
-        $this->db_error = TRUE;
-        $this->db_error_msg = $q->userinfo;
-
-        raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                          'message' => $this->db_error_msg), TRUE, TRUE);
-        }
-      else
-        {
-        $result = $q->execute($params);
-        $q->free();
-        }
-      }
-
-    // add result, even if it's an error
-    return $this->_add_result($result);
-    }
-
-
-  /**
-   * Get number of rows for a SQL query
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Number of rows or FALSE on failure
-   * @access public
-   */
-  function num_rows($res_id=NULL)
-    {
-    if (!$this->db_handle)
-      return FALSE;
-
-    if ($result = $this->_get_result($res_id))
-      return $result->numRows();
-    else
-      return FALSE;
-    }
-
-
-  /**
-   * Get number of affected rows fort he last query
-   *
-   * @return mixed   Number of rows or FALSE on failure
-   * @access public
-   */
-  function affected_rows($result = null)
-    {
-    if (!$this->db_handle)
-      return FALSE;
-
-    return $this->_get_result($result);
-    }
-
-
-  /**
-   * Get last inserted record ID
-   * For Postgres databases, a sequence name is required
-   *
-   * @param  string  Sequence name for increment
-   * @return mixed   ID or FALSE on failure
-   * @access public
-   */
-  function insert_id($sequence = '')
-    {
-    if (!$this->db_handle || $this->db_mode=='r')
-      return FALSE;
-
-    return $this->db_handle->lastInsertID($sequence);
-    }
-
-
-  /**
-   * Get an associative array for one row
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access public
-   */
-  function fetch_assoc($res_id=NULL)
-    {
-    $result = $this->_get_result($res_id);
-    return $this->_fetch_row($result, MDB2_FETCHMODE_ASSOC);
-    }
-
-
-  /**
-   * Get an index array for one row
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access public
-   */
-  function fetch_array($res_id=NULL)
-    {
-    $result = $this->_get_result($res_id);
-    return $this->_fetch_row($result, MDB2_FETCHMODE_ORDERED);
-    }
-
-
-  /**
-   * Get co values for a result row
-   *
-   * @param  object  Query result handle
-   * @param  number  Fetch mode identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access private
-   */
-  function _fetch_row($result, $mode)
-    {
-    if (PEAR::isError($result))
-      {
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => $this->db_link->getMessage()), TRUE, FALSE);
-      return FALSE;
-      }
-
-    return $result->fetchRow($mode);
-    }
-
-
-  /**
-   * Formats input so it can be safely used in a query
-   *
-   * @param  mixed   Value to quote
-   * @return string  Quoted/converted string for use in query
-   * @access public
-   */
-  function quote($input, $type = null)
-    {
-    // create DB handle if not available
-    if (!$this->db_handle)
-      $this->db_connect('r');
-
-    // escape pear identifier chars
-    $rep_chars = array('?' => '\?',
-                       '!' => '\!',
-                       '&' => '\&');
-
-    return $this->db_handle->quote($input, $type);
-    }
-
-
-  /**
-   * Quotes a string so it can be safely used as a table or column name
-   *
-   * @param  string  Value to quote
-   * @return string  Quoted string for use in query
-   * @deprecated     Replaced by rcube_MDB2::quote_identifier
-   * @see            rcube_MDB2::quote_identifier
-   * @access public
-   */
-  function quoteIdentifier($str)
-       {
-    return $this->quote_identifier($str);
-       }
-
-
-  /**
-   * Quotes a string so it can be safely used as a table or column name
-   *
-   * @param  string  Value to quote
-   * @return string  Quoted string for use in query
-   * @access public
-   */
-  function quote_identifier($str)
-    {
-    if (!$this->db_handle)
-      $this->db_connect('r');
-
-    return $this->db_handle->quoteIdentifier($str);
-    }
-
-  /**
-   * Escapes a string
-   *
-   * @param  string  The string to be escaped
-   * @return string  The escaped string
-   * @access public
-   * @since  0.1.1
-   */
-  function escapeSimple($str)
-    {
-    if (!$this->db_handle)
-      $this->db_connect('r');
-   
-    return $this->db_handle->escape($str);
-    }
-
-
-  /**
-   * Return SQL function for current time and date
-   *
-   * @return string SQL function to use in query
-   * @access public
-   */
-  function now()
-    {
-    switch($this->db_provider)
-      {
-      case 'mssql':
-        return "getdate()";
-
-      default:
-        return "now()";
-      }
-    }
-
-
-  /**
-   * Return SQL statement to convert a field value into a unix timestamp
-   *
-   * @param  string  Field name
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function unixtimestamp($field)
-    {
-    switch($this->db_provider)
-      {
-      case 'pgsql':
-        return "EXTRACT (EPOCH FROM $field)";
-        break;
-
-      case 'mssql':
-        return "datediff(s, '1970-01-01 00:00:00', $field)";
-
-      default:
-        return "UNIX_TIMESTAMP($field)";
-      }
-    }
-
-
-  /**
-   * Return SQL statement to convert from a unix timestamp
-   *
-   * @param  string  Field name
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function fromunixtime($timestamp)
-    {
-    switch($this->db_provider)
-      {
-      case 'mysqli':
-      case 'mysql':
-      case 'sqlite':
-        return "FROM_UNIXTIME($timestamp)";
-
-      default:
-        return date("'Y-m-d H:i:s'", $timestamp);
-      }
-    }
-
-
-  /**
-   * Adds a query result and returns a handle ID
-   *
-   * @param  object  Query handle
-   * @return mixed   Handle ID or FALE on failure
-   * @access private
-   */
-  function _add_result($res)
-    {
-    // sql error occured
-    if (PEAR::isError($res))
-      {
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)), TRUE, FALSE);
-      return FALSE;
-      }
-    else
-      {
-      $res_id = sizeof($this->a_query_results);
-      $this->a_query_results[$res_id] = $res;
-      $this->last_res_id = $res_id;
-      return $res_id;
-      }
-    }
-
-
-  /**
-   * Resolves a given handle ID and returns the according query handle
-   * If no ID is specified, the last ressource handle will be returned
-   *
-   * @param  number  Handle ID
-   * @return mixed   Ressource handle or FALE on failure
-   * @access private
-   */
-  function _get_result($res_id=NULL)
-    {
-    if ($res_id==NULL)
-      $res_id = $this->last_res_id;
-
-     if ($res_id && isset($this->a_query_results[$res_id]))
-       return $this->a_query_results[$res_id];
-     else
-       return FALSE;
-    }
-
-
-  /**
-   * Create a sqlite database from a file
-   *
-   * @param  object  SQLite database handle
-   * @param  string  File path to use for DB creation
-   * @access private
-   */
-  function _sqlite_create_database($dbh, $file_name)
-    {
-    if (empty($file_name) || !is_string($file_name))
-      return;
-
-    $data = '';
-    if ($fd = fopen($file_name, 'r'))
-      {
-      $data = fread($fd, filesize($file_name));
-      fclose($fd);
-      }
-
-    if (strlen($data))
-      sqlite_exec($dbh->connection, $data);
-    }
-
-
-  /**
-   * Add some proprietary database functions to the current SQLite handle
-   * in order to make it MySQL compatible
-   *
-   * @access private
-   */
-  function _sqlite_prepare()
-    {
-    include_once('include/rcube_sqlite.inc');
-
-    // we emulate via callback some missing MySQL function
-    sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime");
-    sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp");
-    sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now");
-    sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5");
-    }
-
-
-  }  // end class rcube_db
-
-
-/* this is our own debug handler for the MDB2 connection */
-function mdb2_debug_handler(&$db, $scope, $message, $context = array())
-{
-  if ($scope != 'prepare')
-  {
-    $debug_output = $scope . '('.$db->db_index.'): ';
-    $debug_output .= $message . $db->getOption('log_line_break');
-    write_log('sqllog', $debug_output);
-  }
-}
-
-
-?>
diff --git a/program/include/rcube_mdb2.php b/program/include/rcube_mdb2.php
new file mode 100644 (file)
index 0000000..73f1b40
--- /dev/null
@@ -0,0 +1,613 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_mdb2.php                                        |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   PEAR:DB wrapper class that implements PEAR MDB2 functions           |
+ |   See http://pear.php.net/package/MDB2                                |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Lukas Kahwe Smith <smith@pooteeweet.org>                      |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_mdb2.php 1390 2008-05-15 11:15:58Z thomasb $
+
+*/
+
+
+/**
+ * Database independent query interface
+ *
+ * This is a wrapper for the PEAR::MDB2 class
+ *
+ * @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_mdb2
+  {
+  var $db_dsnw;               // DSN for write operations
+  var $db_dsnr;               // DSN for read operations
+  var $db_connected = false;  // Already connected ?
+  var $db_mode = '';          // Connection mode
+  var $db_handle = 0;         // Connection handle
+  var $db_error = false;
+  var $db_error_msg = '';
+  var $debug_mode = false;
+
+  var $a_query_results = array('dummy');
+  var $last_res_id = 0;
+
+
+  /**
+   * Object constructor
+   *
+   * @param  string  DSN for read/write operations
+   * @param  string  Optional DSN for read only operations
+   */
+  function __construct($db_dsnw, $db_dsnr='', $pconn=false)
+    {
+    if ($db_dsnr=='')
+      $db_dsnr=$db_dsnw;
+
+    $this->db_dsnw = $db_dsnw;
+    $this->db_dsnr = $db_dsnr;
+    $this->db_pconn = $pconn;
+    
+    $dsn_array = MDB2::parseDSN($db_dsnw);
+    $this->db_provider = $dsn_array['phptype'];
+    }
+
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see  rcube_mdb2::__construct
+   */
+  function rcube_db($db_dsnw,$db_dsnr='')
+    {
+    $this->__construct($db_dsnw,$db_dsnr);
+    }
+
+
+  /**
+   * Connect to specific database
+   *
+   * @param  string  DSN for DB connections
+   * @return object  PEAR database handle
+   * @access private
+   */
+  function dsn_connect($dsn)
+    {
+    // Use persistent connections if available
+    $dbh = MDB2::connect($dsn, array(
+        'persistent' => $this->db_pconn,
+        'emulate_prepared' => $this->debug_mode,
+        'debug' => $this->debug_mode,
+        'debug_handler' => 'mdb2_debug_handler',
+        'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL));
+
+    if (MDB2::isError($dbh))
+      {
+      $this->db_error = TRUE;
+      $this->db_error_msg = $dbh->getMessage();
+      
+      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__,
+        'file' => __FILE__, 'message' => $dbh->getUserInfo()), TRUE, FALSE);
+      }
+    else if ($this->db_provider=='sqlite')
+      {
+      $dsn_array = MDB2::parseDSN($dsn);
+      if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
+        $this->_sqlite_create_database($dbh, $this->sqlite_initials);
+      }
+    else
+      $dbh->setCharset('utf8');
+
+    return $dbh;
+    }
+
+
+  /**
+   * Connect to appropiate databse
+   * depending on the operation
+   *
+   * @param  string  Connection mode (r|w)
+   * @access public
+   */
+  function db_connect($mode)
+    {
+    $this->db_mode = $mode;
+
+    // Already connected
+    if ($this->db_connected)
+      {
+      // no replication, current connection is ok
+      if ($this->db_dsnw==$this->db_dsnr)
+        return;
+
+      // connected to master, current connection is ok
+      if ($this->db_mode=='w')
+        return;
+
+      // Same mode, current connection is ok
+      if ($this->db_mode==$mode)
+        return;
+      }
+
+    if ($mode=='r')
+      $dsn = $this->db_dsnr;
+    else
+      $dsn = $this->db_dsnw;
+
+    $this->db_handle = $this->dsn_connect($dsn);
+    $this->db_connected = true;
+    }
+
+
+  /**
+   * Activate/deactivate debug mode
+   *
+   * @param boolean True if SQL queries should be logged
+   */
+  function set_debug($dbg = true)
+  {
+    $this->debug_mode = $dbg;
+    if ($this->db_connected)
+    {
+      $this->db_handle->setOption('debug', $dbg);
+      $this->db_handle->setOption('emulate_prepared', $dbg);
+    }
+  }
+
+    
+  /**
+   * Getter for error state
+   *
+   * @param  boolean  True on error
+   */
+  function is_error()
+    {
+    return $this->db_error ? $this->db_error_msg : FALSE;
+    }
+    
+
+  /**
+   * Execute a SQL query
+   *
+   * @param  string  SQL query to execute
+   * @param  mixed   Values to be inserted in query
+   * @return number  Query handle identifier
+   * @access public
+   */
+  function query()
+    {
+    $params = func_get_args();
+    $query = array_shift($params);
+
+    return $this->_query($query, 0, 0, $params);
+    }
+
+
+  /**
+   * Execute a SQL query with limits
+   *
+   * @param  string  SQL query to execute
+   * @param  number  Offset for LIMIT statement
+   * @param  number  Number of rows for LIMIT statement
+   * @param  mixed   Values to be inserted in query
+   * @return number  Query handle identifier
+   * @access public
+   */
+  function limitquery()
+    {
+    $params = func_get_args();
+    $query = array_shift($params);
+    $offset = array_shift($params);
+    $numrows = array_shift($params);
+
+    return $this->_query($query, $offset, $numrows, $params);
+    }
+
+
+  /**
+   * Execute a SQL query with limits
+   *
+   * @param  string  SQL query to execute
+   * @param  number  Offset for LIMIT statement
+   * @param  number  Number of rows for LIMIT statement
+   * @param  array   Values to be inserted in query
+   * @return number  Query handle identifier
+   * @access private
+   */
+  function _query($query, $offset, $numrows, $params)
+    {
+    // Read or write ?
+    if (strtolower(trim(substr($query,0,6)))=='select')
+      $mode='r';
+    else
+      $mode='w';
+
+    $this->db_connect($mode);
+
+    if ($this->db_provider == 'sqlite')
+      $this->_sqlite_prepare();
+
+    if ($numrows || $offset)
+      $result = $this->db_handle->setLimit($numrows,$offset);
+
+    if (empty($params))
+        $result = $this->db_handle->query($query);
+    else
+      {
+      $params = (array)$params;
+      $q = $this->db_handle->prepare($query);
+      if ($this->db_handle->isError($q))
+        {
+        $this->db_error = TRUE;
+        $this->db_error_msg = $q->userinfo;
+
+        raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
+                          'message' => $this->db_error_msg), TRUE, TRUE);
+        }
+      else
+        {
+        $result = $q->execute($params);
+        $q->free();
+        }
+      }
+
+    // add result, even if it's an error
+    return $this->_add_result($result);
+    }
+
+
+  /**
+   * Get number of rows for a SQL query
+   * If no query handle is specified, the last query will be taken as reference
+   *
+   * @param  number  Optional query handle identifier
+   * @return mixed   Number of rows or FALSE on failure
+   * @access public
+   */
+  function num_rows($res_id=NULL)
+    {
+    if (!$this->db_handle)
+      return FALSE;
+
+    if ($result = $this->_get_result($res_id))
+      return $result->numRows();
+    else
+      return FALSE;
+    }
+
+
+  /**
+   * Get number of affected rows fort he last query
+   *
+   * @return mixed   Number of rows or FALSE on failure
+   * @access public
+   */
+  function affected_rows($result = null)
+    {
+    if (!$this->db_handle)
+      return FALSE;
+
+    return $this->_get_result($result);
+    }
+
+
+  /**
+   * Get last inserted record ID
+   * For Postgres databases, a sequence name is required
+   *
+   * @param  string  Sequence name for increment
+   * @return mixed   ID or FALSE on failure
+   * @access public
+   */
+  function insert_id($sequence = '')
+    {
+    if (!$this->db_handle || $this->db_mode=='r')
+      return FALSE;
+
+    return $this->db_handle->lastInsertID($sequence);
+    }
+
+
+  /**
+   * Get an associative array for one row
+   * If no query handle is specified, the last query will be taken as reference
+   *
+   * @param  number  Optional query handle identifier
+   * @return mixed   Array with col values or FALSE on failure
+   * @access public
+   */
+  function fetch_assoc($res_id=NULL)
+    {
+    $result = $this->_get_result($res_id);
+    return $this->_fetch_row($result, MDB2_FETCHMODE_ASSOC);
+    }
+
+
+  /**
+   * Get an index array for one row
+   * If no query handle is specified, the last query will be taken as reference
+   *
+   * @param  number  Optional query handle identifier
+   * @return mixed   Array with col values or FALSE on failure
+   * @access public
+   */
+  function fetch_array($res_id=NULL)
+    {
+    $result = $this->_get_result($res_id);
+    return $this->_fetch_row($result, MDB2_FETCHMODE_ORDERED);
+    }
+
+
+  /**
+   * Get co values for a result row
+   *
+   * @param  object  Query result handle
+   * @param  number  Fetch mode identifier
+   * @return mixed   Array with col values or FALSE on failure
+   * @access private
+   */
+  function _fetch_row($result, $mode)
+    {
+    if (PEAR::isError($result))
+      {
+      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
+                        'message' => $this->db_link->getMessage()), TRUE, FALSE);
+      return FALSE;
+      }
+
+    return $result->fetchRow($mode);
+    }
+
+
+  /**
+   * Formats input so it can be safely used in a query
+   *
+   * @param  mixed   Value to quote
+   * @return string  Quoted/converted string for use in query
+   * @access public
+   */
+  function quote($input, $type = null)
+    {
+    // create DB handle if not available
+    if (!$this->db_handle)
+      $this->db_connect('r');
+
+    // escape pear identifier chars
+    $rep_chars = array('?' => '\?',
+                       '!' => '\!',
+                       '&' => '\&');
+
+    return $this->db_handle->quote($input, $type);
+    }
+
+
+  /**
+   * Quotes a string so it can be safely used as a table or column name
+   *
+   * @param  string  Value to quote
+   * @return string  Quoted string for use in query
+   * @deprecated     Replaced by rcube_MDB2::quote_identifier
+   * @see            rcube_MDB2::quote_identifier
+   * @access public
+   */
+  function quoteIdentifier($str)
+       {
+    return $this->quote_identifier($str);
+       }
+
+
+  /**
+   * Quotes a string so it can be safely used as a table or column name
+   *
+   * @param  string  Value to quote
+   * @return string  Quoted string for use in query
+   * @access public
+   */
+  function quote_identifier($str)
+    {
+    if (!$this->db_handle)
+      $this->db_connect('r');
+
+    return $this->db_handle->quoteIdentifier($str);
+    }
+
+  /**
+   * Escapes a string
+   *
+   * @param  string  The string to be escaped
+   * @return string  The escaped string
+   * @access public
+   * @since  0.1.1
+   */
+  function escapeSimple($str)
+    {
+    if (!$this->db_handle)
+      $this->db_connect('r');
+   
+    return $this->db_handle->escape($str);
+    }
+
+
+  /**
+   * Return SQL function for current time and date
+   *
+   * @return string SQL function to use in query
+   * @access public
+   */
+  function now()
+    {
+    switch($this->db_provider)
+      {
+      case 'mssql':
+        return "getdate()";
+
+      default:
+        return "now()";
+      }
+    }
+
+
+  /**
+   * Return SQL statement to convert a field value into a unix timestamp
+   *
+   * @param  string  Field name
+   * @return string  SQL statement to use in query
+   * @access public
+   */
+  function unixtimestamp($field)
+    {
+    switch($this->db_provider)
+      {
+      case 'pgsql':
+        return "EXTRACT (EPOCH FROM $field)";
+        break;
+
+      case 'mssql':
+        return "datediff(s, '1970-01-01 00:00:00', $field)";
+
+      default:
+        return "UNIX_TIMESTAMP($field)";
+      }
+    }
+
+
+  /**
+   * Return SQL statement to convert from a unix timestamp
+   *
+   * @param  string  Field name
+   * @return string  SQL statement to use in query
+   * @access public
+   */
+  function fromunixtime($timestamp)
+    {
+    switch($this->db_provider)
+      {
+      case 'mysqli':
+      case 'mysql':
+      case 'sqlite':
+        return sprintf("FROM_UNIXTIME(%d)", $timestamp);
+
+      default:
+        return date("'Y-m-d H:i:s'", $timestamp);
+      }
+    }
+
+
+  /**
+   * Adds a query result and returns a handle ID
+   *
+   * @param  object  Query handle
+   * @return mixed   Handle ID or FALE on failure
+   * @access private
+   */
+  function _add_result($res)
+    {
+    // sql error occured
+    if (PEAR::isError($res))
+      {
+      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
+                        'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)), TRUE, FALSE);
+      return FALSE;
+      }
+    else
+      {
+      $res_id = sizeof($this->a_query_results);
+      $this->a_query_results[$res_id] = $res;
+      $this->last_res_id = $res_id;
+      return $res_id;
+      }
+    }
+
+
+  /**
+   * Resolves a given handle ID and returns the according query handle
+   * If no ID is specified, the last ressource handle will be returned
+   *
+   * @param  number  Handle ID
+   * @return mixed   Ressource handle or FALE on failure
+   * @access private
+   */
+  function _get_result($res_id=NULL)
+    {
+    if ($res_id==NULL)
+      $res_id = $this->last_res_id;
+
+     if ($res_id && isset($this->a_query_results[$res_id]))
+       return $this->a_query_results[$res_id];
+     else
+       return FALSE;
+    }
+
+
+  /**
+   * Create a sqlite database from a file
+   *
+   * @param  object  SQLite database handle
+   * @param  string  File path to use for DB creation
+   * @access private
+   */
+  function _sqlite_create_database($dbh, $file_name)
+    {
+    if (empty($file_name) || !is_string($file_name))
+      return;
+
+    $data = '';
+    if ($fd = fopen($file_name, 'r'))
+      {
+      $data = fread($fd, filesize($file_name));
+      fclose($fd);
+      }
+
+    if (strlen($data))
+      sqlite_exec($dbh->connection, $data);
+    }
+
+
+  /**
+   * Add some proprietary database functions to the current SQLite handle
+   * in order to make it MySQL compatible
+   *
+   * @access private
+   */
+  function _sqlite_prepare()
+    {
+    include_once('include/rcube_sqlite.inc');
+
+    // we emulate via callback some missing MySQL function
+    sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime");
+    sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp");
+    sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now");
+    sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5");
+    }
+
+
+  }  // end class rcube_db
+
+
+/* this is our own debug handler for the MDB2 connection */
+function mdb2_debug_handler(&$db, $scope, $message, $context = array())
+{
+  if ($scope != 'prepare')
+  {
+    $debug_output = $scope . '('.$db->db_index.'): ';
+    $debug_output .= $message . $db->getOption('log_line_break');
+    write_log('sqllog', $debug_output);
+  }
+}
+
+
diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php
new file mode 100644 (file)
index 0000000..4d3cb6c
--- /dev/null
@@ -0,0 +1,398 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_message.php                                     |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Logical representation of a mail message with all its data          |
+ |   and related functions                                               |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_imap.php 1344 2008-04-30 08:21:42Z thomasb $
+
+*/
+
+
+/**
+ * Logical representation of a mail message with all its data
+ * and related functions
+ *
+ * @package    Mail
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ */
+class rcube_message
+{
+  private $app;
+  private $imap;
+  private $opt = array();
+  private $inline_parts = array();
+  private $parse_alternative = false;
+  
+  public $uid = null;
+  public $headers;
+  public $structure;
+  public $parts = array();
+  public $mime_parts = array();
+  public $attachments = array();
+  public $subject = '';
+  public $is_safe = false;
+  
+  
+  function __construct($uid)
+  {
+    $this->app = rcmail::get_instance();
+    $this->imap = $this->app->imap;
+    
+    $this->uid = $uid;
+    $this->headers = $this->imap->get_headers($uid);
+    $this->subject = rcube_imap::decode_mime_string($this->headers->subject, $this->headers->charset);
+    
+    $this->is_safe = (intval($_GET['_safe']) || $_SESSION['safe_messages'][$uid]) ? true : false;
+    $_SESSION['safe_messages'][$uid] = $this->is_safe;
+    
+    $this->opt = array(
+      'safe' => $this->is_safe,
+      'prefer_html' => $this->app->config->get('prefer_html'),
+      'get_url' => rcmail_url('get', array('_mbox' => $this->imap->get_mailbox_name(), '_uid' => $uid))
+    );
+    
+    if ($this->structure = $this->imap->get_structure($uid)) {
+      $this->get_mime_numbers($this->structure);
+      $this->parse_structure($this->structure);
+    }
+    else {
+      $this->body = $this->imap->get_body($uid);
+    }
+  }
+  
+  
+  /**
+   * Return a (decoded) message header
+   *
+   * @param string Header name
+   * @param bool   Don't mime-decode the value
+   * @return string Header value
+   */
+  public function get_header($name, $raw = false)
+  {
+    $value = $this->headers->$name;
+    return $raw ? $value : $this->imap->decode_header($value);
+  }
+  
+  
+  /**
+   * Compose a valid URL for getting a message part
+   *
+   * @param string Part MIME-ID
+   * @return string URL or false if part does not exist
+   */
+  public function get_part_url($mime_id)
+  {
+    if ($this->mime_parts[$mime_id])
+      return $this->opt['get_url'] . "&_part=" . $mime_id;
+    else
+      return false;
+  }
+  
+  
+  /**
+   * Get content of a specific part of this message
+   *
+   * @param string Part MIME-ID
+   * @return string Part content
+   */
+  public function get_part_content($mime_id)
+  {
+    if ($part = $this->mime_parts[$mime_id])
+      return $this->imap->get_message_part($this->uid, $mime_id, $part);
+    else
+      return null;
+  }
+  
+  
+  /**
+   * Determine if the message contains a HTML part
+   *
+   * @return bool True if a HTML is available, False if not
+   */
+  function has_html_part()
+  {
+     // check all message parts
+     foreach ($this->parts as $pid => $part) {
+        $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
+        if ($mimetype == 'text/html')
+           return true;
+     }
+
+     return false;
+  }
+
+  /**
+   * Return the first HTML part of this message
+   *
+   * @return string HTML message part content
+   */
+  function first_html_part()
+    {
+    $html_part = null;
+
+    // check all message parts
+    foreach ($this->mime_parts as $mime_id => $part) {
+      $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
+      if ($mimetype == 'text/html') {
+        $html_part = $this->imap->get_message_part($this->uid, $mime_id, $part);
+      }
+    }
+
+    return $html_part;
+  }
+
+
+  /**
+   * Return the first text part of this message
+   *
+   * @return string Plain text message/part content
+   */
+  function first_text_part()
+    {
+    // no message structure, return complete body
+    if (empty($this->parts))
+      return $this->body;
+      
+    $out = null;
+
+    // check all message parts
+    foreach ($this->mime_parts as $mime_id => $part) {
+      $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
+
+      if ($mimetype == 'text/plain') {
+        $out = $this->imap->get_message_part($this->uid, $mime_id, $part);
+        break;
+      }
+      else if ($mimetype == 'text/html') {
+        $html_part = $this->imap->get_message_part($this->uid, $mime_id, $part);
+
+        // remove special chars encoding
+        $trans = array_flip(get_html_translation_table(HTML_ENTITIES));
+        $html_part = strtr($html_part, $trans);
+
+        // create instance of html2text class
+        $txt = new html2text($html_part);
+        $out = $txt->get_text();
+        break;
+      }
+    }
+
+    return $out;
+  }
+
+
+  /**
+   * Raad the message structure returend by the IMAP server
+   * and build flat lists of content parts and attachments
+   *
+   * @param object rcube_message_part Message structure node
+   * @param bool  True when called recursively
+   */
+  private function parse_structure($structure, $recursive = false)
+  {
+    $message_ctype_primary = strtolower($structure->ctype_primary);
+    $message_ctype_secondary = strtolower($structure->ctype_secondary);
+
+    // show message headers
+    if ($recursive && is_array($structure->headers) && isset($structure->headers['subject'])) {
+      $c = new stdClass;
+      $c->type = 'headers';
+      $c->headers = &$structure->headers;
+      $this->parts[] = $c;
+    }
+
+    // print body if message doesn't have multiple parts
+    if ($message_ctype_primary == 'text' && !$recursive) {
+      $structure->type = 'content';
+      $this->parts[] = &$structure;
+    }
+    // message contains alternative parts
+    else if ($message_ctype_primary == 'multipart' && ($message_ctype_secondary == 'alternative') && is_array($structure->parts)) {
+      // get html/plaintext parts
+      $plain_part = $html_part = $print_part = $related_part = null;
+
+      foreach ($structure->parts as $p => $sub_part) {
+        $rel_parts = $attachmnts = null;
+        $sub_ctype_primary = strtolower($sub_part->ctype_primary);
+        $sub_ctype_secondary = strtolower($sub_part->ctype_secondary);
+        
+        // check if sub part is 
+        if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='plain')
+          $plain_part = $p;
+        else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='html')
+          $html_part = $p;
+        else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='enriched')
+          $enriched_part = $p;
+        else if ($sub_ctype_primary=='multipart' && ($sub_ctype_secondary=='related' || $sub_ctype_secondary=='mixed'))
+          $related_part = $p;
+      }
+
+      // parse related part (alternative part could be in here)
+      if ($related_part !== null && !$this->parse_alternative) {
+        $this->parse_alternative = true;
+        $this->parse_structure($structure->parts[$related_part], true);
+        $this->parse_alternative = false;
+        
+        // if plain part was found, we should unset it if html is preferred
+        if ($this->opt['prefer_html'] && count($this->parts))
+          $plain_part = null;
+      }
+
+      // choose html/plain part to print
+      if ($html_part !== null && $this->opt['prefer_html']) {
+        $print_part = &$structure->parts[$html_part];
+      }
+      else if ($enriched_part !== null) {
+        $print_part = &$structure->parts[$enriched_part];
+      }
+      else if ($plain_part !== null) {
+        $print_part = &$structure->parts[$plain_part];
+      }
+
+      // add the right message body
+      if (is_object($print_part)) {
+        $print_part->type = 'content';
+        $this->parts[] = $print_part;
+      }
+      // show plaintext warning
+      else if ($html_part !== nullL && empty($this->parts)) {
+        $c = new stdClass;
+        $c->type = 'content';
+        $c->body = rcube_label('htmlmessage');
+        $c->ctype_primary = 'text';
+        $c->ctype_secondary = 'plain';
+
+        $this->parts[] = $c;
+      }
+
+      // add html part as attachment
+      if ($html_part !== null && $structure->parts[$html_part] !== $print_part) {
+        $html_part = &$structure->parts[$html_part];
+        $html_part->filename = rcube_label('htmlmessage');
+        $html_part->mimetype = 'text/html';
+
+        $this->attachments[] = $html_part;
+      }
+    }
+    // this is an ecrypted message -> create a plaintext body with the according message
+    else if ($message_ctype_primary == 'multipart' && $message_ctype_secondary == 'encrypted') {
+      $p = new stdClass;
+      $p->type = 'content';
+      $p->ctype_primary = 'text';
+      $p->ctype_secondary = 'plain';
+      $p->body = rcube_label('encryptedmessage');
+      
+      $this->parts[] = $p;
+    }
+    // message contains multiple parts
+    else if (is_array($structure->parts) && !empty($structure->parts)) {
+      // iterate over parts
+      for ($i=0; $i < count($structure->parts); $i++) {
+        $mail_part = &$structure->parts[$i];
+        $primary_type = strtolower($mail_part->ctype_primary);
+        $secondary_type = strtolower($mail_part->ctype_secondary);
+
+        // multipart/alternative
+        if ($primary_type=='multipart') {
+          $this->parse_structure($mail_part, true);
+        }
+        // part text/[plain|html] OR message/delivery-status
+        else if (($primary_type == 'text' && ($secondary_type == 'plain' || $secondary_type == 'html') && $mail_part->disposition != 'attachment') ||
+                 ($primary_type == 'message' && ($secondary_type == 'delivery-status' || $secondary_type == 'disposition-notification'))) {
+          
+          // add text part if we're not in alternative mode or if it matches the prefs
+          if (!$this->parse_alternative ||
+              ($secondary_type == 'html' && $this->opt['prefer_html']) ||
+              ($secondary_type == 'plain' && !$this->opt['prefer_html'])) {
+            $mail_part->type = 'content';
+            $this->parts[] = $mail_part;
+          }
+          
+          // list as attachment as well
+          if (!empty($mail_part->filename))
+            $this->attachments[] = $mail_part;
+        }
+        // part message/*
+        else if ($primary_type=='message') {
+          $this->parse_structure($mail_part, true);
+        }
+        // ignore "virtual" protocol parts
+        else if ($primary_type == 'protocol')
+          continue;
+
+        // part is file/attachment
+        else if ($mail_part->disposition == 'attachment' || $mail_part->disposition == 'inline' ||
+                 $mail_part->headers['content-id'] || (empty($mail_part->disposition) && $mail_part->filename)) {
+          // skip apple resource forks
+          if ($message_ctype_secondary == 'appledouble' && $secondary_type == 'applefile')
+            continue;
+
+          // part belongs to a related message
+          if ($message_ctype_secondary == 'related' && $mail_part->headers['content-id']) {
+            $mail_part->content_id = preg_replace(array('/^</', '/>$/'), '', $mail_part->headers['content-id']);
+            $this->inline_parts[] = $mail_part;
+          }
+          // is regular attachment
+          else {
+            if (!$mail_part->filename)
+              $mail_part->filename = 'Part '.$mail_part->mime_id;
+            $this->attachments[] = $mail_part;
+          }
+        }
+      }
+
+      // if this was a related part try to resolve references
+      if ($message_ctype_secondary == 'related' && sizeof($this->inline_parts)) {
+        $a_replaces = array();
+
+        foreach ($this->inline_parts as $inline_object) {
+          $a_replaces['cid:'.$inline_object->content_id] = $this->get_part_url($inline_object->mime_id);
+        }
+
+        // add replace array to each content part
+        // (will be applied later when part body is available)
+        foreach ($this->parts as $i => $part) {
+          if ($part->type == 'content')
+            $this->parts[$i]->replaces = $a_replaces;
+        }
+      }
+    }
+
+    // message is single part non-text
+    else if ($structure->filename) {
+      $this->attachments[] = $structure;
+    }
+  }
+
+
+  /**
+   * Fill aflat array with references to all parts, indexed by part numbers
+   *
+   * @param object rcube_message_part Message body structure
+   */
+  private function get_mime_numbers(&$part)
+  {
+    if (strlen($part->mime_id))
+      $this->mime_parts[$part->mime_id] = &$part;
+      
+    if (is_array($part->parts))
+      for ($i=0; $i<count($part->parts); $i++)
+        $this->get_mime_numbers($part->parts[$i]);
+  }
+
+
+}
+
diff --git a/program/include/rcube_result_set.php b/program/include/rcube_result_set.php
new file mode 100644 (file)
index 0000000..7e968cd
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_result_set.php                                  |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2006-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Class representing an address directory result set                  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_result_set.php 328 2006-08-30 17:41:21Z thomasb $
+
+*/
+
+
+/**
+ * RoundCube result set class.
+ * Representing an address directory result set.
+ *
+ * @package Addressbook
+ */
+class rcube_result_set
+{
+  var $count = 0;
+  var $first = 0;
+  var $current = 0;
+  var $records = array();
+  
+  function __construct($c=0, $f=0)
+  {
+    $this->count = (int)$c;
+    $this->first = (int)$f;
+  }
+  
+  function rcube_result_set($c=0, $f=0)
+  {
+    $this->__construct($c, $f);
+  }
+  
+  function add($rec)
+  {
+    $this->records[] = $rec;
+  }
+  
+  function iterate()
+  {
+    return $this->records[$this->current++];
+  }
+  
+  function first()
+  {
+    $this->current = 0;
+    return $this->records[$this->current++];
+  }
+  
+  // alias
+  function next()
+  {
+    return $this->iterate();
+  }
+  
+  function seek($i)
+  {
+    $this->current = $i;
+  }
+  
+}
\ No newline at end of file
index c889dc9e9f175daf40935944457fbb6454565d81..b79d26027620e97a4c7337dff8f11606cfa2aa9f 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_shared.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: rcube_shared.inc 1490 2008-06-07 18:48:59Z alec $
 
 */
 
@@ -83,121 +83,6 @@ function rcube_browser()
 }
 
 
-/**
- * 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;
-
-  // extract attributes
-  if (is_string($attrib))
-    $attrib = array('name' => $attrib);
-    
-  $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1;
-  $vars = isset($attrib['vars']) ? $attrib['vars'] : '';
-
-  $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL;
-  $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : '');
-
-
-  // load localized texts
-  if (!$sa_text_data || $s_language != $sess_user_lang)
-    {
-    $sa_text_data = array();
-    
-    // get english labels (these should be complete)
-    @include($INSTALL_PATH.'program/localization/en_US/labels.inc');
-    @include($INSTALL_PATH.'program/localization/en_US/messages.inc');
-
-    if (is_array($labels))
-      $sa_text_data = $labels;
-    if (is_array($messages))
-      $sa_text_data = array_merge($sa_text_data, $messages);
-    
-    // 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');
-
-      if (is_array($labels))
-        $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);
-    */
-    return "[$alias]";
-  }
-
-  // make text item array 
-  $a_text_item = is_array($text_item) ? $text_item : array('single' => $text_item);
-
-  // decide which text to use
-  if ($nr==1)
-    $text = $a_text_item['single'];
-  else if ($nr>0)
-    $text = $a_text_item['multiple'];
-  else if ($nr==0)
-  {
-    if ($a_text_item['none'])
-      $text = $a_text_item['none'];
-    else if ($a_text_item['single'])
-      $text = $a_text_item['single'];
-    else if ($a_text_item['multiple'])
-      $text = $a_text_item['multiple'];
-  }
-
-  // default text is single
-  if ($text=='')
-    $text = $a_text_item['single'];
-
-  // replace vars in text
-  if (is_array($attrib['vars']))
-  {
-    foreach ($attrib['vars'] as $var_key=>$var_value)
-      $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);
-
-  // remove variables in text which were not available in arg $vars and $nr
-  eval("\$text = <<<EOF
-$text
-EOF;
-");
-
-  // format output
-  if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst'])
-    return ucfirst($text);
-  else if ($attrib['uppercase'])
-    return strtoupper($text);
-  else if ($attrib['lowercase'])
-    return strtolower($text);
-
-  return $text;
-}
-
-
 /**
  * Send HTTP headers to prevent caching this page
  */
@@ -236,18 +121,22 @@ function send_future_expire_header($offset=2600000)
  * @param int Modified date as unix timestamp
  * @param string Etag value for caching
  */
-function send_modified_header($mdate, $etag=null)
+function send_modified_header($mdate, $etag=null, $skip_check=false)
 {
   if (headers_sent())
     return;
     
   $iscached = false;
-  if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mdate)
-    $iscached = true;
-  
   $etag = $etag ? "\"$etag\"" : null;
-  if ($etag)
-    $iscached = ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag);
+
+  if (!$skip_check)
+  {
+    if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mdate)
+      $iscached = true;
+  
+    if ($etag)
+      $iscached = ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag);
+  }
   
   if ($iscached)
     header("HTTP/1.x 304 Not Modified");
@@ -654,29 +543,6 @@ function get_offset_time($offset_str, $factor=1)
 }
 
 
-/**
- * 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
-  {
-    $index = strpos(strrev($haystack), strrev($needle));
-    if($index === false)
-        return false;
-    
-    $index = strlen($haystack) - strlen($needle) - $index;
-    return $index;
-  }
-}
-
 /**
  * A method to guess the mime_type of an attachment.
  *
@@ -715,4 +581,33 @@ function rc_mime_content_type($path, $failover = 'unknown/unknown')
     return $mime_type;
 }
 
-?>
\ No newline at end of file
+
+/**
+ * A method to guess encoding of a string.
+ *
+ * @param string $string       String.
+ * @param string $failover     Default result for failover.
+ *
+ * @return string
+ */
+function rc_detect_encoding($string, $failover='')
+{
+    if (!function_exists('mb_detect_encoding')) {
+        return $failover;
+    }
+
+    // FIXME: the order is important, because sometimes 
+    // iso string is detected as euc-jp and etc.
+    $enc = array(
+       'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4',
+       'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9',
+       'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
+       'WINDOWS-1252', 'WINDOWS-1251', 'EUC-JP', 'EUC-TW', 'KOI8-R'
+    );
+
+    $result = mb_detect_encoding($string, join(',', $enc));
+
+    return $result ? $result : $failover;
+}
+
+?>
index bbc886923e54c6a7edab4505b7ca8872def2318e..6049418f3ee6e5d5c1cf3a6894a8754b324aafd4 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_smtp.inc 1136 2008-02-25 10:17:35Z till $
+ $Id: rcube_smtp.inc 1360 2008-05-07 09:38:44Z thomasb $
 
 */
 
@@ -55,7 +55,7 @@ $SMTP_CONN = null;
  */
 function smtp_mail($from, $recipients, &$headers, &$body, &$response)
   {
-  global $SMTP_CONN, $CONFIG;
+  global $SMTP_CONN, $CONFIG, $RCMAIL;
   $smtp_timeout = null;
   $smtp_host = $CONFIG['smtp_server'];
   $smtp_port = is_numeric($CONFIG['smtp_port']) ? $CONFIG['smtp_port'] : 25;
@@ -102,7 +102,7 @@ function smtp_mail($from, $recipients, &$headers, &$body, &$response)
         $smtp_user = $CONFIG['smtp_user'];
 
       if (strstr($CONFIG['smtp_pass'], '%p'))
-        $smtp_pass = str_replace('%p', decrypt_passwd($_SESSION['password']), $CONFIG['smtp_pass']);
+        $smtp_pass = str_replace('%p', $RCMAIL->decrypt_passwd($_SESSION['password']), $CONFIG['smtp_pass']);
       else
         $smtp_pass = $CONFIG['smtp_pass'];
 
diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
new file mode 100755 (executable)
index 0000000..2173784
--- /dev/null
@@ -0,0 +1,1016 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_template.php                                    |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2006-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Class to handle HTML page output using a skin template.             |
+ |   Extends rcube_html_page class from rcube_shared.inc                 |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id$
+
+ */
+
+
+/**
+ * Class to create HTML page output using a skin template
+ *
+ * @package View
+ * @todo Documentation
+ * @uses rcube_html_page
+ */
+class rcube_template extends rcube_html_page
+{
+    var $app;
+    var $config;
+    var $task = '';
+    var $framed = false;
+    var $pagetitle = '';
+    var $env = array();
+    var $js_env = array();
+    var $js_commands = array();
+    var $object_handlers = array();
+
+    public $ajax_call = false;
+
+    /**
+     * Constructor
+     *
+     * @todo   Use jQuery's $(document).ready() here.
+     * @todo   Replace $this->config with the real rcube_config object
+     */
+    public function __construct($task, $framed = false)
+    {
+        parent::__construct();
+
+        $this->app = rcmail::get_instance();
+        $this->config = $this->app->config->all();
+        
+        //$this->framed = $framed;
+        $this->task = $task;
+
+        // add common javascripts
+        $javascript = 'var '.JS_OBJECT_NAME.' = new rcube_webmail();';
+
+        // don't wait for page onload. Call init at the bottom of the page (delayed)
+        $javascript_foot = "if (window.call_init)\n call_init('".JS_OBJECT_NAME."');";
+
+        $this->add_script($javascript, 'head_top');
+        $this->add_script($javascript_foot, 'foot');
+        $this->scripts_path = 'program/js/';
+        $this->include_script('common.js');
+        $this->include_script('app.js');
+
+        // register common UI objects
+        $this->add_handlers(array(
+            'loginform'       => array($this, 'login_form'),
+            'username'        => array($this, 'current_username'),
+            'message'         => array($this, 'message_container'),
+            'charsetselector' => array($this, 'charset_selector'),
+        ));
+    }
+
+    /**
+     * Set environment variable
+     *
+     * @param string Property name
+     * @param mixed Property value
+     * @param boolean True if this property should be added to client environment
+     */
+    public function set_env($name, $value, $addtojs = true)
+    {
+        $this->env[$name] = $value;
+        if ($addtojs || isset($this->js_env[$name])) {
+            $this->js_env[$name] = $value;
+        }
+    }
+
+
+    /**
+     * Set page title variable
+     */
+    public function set_pagetitle($title)
+    {
+        $this->pagetitle = $title;
+    }
+
+
+    /**
+     * Register a template object handler
+     *
+     * @param  string Object name
+     * @param  string Function name to call
+     * @return void
+     */
+    public function add_handler($obj, $func)
+    {
+        $this->object_handlers[$obj] = $func;
+    }
+
+    /**
+     * Register a list of template object handlers
+     *
+     * @param  array Hash array with object=>handler pairs
+     * @return void
+     */
+    public function add_handlers($arr)
+    {
+        $this->object_handlers = array_merge($this->object_handlers, $arr);
+    }
+
+    /**
+     * Register a GUI object to the client script
+     *
+     * @param  string Object name
+     * @param  string Object ID
+     * @return void
+     */
+    public function add_gui_object($obj, $id)
+    {
+        $this->add_script(JS_OBJECT_NAME.".gui_object('$obj', '$id');");
+    }
+
+    /**
+     * Call a client method
+     *
+     * @param string Method to call
+     * @param ... Additional arguments
+     */
+    public function command()
+    {
+        $this->js_commands[] = func_get_args();
+    }
+
+
+    /**
+     * Add a localized label to the client environment
+     */
+    public function add_label()
+    {
+        $arg_list = func_get_args();
+        foreach ($arg_list as $i => $name) {
+            $this->command('add_label', $name, rcube_label($name));
+        }
+    }
+
+
+    /**
+     * Invoke display_message command
+     *
+     * @param string Message to display
+     * @param string Message type [notice|confirm|error]
+     * @param array Key-value pairs to be replaced in localized text
+     * @uses self::command()
+     */
+    public function show_message($message, $type='notice', $vars=NULL)
+    {
+        $this->command(
+            'display_message',
+            rcube_label(array('name' => $message, 'vars' => $vars)),
+            $type);
+    }
+
+
+    /**
+     * Delete all stored env variables and commands
+     *
+     * @return void
+     * @uses   rcube_html::reset()
+     * @uses   self::$env
+     * @uses   self::$js_env
+     * @uses   self::$js_commands
+     * @uses   self::$object_handlers
+     */
+    public public function reset()
+    {
+        $this->env = array();
+        $this->js_env = array();
+        $this->js_commands = array();
+        $this->object_handlers = array();
+        parent::reset();
+    }
+
+
+    /**
+     * Send the request output to the client.
+     * This will either parse a skin tempalte or send an AJAX response
+     *
+     * @param string  Template name
+     * @param boolean True if script should terminate (default)
+     */
+    public function send($templ = null, $exit = true)
+    {
+        if ($templ != 'iframe') {
+            $this->parse($templ, false);
+        }
+        else {
+            $this->framed = $templ == 'iframe' ? true : $this->framed;
+            $this->write();
+        }
+
+        if ($exit) {
+            exit;
+        }
+    }
+
+    /**
+     * Process template and write to stdOut
+     *
+     * @param string HTML template
+     * @see rcube_html_page::write()
+     * @override
+     */
+    public 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 ? ' }' : '');
+        $this->add_script($js, 'head_top');
+
+        // call super method
+        parent::write($template, $this->config['skin_path']);
+    }
+
+    /**
+     * Parse a specific skin template and deliver to stdout
+     *
+     * Either returns nothing, or exists hard (exit();)
+     *
+     * @param  string  Template name
+     * @param  boolean Exit script
+     * @return void
+     * @link   http://php.net/manual/en/function.exit.php
+     */
+    private function parse($name = 'main', $exit = true)
+    {
+        $skin_path = $this->config['skin_path'];
+
+        // read template file
+        $templ = '';
+        $path = "$skin_path/templates/$name.html";
+
+        if (($fp = fopen($path, 'r')) === false) {
+            $message = '';
+            ob_start();
+            fopen($path, 'r');
+            $message.= ob_get_contents();
+            ob_end_clean();
+            raise_error(array(
+                'code' => 501,
+                'type' => 'php',
+                'line' => __LINE__,
+                'file' => __FILE__,
+                'message' => 'Error loading template for '.$name.': '.$message
+                ), true, true);
+            return false;
+        }
+        $templ = fread($fp, filesize($path));
+        fclose($fp);
+
+        // parse for specialtags
+        $output = $this->parse_conditions($templ);
+        $output = $this->parse_xml($output);
+
+        // add debug console
+        if ($this->config['debug_level'] & 8) {
+            $this->add_footer('<div style="position:absolute;top:5px;left:5px;width:400px;padding:0.2em;background:white;opacity:0.8;z-index:9000">
+                <a href="#toggle" onclick="con=document.getElementById(\'dbgconsole\');con.style.display=(con.style.display==\'none\'?\'block\':\'none\');return false">console</a>
+                <form action="/" name="debugform"><textarea name="console" id="dbgconsole" rows="20" cols="40" wrap="off" style="display:none;width:400px;border:none;font-size:x-small"></textarea></form></div>'
+            );
+        }
+        $output = $this->parse_with_globals($output);
+        $this->write(trim($output), $skin_path);
+        if ($exit) {
+            exit;
+        }
+    }
+
+
+    /**
+     * Return executable javascript code for all registered commands
+     *
+     * @return string $out
+     */
+    private function get_js_commands()
+    {
+        $out = '';
+        if (!$this->framed && !empty($this->js_env)) {
+            $out .= JS_OBJECT_NAME . '.set_env('.json_serialize($this->js_env).");\n";
+        }
+        foreach ($this->js_commands as $i => $args) {
+            $method = array_shift($args);
+            foreach ($args as $i => $arg) {
+                $args[$i] = json_serialize($arg);
+            }
+            $parent = $this->framed || preg_match('/^parent\./', $method);
+            $out .= sprintf(
+                "%s.%s(%s);\n",
+            ($parent ? 'parent.' : '') . JS_OBJECT_NAME,
+            preg_replace('/^parent\./', '', $method),
+            implode(',', $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
+     *
+     * @param  string Input string
+     * @return string
+     */
+    public function abs_url($str)
+    {
+        return preg_replace('/^\//', $this->config['skin_path'].'/', $str);
+    }
+
+
+    /*****  Template parsing methods  *****/
+
+    /**
+     * Replace all strings ($varname)
+     * with the content of the according global variable.
+     */
+    private function parse_with_globals($input)
+    {
+        $GLOBALS['__comm_path'] = Q($this->app->comm_path);
+        return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
+    }
+
+    /**
+     * Public wrapper to dipp into template parsing.
+     *
+     * @param  string $input
+     * @return string
+     * @uses   rcube_template::parse_xml()
+     * @since  0.1-rc1
+     */
+    public function just_parse($input)
+    {
+        return $this->parse_xml($input);
+    }
+
+    /**
+     * Parse for conditional tags
+     *
+     * @param  string $input
+     * @return string
+     */
+    private function parse_conditions($input)
+    {
+        $matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE);
+        if ($matches && count($matches) == 4) {
+            if (preg_match('/^(else|endif)$/i', $matches[1])) {
+                return $matches[0] . $this->parse_conditions($matches[3]);
+            }
+            $attrib = parse_attrib_string($matches[2]);
+            if (isset($attrib['condition'])) {
+                $condmet = $this->check_condition($attrib['condition']);
+                $submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE);
+                if ($condmet) {
+                    $result = $submatches[0];
+                    $result.= ($submatches[1] != 'endif' ? preg_replace('/.*<roundcube:endif\s+[^>]+>/Uis', '', $submatches[3], 1) : $submatches[3]);
+                }
+                else {
+                    $result = "<roundcube:$submatches[1] $submatches[2]>" . $submatches[3];
+                }
+                return $matches[0] . $this->parse_conditions($result);
+            }
+            raise_error(array(
+                'code' => 500,
+                'type' => 'php',
+                'line' => __LINE__,
+                'file' => __FILE__,
+                'message' => "Unable to parse conditional tag " . $matches[2]
+            ), true, false);
+        }
+        return $input;
+    }
+
+
+    /**
+     * Determines if a given condition is met
+     *
+     * @todo   Get rid off eval() once I understand what this does.
+     * @todo   Extend this to allow real conditions, not just "set"
+     * @param  string Condition statement
+     * @return boolean True if condition is met, False is not
+     */
+    private function check_condition($condition)
+    {
+        $condition = preg_replace(
+            array(
+                '/session:([a-z0-9_]+)/i',
+                '/config:([a-z0-9_]+)/i',
+                '/env:([a-z0-9_]+)/i',
+                '/request:([a-z0-9_]+)/ie'
+            ),
+            array(
+                "\$_SESSION['\\1']",
+                "\$this->config['\\1']",
+                "\$this->env['\\1']",
+                "get_input_value('\\1', RCUVE_INPUT_GPC)"
+            ),
+            $condition);
+            
+            return eval("return (".$condition.");");
+    }
+
+
+    /**
+     * Search for special tags in input and replace them
+     * with the appropriate content
+     *
+     * @param  string Input string to parse
+     * @return string Altered input string
+     * @todo   Maybe a cache.
+     */
+    private function parse_xml($input)
+    {
+        return preg_replace('/<roundcube:([-_a-z]+)\s+([^>]+)>/Uie', "\$this->xml_command('\\1', '\\2')", $input);
+    }
+
+
+    /**
+     * Convert a xml command tag into real content
+     *
+     * @param  string Tag command: object,button,label, etc.
+     * @param  string Attribute string
+     * @return string Tag/Object content
+     */
+    private function xml_command($command, $str_attrib, $add_attrib = array())
+    {
+        $command = strtolower($command);
+        $attrib  = parse_attrib_string($str_attrib) + $add_attrib;
+
+        // empty output if required condition is not met
+        if (!empty($attrib['condition']) && !$this->check_condition($attrib['condition'])) {
+            return '';
+        }
+
+        // execute command
+        switch ($command) {
+            // return a button
+            case 'button':
+                if ($attrib['name'] || $attrib['command']) {
+                    return $this->button($attrib);
+                }
+                break;
+
+            // show a label
+            case 'label':
+                if ($attrib['name'] || $attrib['command']) {
+                    return Q(rcube_label($attrib + array('vars' => array('product' => $this->config['product_name']))));
+                }
+                break;
+
+            // include a file
+            case 'include':
+                $path = realpath($this->config['skin_path'].$attrib['file']);
+                if ($fsize = filesize($path)) {
+                    if ($this->config['skin_include_php']) {
+                        $incl = $this->include_php($path);
+                    }
+                    else if ($fp = fopen($path, 'r')) {
+                        $incl = fread($fp, $fsize);
+                        fclose($fp);
+                    }
+                    return $this->parse_xml($incl);
+                }
+                break;
+
+            case 'plugin.include':
+                //rcube::tfk_debug(var_export($this->config['skin_path'], true));
+                $path = realpath($this->config['skin_path'].$attrib['file']);
+                if (!$path) {
+                    //rcube::tfk_debug("Does not exist:");
+                    //rcube::tfk_debug($this->config['skin_path']);
+                    //rcube::tfk_debug($attrib['file']);
+                    //rcube::tfk_debug($path);
+                }
+                $incl = file_get_contents($path);
+                if ($incl) {
+                    return $this->parse_xml($incl);
+                }
+                break;
+
+            // return code for a specific application object
+            case 'object':
+                $object = strtolower($attrib['name']);
+
+                // we are calling a class/method
+                if (($handler = $this->object_handlers[$object]) && is_array($handler)) {
+                    if ((is_object($handler[0]) && method_exists($handler[0], $handler[1])) ||
+                    (is_string($handler[0]) && class_exists($handler[0])))
+                    return call_user_func($handler, $attrib);
+                }
+                else if (function_exists($handler)) {
+                    // execute object handler function
+                    return call_user_func($handler, $attrib);
+                }
+
+                if ($object=='productname') {
+                    $name = !empty($this->config['product_name']) ? $this->config['product_name'] : 'RoundCube Webmail';
+                    return Q($name);
+                }
+                if ($object=='version') {
+                    $ver = (string)RCMAIL_VERSION;
+                    if (is_file(INSTALL_PATH . '.svn/entries')) {
+                        if (preg_match('/Revision:\s(\d+)/', @shell_exec('svn info'), $regs))
+                          $ver .= ' [SVN r'.$regs[1].']';
+                    }
+                    return $ver;
+                }
+                if ($object=='pagetitle') {
+                    $task  = $this->task;
+                    $title = !empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '';
+
+                    if (!empty($this->pagetitle)) {
+                        $title .= $this->pagetitle;
+                    }
+                    else if ($task == 'login') {
+                        $title = rcube_label(array('name' => 'welcome', 'vars' => array('product' => $this->config['product_name'])));
+                    }
+                    else {
+                        $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 = implode(', ', $value);
+                }
+
+                return Q($value);
+                break;
+        }
+        return '';
+    }
+
+    /**
+     * Include a specific file and return it's contents
+     *
+     * @param string File path
+     * @return string Contents of the processed file
+     */
+    private function include_php($file)
+    {
+        ob_start();
+        include $file;
+        $out = ob_get_contents();
+        ob_end_clean();
+
+        return $out;
+    }
+
+    /**
+     * Create and register a button
+     *
+     * @param  array Named button attributes
+     * @return string HTML button
+     * @todo   Remove all inline JS calls and use jQuery instead.
+     * @todo   Remove all sprintf()'s - they are pretty, but also slow.
+     */
+    private function button($attrib)
+    {
+        static $sa_buttons = array();
+        static $s_button_count = 100;
+
+        // these commands can be called directly via url
+        $a_static_commands = array('compose', 'list');
+
+        if (!($attrib['command'] || $attrib['name'])) {
+            return '';
+        }
+
+        $browser   = new rcube_browser();
+
+        // try to find out the button type
+        if ($attrib['type']) {
+            $attrib['type'] = strtolower($attrib['type']);
+        }
+        else {
+            $attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $attrib['imageact']) ? 'image' : 'link';
+        }
+        $command = $attrib['command'];
+
+        // take the button from the stack
+        if ($attrib['name'] && $sa_buttons[$attrib['name']]) {
+            $attrib = $sa_buttons[$attrib['name']];
+        }
+        else if($attrib['image'] || $attrib['imageact'] || $attrib['imagepas'] || $attrib['class']) {
+            // add button to button stack
+            if (!$attrib['name']) {
+                $attrib['name'] = $command;
+            }
+            if (!$attrib['image']) {
+                $attrib['image'] = $attrib['imagepas'] ? $attrib['imagepas'] : $attrib['imageact'];
+            }
+            $sa_buttons[$attrib['name']] = $attrib;
+        }
+        else if ($command && $sa_buttons[$command]) {
+            // get saved button for this command/name
+            $attrib = $sa_buttons[$command];
+        }
+
+        // set border to 0 because of the link arround the button
+        if ($attrib['type']=='image' && !isset($attrib['border'])) {
+            $attrib['border'] = 0;
+        }
+        if (!$attrib['id']) {
+            $attrib['id'] =  sprintf('rcmbtn%d', $s_button_count++);
+        }
+        // get localized text for labels and titles
+        if ($attrib['title']) {
+            $attrib['title'] = Q(rcube_label($attrib['title']));
+        }
+        if ($attrib['label']) {
+            $attrib['label'] = Q(rcube_label($attrib['label']));
+        }
+        if ($attrib['alt']) {
+            $attrib['alt'] = Q(rcube_label($attrib['alt']));
+        }
+        // set title to alt attribute for IE browsers
+        if ($browser->ie && $attrib['title'] && !$attrib['alt']) {
+            $attrib['alt'] = $attrib['title'];
+            unset($attrib['title']);
+        }
+
+        // add empty alt attribute for XHTML compatibility
+        if (!isset($attrib['alt'])) {
+            $attrib['alt'] = '';
+        }
+
+        // register button in the system
+        if ($attrib['command']) {
+            $this->add_script(sprintf(
+                "%s.register_button('%s', '%s', '%s', '%s', '%s', '%s');",
+                JS_OBJECT_NAME,
+                $command,
+                $attrib['id'],
+                $attrib['type'],
+                $attrib['imageact'] ? $this->abs_url($attrib['imageact']) : $attrib['classact'],
+                $attrib['imagesel'] ? $this->abs_url($attrib['imagesel']) : $attrib['classsel'],
+                $attrib['imageover'] ? $this->abs_url($attrib['imageover']) : ''
+            ));
+
+            // make valid href to specific buttons
+            if (in_array($attrib['command'], rcmail::$main_tasks)) {
+                $attrib['href'] = Q(rcmail_url(null, null, $attrib['command']));
+            }
+            else if (in_array($attrib['command'], $a_static_commands)) {
+                $attrib['href'] = Q(rcmail_url($attrib['command']));
+            }
+        }
+
+        // overwrite attributes
+        if (!$attrib['href']) {
+            $attrib['href'] = '#';
+        }
+        if ($command) {
+            $attrib['onclick'] = sprintf(
+                "return %s.command('%s','%s',this)",
+                JS_OBJECT_NAME,
+                $command,
+                $attrib['prop']
+            );
+        }
+        if ($command && $attrib['imageover']) {
+            $attrib['onmouseover'] = sprintf(
+                "return %s.button_over('%s','%s')",
+                JS_OBJECT_NAME,
+                $command,
+                $attrib['id']
+            );
+            $attrib['onmouseout'] = sprintf(
+                "return %s.button_out('%s','%s')",
+                JS_OBJECT_NAME,
+                $command,
+                $attrib['id']
+            );
+        }
+
+        if ($command && $attrib['imagesel']) {
+            $attrib['onmousedown'] = sprintf(
+                "return %s.button_sel('%s','%s')",
+                JS_OBJECT_NAME,
+                $command,
+                $attrib['id']
+            );
+            $attrib['onmouseup'] = sprintf(
+                "return %s.button_out('%s','%s')",
+                JS_OBJECT_NAME,
+                $command,
+                $attrib['id']
+            );
+        }
+
+        $out = '';
+
+        // generate image tag
+        if ($attrib['type']=='image') {
+            $attrib_str = html::attrib_string(
+                $attrib,
+                array(
+                    'style', 'class', 'id', 'width',
+                    'height', 'border', 'hspace',
+                    'vspace', 'align', 'alt',
+                )
+            );
+            $btn_content = sprintf('<img src="%s"%s />', $this->abs_url($attrib['image']), $attrib_str);
+            if ($attrib['label']) {
+                $btn_content .= ' '.$attrib['label'];
+            }
+            $link_attrib = array('href', 'onclick', 'onmouseover', 'onmouseout', 'onmousedown', 'onmouseup', 'title');
+        }
+        else if ($attrib['type']=='link') {
+            $btn_content = $attrib['label'] ? $attrib['label'] : $attrib['command'];
+            $link_attrib = array('href', 'onclick', 'title', 'id', 'class', 'style');
+        }
+        else if ($attrib['type']=='input') {
+            $attrib['type'] = 'button';
+
+            if ($attrib['label']) {
+                $attrib['value'] = $attrib['label'];
+            }
+
+            $attrib_str = html::attrib_string(
+                $attrib,
+                array(
+                    'type', 'value', 'onclick',
+                    'id', 'class', 'style'
+                )
+            );
+            $out = sprintf('<input%s disabled="disabled" />', $attrib_str);
+        }
+
+        // generate html code for button
+        if ($btn_content) {
+            $attrib_str = html::attrib_string($attrib, $link_attrib);
+            $out = sprintf('<a%s>%s</a>', $attrib_str, $btn_content);
+        }
+
+        return $out;
+    }
+
+
+    /*  ************* common functions delivering gui objects **************  */
+
+
+    /**
+     * Create a form tag with the necessary hidden fields
+     *
+     * @param array Named tag parameters
+     * @return string HTML code for the form
+     */
+    public function form_tag($attrib, $content = null)
+    {
+      if ($this->framed) {
+        $hiddenfield = new html_hiddenfield(array('name' => '_framed', 'value' => '1'));
+        $hidden = $hiddenfield->show();
+      }
+      
+      if (!$content)
+        $attrib['noclose'] = true;
+      
+      return html::tag('form',
+        $attrib + array('action' => "./", 'method' => "get"),
+        $hidden . $content);
+    }
+
+
+    /**
+     * 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
+     */
+    public function current_username($attrib)
+    {
+        static $username;
+
+        // alread fetched
+        if (!empty($username)) {
+            return $username;
+        }
+
+        // get e-mail address form default identity
+        if ($sql_arr = $this->app->user->get_identity()) {
+            $username = $sql_arr['email'];
+        }
+        else {
+            $username = $this->app->user->get_username();
+        }
+
+        return $username;
+    }
+
+
+    /**
+     * GUI object 'loginform'
+     * Returns code for the webmail login form
+     *
+     * @param array Named parameters
+     * @return string HTML code for the gui object
+     */
+    private function login_form($attrib)
+    {
+        $default_host = $this->config['default_host'];
+
+        $_SESSION['temp'] = true;
+
+        $input_user   = new html_inputfield(array('name' => '_user', 'id' => 'rcmloginuser', 'size' => 30, 'autocomplete' => 'off'));
+        $input_pass   = new html_passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd', 'size' => 30));
+        $input_action = new html_hiddenfield(array('name' => '_action', 'value' => 'login'));
+        $input_host   = null;
+
+        if (is_array($default_host)) {
+            $input_host = new html_select(array('name' => '_host', 'id' => 'rcmloginhost'));
+
+            foreach ($default_host as $key => $value) {
+                if (!is_array($value)) {
+                    $input_host->add($value, (is_numeric($key) ? $value : $key));
+                }
+                else {
+                    $input_host = null;
+                    break;
+                }
+            }
+        }
+        else if (!strlen($default_host)) {
+            $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
+        }
+
+        $form_name  = !empty($attrib['form']) ? $attrib['form'] : 'form';
+        $this->add_gui_object('loginform', $form_name);
+
+        // create HTML table with two cols
+        $table = new html_table(array('cols' => 2));
+
+        $table->add('title', html::label('rcmloginuser', Q(rcube_label('username'))));
+        $table->add(null, $input_user->show(get_input_value('_user', RCUVE_INPUT_POST)));
+
+        $table->add('title', html::label('rcmloginpwd', Q(rcube_label('password'))));
+        $table->add(null, $input_pass->show());
+
+        // add host selection row
+        if (is_object($input_host)) {
+            $table->add('title', html::label('rcmloginhost', Q(rcube_label('server'))));
+            $table->add(null, $input_host->show(get_input_value('_host', RCUVE_INPUT_POST)));
+        }
+
+        $out = $input_action->show();
+        $out .= $table->show();
+
+        // surround html output with a form tag
+        if (empty($attrib['form'])) {
+            $out = $this->form_tag(array('name' => $form_name, 'method' => "post"), $out);
+        }
+
+        return $out;
+    }
+
+
+    /**
+     * GUI object 'searchform'
+     * Returns code for search function
+     *
+     * @param array Named parameters
+     * @return string HTML code for the gui object
+     */
+    private function search_form($attrib)
+    {
+        // add some labels to client
+        $this->add_label('searching');
+
+        $attrib['name'] = '_q';
+
+        if (empty($attrib['id'])) {
+            $attrib['id'] = 'rcmqsearchbox';
+        }
+        $input_q = new html_inputfield($attrib);
+        $out = $input_q->show();
+
+        $this->add_gui_object('qsearchbox', $attrib['id']);
+
+        // add form tag around text field
+        if (empty($attrib['form'])) {
+            $out = $this->form_tag(array(
+                'name' => "rcmqsearchform",
+                'onsubmit' => JS_OBJECT_NAME . ".command('search');return false;",
+                'style' => "display:inline"),
+              $out);
+        }
+
+        return $out;
+    }
+
+
+    /**
+     * Builder for GUI object 'message'
+     *
+     * @param array Named tag parameters
+     * @return string HTML code for the gui object
+     */
+    private function message_container($attrib)
+    {
+        if (isset($attrib['id']) === false) {
+            $attrib['id'] = 'rcmMessageContainer';
+        }
+
+        $this->add_gui_object('message', $attrib['id']);
+        return html::div($attrib, "");
+    }
+
+
+    /**
+     * GUI object 'charsetselector'
+     *
+     * @param array Named parameters for the select tag
+     * @return string HTML code for the gui object
+     */
+    static function charset_selector($attrib)
+    {
+        // pass the following attributes to the form class
+        $field_attrib = array('name' => '_charset');
+        foreach ($attrib as $attr => $value) {
+            if (in_array($attr, array('id', 'class', 'style', 'size', 'tabindex'))) {
+                $field_attrib[$attr] = $value;
+            }
+        }
+        $charsets = array(
+            'US-ASCII'     => 'ASCII (English)',
+            'EUC-JP'       => 'EUC-JP (Japanese)',
+            'EUC-KR'       => 'EUC-KR (Korean)',
+            'BIG5'         => 'BIG5 (Chinese)',
+            'GB2312'       => 'GB2312 (Chinese)',
+            'ISO-2022-JP'  => 'ISO-2022-JP (Japanese)',
+            'ISO-8859-1'   => 'ISO-8859-1 (Latin-1)',
+            'ISO-8859-2'   => 'ISO-8895-2 (Central European)',
+            'ISO-8859-7'   => 'ISO-8859-7 (Greek)',
+            'ISO-8859-9'   => 'ISO-8859-9 (Turkish)',
+            'Windows-1251' => 'Windows-1251 (Cyrillic)',
+            'Windows-1252' => 'Windows-1252 (Western)',
+            'Windows-1255' => 'Windows-1255 (Hebrew)',
+            'Windows-1256' => 'Windows-1256 (Arabic)',
+            'Windows-1257' => 'Windows-1257 (Baltic)',
+            'UTF-8'        => 'UTF-8'
+            );
+
+            $select = new html_select($field_attrib);
+            $select->add(array_values($charsets), array_keys($charsets));
+
+            $set = $_POST['_charset'] ? $_POST['_charset'] : $this->get_charset();
+            return $select->show($set);
+    }
+
+}  // end class rcube_template
+
+
diff --git a/program/include/rcube_user.inc b/program/include/rcube_user.inc
deleted file mode 100644 (file)
index e748758..0000000
+++ /dev/null
@@ -1,482 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_user.inc                                        |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   This class represents a system user linked and provides access      |
- |   to the related database records.                                    |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: rcube_user.inc 933 2007-11-29 14:17:32Z thomasb $
-
-*/
-
-
-/**
- * Class representing a system user
- *
- * @package    core
- * @author     Thomas Bruederli <roundcube@gmail.com>
- */
-class rcube_user
-{
-  var $ID = null;
-  var $data = null;
-  
-  
-  /**
-   * Object constructor
-   *
-   * @param object DB Database connection
-   */
-  function __construct($id = null, $sql_arr = null)
-  {
-    global $DB;
-    
-    if ($id && !$sql_arr)
-    {
-      $sql_result = $DB->query("SELECT * FROM ".get_table_name('users')." WHERE  user_id=?", $id);
-      $sql_arr = $DB->fetch_assoc($sql_result);
-    }
-    
-    if (!empty($sql_arr))
-    {
-      $this->ID = $sql_arr['user_id'];
-      $this->data = $sql_arr;
-    }
-  }
-
-  /**
-   * PHP 4 object constructor
-   *
-   * @see  rcube_user::__construct
-   */
-  function rcube_user($id = null, $sql_arr = null)
-  {
-    $this->__construct($id, $sql_arr);
-  }
-  
-  
-  /**
-   * Build a user name string (as e-mail address)
-   *
-   * @return string Full user name
-   */
-  function get_username()
-  {
-    return $this->data['username'] ? $this->data['username'] . (!strpos($this->data['username'], '@') ? '@'.$this->data['mail_host'] : '') : false;
-  }
-  
-  
-  /**
-   * Get the preferences saved for this user
-   *
-   * @return array Hash array with prefs
-   */
-  function get_prefs()
-  {
-    if ($this->ID && $this->data['preferences'])
-      return unserialize($this->data['preferences']);
-    else
-      return array();
-  }
-  
-  
-  /**
-   * 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 save_prefs($a_user_prefs)
-  {
-    global $DB, $CONFIG, $sess_user_lang;
-    
-    if (!$this->ID)
-      return false;
-
-    // merge (partial) prefs array with existing settings
-    $a_user_prefs += (array)$this->get_prefs();
-
-    $DB->query(
-      "UPDATE ".get_table_name('users')."
-       SET    preferences=?,
-              language=?
-       WHERE  user_id=?",
-      serialize($a_user_prefs),
-      $sess_user_lang,
-      $this->ID);
-
-    if ($DB->affected_rows())
-    {
-      $CONFIG = array_merge($CONFIG, $a_user_prefs);
-      return true;
-    }
-
-    return false;
-  }
-  
-  
-  /**
-   * Get default identity of this user
-   *
-   * @param int  Identity ID. If empty, the default identity is returned
-   * @return array Hash array with all cols of the 
-   */
-  function get_identity($id = null)
-  {
-    global $DB;
-    
-    $sql_result = $this->list_identities($id ? sprintf('AND identity_id=%d', $id) : '');
-    return $DB->fetch_assoc($sql_result);
-  }
-  
-  
-  /**
-   * Return a list of all identities linked with this user
-   *
-   * @return array List of identities
-   */
-  function list_identities($sql_add = '')
-  {
-    global $DB;
-    
-    // get contacts from DB
-    $sql_result = $DB->query(
-      "SELECT * FROM ".get_table_name('identities')."
-       WHERE  del<>1
-       AND    user_id=?
-       $sql_add
-       ORDER BY ".$DB->quoteIdentifier('standard')." DESC, name ASC",
-      $this->ID);
-    
-    return $sql_result;
-  }
-  
-  
-  /**
-   * Update a specific identity record
-   *
-   * @param int    Identity ID
-   * @param array  Hash array with col->value pairs to save
-   * @return boolean True if saved successfully, false if nothing changed
-   */
-  function update_identity($iid, $data)
-  {
-    global $DB;
-    
-    if (!$this->ID)
-      return false;
-    
-    $write_sql = array();
-    
-    foreach ((array)$data as $col => $value)
-    {
-      $write_sql[] = sprintf("%s=%s",
-        $DB->quoteIdentifier($col),
-        $DB->quote($value));
-    }
-    
-    $DB->query(
-      "UPDATE ".get_table_name('identities')."
-       SET ".join(', ', $write_sql)."
-       WHERE  identity_id=?
-       AND    user_id=?
-       AND    del<>1",
-      $iid,
-      $this->ID);
-    
-    return $DB->affected_rows();
-  }
-  
-  
-  /**
-   * Create a new identity record linked with this user
-   *
-   * @param array  Hash array with col->value pairs to save
-   * @return int  The inserted identity ID or false on error
-   */
-  function insert_identity($data)
-  {
-    global $DB;
-    
-    if (!$this->ID)
-      return false;
-
-    $insert_cols = $insert_values = array();
-    foreach ((array)$data as $col => $value)
-    {
-      $insert_cols[] = $DB->quoteIdentifier($col);
-      $insert_values[] = $DB->quote($value);
-    }
-
-    $DB->query(
-      "INSERT INTO ".get_table_name('identities')."
-        (user_id, ".join(', ', $insert_cols).")
-       VALUES (?, ".join(', ', $insert_values).")",
-      $this->ID);
-
-    return $DB->insert_id(get_sequence_name('identities'));
-  }
-  
-  
-  /**
-   * Mark the given identity as deleted
-   *
-   * @param int  Identity ID
-   * @return boolean True if deleted successfully, false if nothing changed
-   */
-  function delete_identity($iid)
-  {
-    global $DB;
-    
-    if (!$this->ID)
-      return false;
-
-    if (!$this->ID || $this->ID == '')
-      return false;
-
-    $sql_result = $DB->query("SELECT count(*) AS ident_count FROM " .
-      get_table_name('identities') .
-      " WHERE user_id = ? AND del <> 1",
-      $this->ID);
-
-    $sql_arr = $DB->fetch_assoc($sql_result);
-    if ($sql_arr['ident_count'] <= 1)
-      return false;
-    
-    $DB->query(
-      "UPDATE ".get_table_name('identities')."
-       SET    del=1
-       WHERE  user_id=?
-       AND    identity_id=?",
-      $this->ID,
-      $iid);
-
-    return $DB->affected_rows();
-  }
-  
-  
-  /**
-   * Make this identity the default one for this user
-   *
-   * @param int The identity ID
-   */
-  function set_default($iid)
-  {
-    global $DB;
-    
-    if ($this->ID && $iid)
-    {
-      $DB->query(
-        "UPDATE ".get_table_name('identities')."
-         SET ".$DB->quoteIdentifier('standard')."='0'
-         WHERE  user_id=?
-         AND    identity_id<>?
-         AND    del<>1",
-        $this->ID,
-        $iid);
-    }
-  }
-  
-  
-  /**
-   * Update user's last_login timestamp
-   */
-  function touch()
-  {
-    global $DB;
-    
-    if ($this->ID)
-    {
-      $DB->query(
-        "UPDATE ".get_table_name('users')."
-         SET    last_login=".$DB->now()."
-         WHERE  user_id=?",
-        $this->ID);
-    }
-  }
-  
-  
-  /**
-   * Clear the saved object state
-   */
-  function reset()
-  {
-    $this->ID = null;
-    $this->data = null;
-  }
-  
-  
-  /**
-   * Find a user record matching the given name and host
-   *
-   * @param string IMAP user name
-   * @param string IMAP host name
-   * @return object rcube_user New user instance
-   * @static
-   */
-  function query($user, $host)
-  {
-    global $DB;
-    
-    // query if user already registered
-    $sql_result = $DB->query(
-      "SELECT * 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))
-      return new rcube_user($sql_arr['user_id'], $sql_arr);
-    else
-      return false;
-  }
-  
-  
-  /**
-   * Create a new user record and return a rcube_user instance
-   *
-   * @param string IMAP user name
-   * @param string IMAP host
-   * @return object rcube_user New user instance
-   * @static
-   */
-  function create($user, $host)
-  {
-    global $DB, $CONFIG;
-    
-    $user_email = '';
-
-    // try to resolve user in virtusertable
-    if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
-      $user_email = rcube_user::user2email($user);
-
-    $DB->query(
-      "INSERT INTO ".get_table_name('users')."
-        (created, last_login, username, mail_host, alias, language)
-       VALUES (".$DB->now().", ".$DB->now().", ?, ?, ?, ?)",
-      strip_newlines($user),
-      strip_newlines($host),
-      strip_newlines($user_email),
-      $_SESSION['user_lang']);
-
-    if ($user_id = $DB->insert_id(get_sequence_name('users')))
-    {
-      $mail_domain = rcmail_mail_domain($host);
-
-      if ($user_email=='')
-        $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/', $DB->escapeSimple($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)
-           VALUES (?, 0, 1, ?, ?)",
-          $user_id,
-          strip_newlines($user_name),
-          strip_newlines($user_email));
-      }
-    }
-    else
-    {
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'line' => __LINE__,
-        'file' => __FILE__,
-        'message' => "Failed to create new user"), true, false);
-    }
-    
-    return $user_id ? new rcube_user($user_id) : false;
-  }
-  
-  
-  /**
-   * Resolve username using a virtuser table
-   *
-   * @param string E-mail address to resolve
-   * @return string Resolved IMAP username
-   * @static
-   */
-  function email2user($email)
-  {
-    $user = $email;
-    $r = rcmail_findinvirtual("^$email");
-
-    for ($i=0; $i<count($r); $i++)
-    {
-      $data = $r[$i];
-      $arr = preg_split('/\s+/', $data);
-      if (count($arr) > 0)
-      {
-        $user = trim($arr[count($arr)-1]);
-        break;
-      }
-    }
-
-    return $user;
-  }
-
-
-  /**
-   * Resolve e-mail address from virtuser table
-   *
-   * @param string User name
-   * @return string Resolved e-mail address
-   * @static
-   */
-  function user2email($user)
-  {
-    $email = "";
-    $r = rcmail_findinvirtual("$user$");
-
-    for ($i=0; $i<count($r); $i++)
-    {
-      $data = $r[$i];
-      $arr = preg_split('/\s+/', $data);
-      if (count($arr) > 0)
-      {
-        $email = trim(str_replace('\\@', '@', $arr[0]));
-        break;
-      }
-    }
-
-    return $email;
-  }
-
-}
-
-
-?>
diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php
new file mode 100644 (file)
index 0000000..c808d07
--- /dev/null
@@ -0,0 +1,467 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_user.inc                                        |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   This class represents a system user linked and provides access      |
+ |   to the related database records.                                    |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_user.inc 933 2007-11-29 14:17:32Z thomasb $
+
+*/
+
+
+/**
+ * Class representing a system user
+ *
+ * @package    Core
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ */
+class rcube_user
+{
+  public $ID = null;
+  public $data = null;
+  public $language = 'en_US';
+  
+  private $db = null;
+  
+  
+  /**
+   * Object constructor
+   *
+   * @param object DB Database connection
+   */
+  function __construct($id = null, $sql_arr = null)
+  {
+    $this->db = rcmail::get_instance()->get_dbh();
+    
+    if ($id && !$sql_arr)
+    {
+      $sql_result = $this->db->query("SELECT * FROM ".get_table_name('users')." WHERE  user_id=?", $id);
+      $sql_arr = $this->db->fetch_assoc($sql_result);
+    }
+    
+    if (!empty($sql_arr))
+    {
+      $this->ID = $sql_arr['user_id'];
+      $this->data = $sql_arr;
+      $this->language = $sql_arr['language'];
+    }
+  }
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see  rcube_user::__construct
+   */
+  function rcube_user($id = null, $sql_arr = null)
+  {
+    $this->__construct($id, $sql_arr);
+  }
+  
+  
+  /**
+   * Build a user name string (as e-mail address)
+   *
+   * @return string Full user name
+   */
+  function get_username()
+  {
+    return $this->data['username'] ? $this->data['username'] . (!strpos($this->data['username'], '@') ? '@'.$this->data['mail_host'] : '') : false;
+  }
+  
+  
+  /**
+   * Get the preferences saved for this user
+   *
+   * @return array Hash array with prefs
+   */
+  function get_prefs()
+  {
+    if ($this->ID && $this->data['preferences'])
+      return array('language' => $this->language) + unserialize($this->data['preferences']);
+    else
+      return array();
+  }
+  
+  
+  /**
+   * 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 save_prefs($a_user_prefs)
+  {
+    if (!$this->ID)
+      return false;
+
+    // merge (partial) prefs array with existing settings
+    $a_user_prefs += (array)$this->get_prefs();
+    unset($a_user_prefs['language']);
+
+    $this->db->query(
+      "UPDATE ".get_table_name('users')."
+       SET    preferences=?,
+              language=?
+       WHERE  user_id=?",
+      serialize($a_user_prefs),
+      $_SESSION['language'],
+      $this->ID);
+
+    $this->language = $_SESSION['language'];
+    if ($this->db->affected_rows())
+    {
+      rcmail::get_instance()->config->merge($a_user_prefs);
+      return true;
+    }
+
+    return false;
+  }
+  
+  
+  /**
+   * Get default identity of this user
+   *
+   * @param int  Identity ID. If empty, the default identity is returned
+   * @return array Hash array with all cols of the 
+   */
+  function get_identity($id = null)
+  {
+    $sql_result = $this->list_identities($id ? sprintf('AND identity_id=%d', $id) : '');
+    return $this->db->fetch_assoc($sql_result);
+  }
+  
+  
+  /**
+   * Return a list of all identities linked with this user
+   *
+   * @return array List of identities
+   */
+  function list_identities($sql_add = '')
+  {
+    // get contacts from DB
+    $sql_result = $this->db->query(
+      "SELECT * FROM ".get_table_name('identities')."
+       WHERE  del<>1
+       AND    user_id=?
+       $sql_add
+       ORDER BY ".$this->db->quoteIdentifier('standard')." DESC, name ASC",
+      $this->ID);
+    
+    return $sql_result;
+  }
+  
+  
+  /**
+   * Update a specific identity record
+   *
+   * @param int    Identity ID
+   * @param array  Hash array with col->value pairs to save
+   * @return boolean True if saved successfully, false if nothing changed
+   */
+  function update_identity($iid, $data)
+  {
+    if (!$this->ID)
+      return false;
+    
+    $write_sql = array();
+    
+    foreach ((array)$data as $col => $value)
+    {
+      $write_sql[] = sprintf("%s=%s",
+        $this->db->quoteIdentifier($col),
+        $this->db->quote($value));
+    }
+    
+    $this->db->query(
+      "UPDATE ".get_table_name('identities')."
+       SET ".join(', ', $write_sql)."
+       WHERE  identity_id=?
+       AND    user_id=?
+       AND    del<>1",
+      $iid,
+      $this->ID);
+    
+    return $this->db->affected_rows();
+  }
+  
+  
+  /**
+   * Create a new identity record linked with this user
+   *
+   * @param array  Hash array with col->value pairs to save
+   * @return int  The inserted identity ID or false on error
+   */
+  function insert_identity($data)
+  {
+    if (!$this->ID)
+      return false;
+
+    $insert_cols = $insert_values = array();
+    foreach ((array)$data as $col => $value)
+    {
+      $insert_cols[] = $this->db->quoteIdentifier($col);
+      $insert_values[] = $this->db->quote($value);
+    }
+
+    $this->db->query(
+      "INSERT INTO ".get_table_name('identities')."
+        (user_id, ".join(', ', $insert_cols).")
+       VALUES (?, ".join(', ', $insert_values).")",
+      $this->ID);
+
+    return $this->db->insert_id(get_sequence_name('identities'));
+  }
+  
+  
+  /**
+   * Mark the given identity as deleted
+   *
+   * @param int  Identity ID
+   * @return boolean True if deleted successfully, false if nothing changed
+   */
+  function delete_identity($iid)
+  {
+    if (!$this->ID)
+      return false;
+
+    if (!$this->ID || $this->ID == '')
+      return false;
+
+    $sql_result = $this->db->query("SELECT count(*) AS ident_count FROM " .
+      get_table_name('identities') .
+      " WHERE user_id = ? AND del <> 1",
+      $this->ID);
+
+    $sql_arr = $this->db->fetch_assoc($sql_result);
+    if ($sql_arr['ident_count'] <= 1)
+      return false;
+    
+    $this->db->query(
+      "UPDATE ".get_table_name('identities')."
+       SET    del=1
+       WHERE  user_id=?
+       AND    identity_id=?",
+      $this->ID,
+      $iid);
+
+    return $this->db->affected_rows();
+  }
+  
+  
+  /**
+   * Make this identity the default one for this user
+   *
+   * @param int The identity ID
+   */
+  function set_default($iid)
+  {
+    if ($this->ID && $iid)
+    {
+      $this->db->query(
+        "UPDATE ".get_table_name('identities')."
+         SET ".$this->db->quoteIdentifier('standard')."='0'
+         WHERE  user_id=?
+         AND    identity_id<>?
+         AND    del<>1",
+        $this->ID,
+        $iid);
+    }
+  }
+  
+  
+  /**
+   * Update user's last_login timestamp
+   */
+  function touch()
+  {
+    if ($this->ID)
+    {
+      $this->db->query(
+        "UPDATE ".get_table_name('users')."
+         SET    last_login=".$this->db->now()."
+         WHERE  user_id=?",
+        $this->ID);
+    }
+  }
+  
+  
+  /**
+   * Clear the saved object state
+   */
+  function reset()
+  {
+    $this->ID = null;
+    $this->data = null;
+  }
+  
+  
+  /**
+   * Find a user record matching the given name and host
+   *
+   * @param string IMAP user name
+   * @param string IMAP host name
+   * @return object rcube_user New user instance
+   */
+  static function query($user, $host)
+  {
+    $dbh = rcmail::get_instance()->get_dbh();
+    
+    // query if user already registered
+    $sql_result = $dbh->query(
+      "SELECT * FROM ".get_table_name('users')."
+       WHERE  mail_host=? AND (username=? OR alias=?)",
+      $host,
+      $user,
+      $user);
+      
+    // user already registered -> overwrite username
+    if ($sql_arr = $dbh->fetch_assoc($sql_result))
+      return new rcube_user($sql_arr['user_id'], $sql_arr);
+    else
+      return false;
+  }
+  
+  
+  /**
+   * Create a new user record and return a rcube_user instance
+   *
+   * @param string IMAP user name
+   * @param string IMAP host
+   * @return object rcube_user New user instance
+   */
+  static function create($user, $host)
+  {
+    $user_email = '';
+    $rcmail = rcmail::get_instance();
+    $dbh = $rcmail->get_dbh();
+
+    // try to resolve user in virtusertable
+    if ($rcmail->config->get('virtuser_file') && !strpos($user, '@'))
+      $user_email = rcube_user::user2email($user);
+
+    $dbh->query(
+      "INSERT INTO ".get_table_name('users')."
+        (created, last_login, username, mail_host, alias, language)
+       VALUES (".$dbh->now().", ".$dbh->now().", ?, ?, ?, ?)",
+      strip_newlines($user),
+      strip_newlines($host),
+      strip_newlines($user_email),
+      $_SESSION['language']);
+
+    if ($user_id = $dbh->insert_id(get_sequence_name('users')))
+    {
+      $mail_domain = rcmail_mail_domain($host);
+
+      if ($user_email=='')
+        $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 ($virtuser_query = $rcmail->config->get('virtuser_query') &&
+          ($sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($user), $virtuser_query))) &&
+          ($dbh->num_rows() > 0))
+      {
+        while ($sql_arr = $dbh->fetch_array($sql_result))
+        {
+          $dbh->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
+        $dbh->query(
+          "INSERT INTO ".get_table_name('identities')."
+            (user_id, del, standard, name, email)
+           VALUES (?, 0, 1, ?, ?)",
+          $user_id,
+          strip_newlines($user_name),
+          strip_newlines($user_email));
+      }
+    }
+    else
+    {
+      raise_error(array(
+        'code' => 500,
+        'type' => 'php',
+        'line' => __LINE__,
+        'file' => __FILE__,
+        'message' => "Failed to create new user"), true, false);
+    }
+    
+    return $user_id ? new rcube_user($user_id) : false;
+  }
+  
+  
+  /**
+   * Resolve username using a virtuser table
+   *
+   * @param string E-mail address to resolve
+   * @return string Resolved IMAP username
+   */
+  static function email2user($email)
+  {
+    $user = $email;
+    $r = rcmail_findinvirtual("^$email");
+
+    for ($i=0; $i<count($r); $i++)
+    {
+      $data = $r[$i];
+      $arr = preg_split('/\s+/', $data);
+      if (count($arr) > 0)
+      {
+        $user = trim($arr[count($arr)-1]);
+        break;
+      }
+    }
+
+    return $user;
+  }
+
+
+  /**
+   * Resolve e-mail address from virtuser table
+   *
+   * @param string User name
+   * @return string Resolved e-mail address
+   */
+  static function user2email($user)
+  {
+    $email = "";
+    $r = rcmail_findinvirtual("$user$");
+
+    for ($i=0; $i<count($r); $i++)
+    {
+      $data = $r[$i];
+      $arr = preg_split('/\s+/', $data);
+      if (count($arr) > 0)
+      {
+        $email = trim(str_replace('\\@', '@', $arr[0]));
+        break;
+      }
+    }
+
+    return $email;
+  }
+
+}
+
+
index 6b0eeab7e179da7958b1e0a7180f6fe08199961f..60ae9e1b5dc9da38e5f4ef3f4a8e7b114f3cdf87 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: session.inc 1063 2008-02-13 05:26:47Z till $
+ $Id: session.inc 1400 2008-05-17 17:46:43Z thomasb $
 
 */
 
@@ -26,7 +26,6 @@ function sess_open($save_path, $session_name)
   }
 
 
-
 function sess_close()
   {
   return TRUE;
@@ -89,9 +88,7 @@ function sess_write($key, $vars)
                 VALUES (?, ?, ?, ".$DB->now().", ".$DB->now().")",
                 $key,
                 $vars,
-                $_SERVER['REMOTE_ADDR']);
-                
-
+                (string)$_SERVER['REMOTE_ADDR']);
     }
 
   return TRUE;
@@ -101,15 +98,18 @@ function sess_write($key, $vars)
 // handler for session_destroy()
 function sess_destroy($key)
   {
-  global $DB;
+  global $DB, $CONFIG;
   
   if ($DB->is_error())
     return FALSE;
-  
-  // delete session entries in cache table
-  $DB->query("DELETE FROM ".get_table_name('cache')."
-              WHERE  session_id=?",
+
+  if ($CONFIG['enable_caching'])
+    {
+    // delete session entries in cache table
+    $DB->query("DELETE FROM ".get_table_name('cache')."
+              WHERE session_id=?",
               $key);
+    }
               
   $DB->query("DELETE FROM ".get_table_name('session')."
               WHERE sess_id=?",
@@ -122,7 +122,7 @@ function sess_destroy($key)
 // garbage collecting function
 function sess_gc($maxlifetime)
   {
-  global $DB;
+  global $DB, $CONFIG;
 
   if ($DB->is_error())
     return FALSE;
@@ -137,20 +137,23 @@ function sess_gc($maxlifetime)
   while ($sql_arr = $DB->fetch_assoc($sql_result))
     $a_exp_sessions[] = $sql_arr['sess_id'];
 
-  
   if (sizeof($a_exp_sessions))
     {
-    // delete session cache records
-    $DB->query("DELETE FROM ".get_table_name('cache')."
-                WHERE  session_id IN ('".join("','", $a_exp_sessions)."')");
-                
+    if ($CONFIG['enable_caching'])
+      {
+        // delete session cache records
+       $DB->query("DELETE FROM ".get_table_name('cache')."
+                WHERE session_id IN ('".join("','", $a_exp_sessions)."')");
+      }
+                  
     // delete session records
     $DB->query("DELETE FROM ".get_table_name('session')."
                 WHERE sess_id IN ('".join("','", $a_exp_sessions)."')");
     }
 
   // also run message cache GC
-  rcmail_message_cache_gc();
+  if ($CONFIG['enable_caching'])
+    rcmail_message_cache_gc();
   rcmail_temp_gc();
 
   return TRUE;
index 1ddb6da689b3c767d3192da42d5029f68353c1ee..de250c5ccb62c3a63f9c7499c1efca7418a8d3cb 100644 (file)
@@ -13,7 +13,7 @@
  | Requires: common.js, list.js                                          |
  +-----------------------------------------------------------------------+
 
-  $Id: app.js 1255 2008-04-05 12:49:21Z thomasb $
+  $Id: app.js 1464 2008-06-02 12:24:31Z alec $
 */
 
 
@@ -179,7 +179,6 @@ function rcube_webmail()
           {
           this.enable_command('compose', 'add-contact', false);
           parent.rcmail.show_contentframe(true);
-          parent.rcmail.mark_message('read', this.env.uid);
           }
 
         if ((this.env.action=='show' || this.env.action=='preview') && this.env.blockedobjects)
@@ -356,7 +355,7 @@ function rcube_webmail()
   // start interval for keep-alive/recent_check signal
   this.start_keepalive = function()
     {
-    if (this.env.keep_alive && !this.env.framed && this.task=='mail' && this.gui_objects.messagelist)
+    if (this.env.keep_alive && !this.env.framed && this.task=='mail' && this.gui_objects.mailboxlist)
       this._int = setInterval(function(){ ref.check_for_recent(); }, this.env.keep_alive * 1000);
     else if (this.env.keep_alive && !this.env.framed && this.task!='login')
       this._int = setInterval(function(){ ref.send_keep_alive(); }, this.env.keep_alive * 1000);    
@@ -406,7 +405,7 @@ function rcube_webmail()
       this.init_address_input_events(input_cc);
     if (input_bcc)
       this.init_address_input_events(input_bcc);
-      
+
     // add signature according to selected identity
     if (input_from && input_from.type=='select-one')
       this.change_identity(input_from);
@@ -488,7 +487,7 @@ function rcube_webmail()
         break;
 
       case 'logout':
-        this.goto_url('logout', true);
+        this.goto_url('logout', '', true);
         break;      
 
       // commands to switch task
@@ -631,7 +630,7 @@ function rcube_webmail()
           var input_email = rcube_find_object('_email');
 
           // user prefs
-          if (input_pagesize && isNaN(input_pagesize.value))
+          if (input_pagesize && isNaN(parseInt(input_pagesize.value)))
             {
             alert(this.get_label('nopagesizewarning'));
             input_pagesize.focus();
@@ -722,7 +721,7 @@ function rcube_webmail()
           this.attachment_win = window.open(this.env.comm_path+'&_action=get&'+qstring+'&_frame=1', 'rcubemailattachment');
           if (this.attachment_win)
             {
-            setTimeout(function(){ ref.attachment_win.focus(); }, 10);
+            window.setTimeout(function(){ ref.attachment_win.focus(); }, 10);
             break;
             }
           }
@@ -890,7 +889,7 @@ function rcube_webmail()
           ref.printwin = window.open(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''));
           if (this.printwin)
           {
-            setTimeout(function(){ ref.printwin.focus(); }, 20);
+            window.setTimeout(function(){ ref.printwin.focus(); }, 20);
             if (this.env.action != 'show')
               this.mark_message('read', uid);
           }
@@ -903,7 +902,7 @@ function rcube_webmail()
           {
           ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox));
           if (this.sourcewin)
-            setTimeout(function(){ ref.sourcewin.focus(); }, 20);
+            window.setTimeout(function(){ ref.sourcewin.focus(); }, 20);
           }
         break;
 
@@ -1020,7 +1019,7 @@ function rcube_webmail()
 
     // set timer for requests
     if (a && this.env.request_timeout)
-      this.request_timer = setTimeout(function(){ ref.request_timed_out(); }, this.env.request_timeout * 1000);
+      this.request_timer = window.setTimeout(function(){ ref.request_timed_out(); }, this.env.request_timeout * 1000);
     };
 
 
@@ -1139,7 +1138,7 @@ function rcube_webmail()
 
     // start timer for message preview (wait for double click)
     if (selected && this.env.contentframe && !list.multi_selecting)
-      this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, this.dblclick_time + 10);
+      this.preview_timer = window.setTimeout(function(){ ref.msglist_get_preview(); }, this.dblclick_time + 10);
     else if (this.env.contentframe)
       this.show_contentframe(false);
     };
@@ -1233,9 +1232,12 @@ function rcube_webmail()
     var frm;
     if (this.env.contentframe && (frm = rcube_find_object(this.env.contentframe)))
       {
-      if (!show && window.frames[this.env.contentframe] && frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0)
-        frames[this.env.contentframe].location.href = this.env.blankpage;
-      if (!bw.safari)
+      if (!show && window.frames[this.env.contentframe])
+        {
+        if (window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0)
+         window.frames[this.env.contentframe].location.href = this.env.blankpage;
+       }
+      else if (!bw.safari)
         frm.style.display = show ? 'block' : 'none';
       }
       
@@ -1408,7 +1410,7 @@ function rcube_webmail()
   this.delete_messages = function()
     {
     var selection = this.message_list ? this.message_list.get_selection() : new Array();
-    
+
     // exit if no mailbox specified or if selection is empty
     if (!this.env.uid && !selection.length)
         return;
@@ -1459,8 +1461,9 @@ function rcube_webmail()
   this._with_selected_messages = function(action, lock, add_url)
     {
     var a_uids = new Array();
+
     if (this.env.uid)
-      a_uids[a_uids.length] = this.env.uid;
+      a_uids[0] = this.env.uid;
     else
       {
       var selection = this.message_list.get_selection();
@@ -1469,10 +1472,11 @@ function rcube_webmail()
         {
         id = selection[n];
         a_uids[a_uids.length] = id;
+
         this.message_list.remove_row(id, (n == selection.length-1));
         }
       }
-      
+    
     // also send search request to get the right messages 
     if (this.env.search_request) 
       add_url += '&_search='+this.env.search_request;
@@ -1488,20 +1492,23 @@ function rcube_webmail()
     var a_uids = new Array();
     var r_uids = new Array();
     var selection = this.message_list ? this.message_list.get_selection() : new Array();
-    
+
     if (uid)
       a_uids[0] = uid;
     else if (this.env.uid)
       a_uids[0] = this.env.uid;
     else if (this.message_list)
       {
-      for (var id, n=0; n<selection.length; n++)
+      for (var n=0; n<selection.length; n++)
         {
          a_uids[a_uids.length] = selection[n];
         }
       }
 
-    for (var id, n=0; n<a_uids.length; n++)
+    if (!this.message_list)
+      r_uids = a_uids;
+    else
+      for (var id, n=0; n<a_uids.length; n++)
       {
         id = a_uids[n];
         if ((flag=='read' && this.message_list.rows[id].unread) 
@@ -1512,11 +1519,11 @@ function rcube_webmail()
            r_uids[r_uids.length] = id;
          }
       }
-    
+
     // nothing to do
     if (!r_uids.length)
       return;
-      
+
     switch (flag)
       {
         case 'read':
@@ -1556,34 +1563,52 @@ function rcube_webmail()
           rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
           this.set_classname(rows[uid].obj, 'unread', false);
 
-          if (rows[uid].replied && this.env.repliedicon)
-            icn_src = this.env.repliedicon;
-          else if (this.env.messageicon)
+          if (this.env.messageicon)
             icn_src = this.env.messageicon;
           }
 
-        if (rows[uid].icon && icn_src)
+        if (rows[uid].icon && icn_src 
+           && !(rows[uid].replied && this.env.repliedicon)
+            && !(rows[uid].deleted && this.env.deletedicon))
           rows[uid].icon.src = icn_src;
         }
       }
 
     this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
   };
+
+  // set class to read/unread
+  this.mark_as_read_from_preview = function(uid)
+  {
+    var icn_src;
+    var rows = parent.rcmail.message_list.rows;
+    if(rows[uid].unread)
+      {
+        rows[uid].unread = false;
+        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
+        parent.rcmail.set_classname(rows[uid].obj, 'unread', false);
+
+        if (rows[uid].replied && parent.rcmail.env.repliedicon)
+         icn_src = parent.rcmail.env.repliedicon;
+        else if (rows[uid].deleted && parent.rcmail.env.deletedicon)
+         icn_src = parent.rcmail.env.deletedicon;
+        else if (parent.rcmail.env.messageicon)
+          icn_src = parent.rcmail.env.messageicon;
+      
+       if (rows[uid].icon && icn_src)
+          rows[uid].icon.src = icn_src;
+      }
+  }
+  
   
   // mark all message rows as deleted/undeleted
   this.toggle_delete_status = function(a_uids)
   {
-    if (this.env.read_when_deleted)
-      this.mark_message('read',a_uids);
-
-    // if deleting message from "view message" don't bother with delete icon
-    if (this.env.action == "show")
-      return false;
-
-    var rows = this.message_list.rows;
+    var rows = this.message_list ? this.message_list.rows : new Array();
+    
     if (a_uids.length==1)
     {
-      if (rows[a_uids[0]] && rows[a_uids[0]].classname.indexOf('deleted') < 0)
+      if (!rows.length || (rows[a_uids[0]] && rows[a_uids[0]].classname.indexOf('deleted') < 0))
         this.flag_as_deleted(a_uids);
       else
         this.flag_as_undeleted(a_uids);
@@ -1615,12 +1640,8 @@ function rcube_webmail()
 
   this.flag_as_undeleted = function(a_uids)
   {
-    // if deleting message from "view message" don't bother with delete icon
-    if (this.env.action == "show")
-      return false;
-
     var icn_src;
-    var rows = this.message_list.rows;
+    var rows = this.message_list ? this.message_list.rows : new Array();
       
     for (var i=0; i<a_uids.length; i++)
     {
@@ -1639,6 +1660,7 @@ function rcube_webmail()
           icn_src = this.env.repliedicon;
         else if (this.env.messageicon)
           icn_src = this.env.messageicon;
+
         if (rows[uid].icon && icn_src)
           rows[uid].icon.src = icn_src;
       }
@@ -1651,31 +1673,67 @@ function rcube_webmail()
   
   this.flag_as_deleted = function(a_uids)
   {
-    // if deleting message from "view message" don't bother with delete icon
-    if (this.env.action == "show")
-      return false;
-
-    var rows = this.message_list.rows;
+    var add_url = '';
+    var r_uids = new Array();
+    var rows = this.message_list ? this.message_list.rows : new Array();
+    
     for (var i=0; i<a_uids.length; i++)
-    {
+      {
       uid = a_uids[i];
-      if (rows[uid]) {
+      if (rows[uid])
+        {
         rows[uid].deleted = true;
         
-        if (rows[uid].classname.indexOf('deleted')<0) {
+        if (rows[uid].classname.indexOf('deleted')<0)
+         {
           rows[uid].classname += ' deleted';
           this.set_classname(rows[uid].obj, 'deleted', true);
-        }
-        if (rows[uid].icon && this.env.deletedicon)
+          }
+        
+       if (rows[uid].icon && this.env.deletedicon)
           rows[uid].icon.src = this.env.deletedicon;
+
+       if (rows[uid].unread)
+         r_uids[r_uids.length] = uid;
+        }
       }
-    }
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=delete');
+    if (r_uids.length)
+      add_url = '&_ruid='+r_uids.join(',');
+
+    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=delete'+add_url);
     return true;  
   };
 
 
+  // flag as read without mark request (called from backend)
+  // argument should be a coma-separated list of uids
+  this.flag_deleted_as_read = function(uids)
+  {
+    var icn_src;
+    var rows = this.message_list ? this.message_list.rows : new Array();
+    var str = String(uids);
+    var a_uids = new Array();
+
+    a_uids = str.split(',');
+
+    for (var uid, i=0; i<a_uids.length; i++)
+      {
+      uid = a_uids[i];
+      if (rows[uid])
+        {
+        rows[uid].unread = false;
+       rows[uid].read = true;
+        
+        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
+        this.set_classname(rows[uid].obj, 'unread', false);
+
+        if (rows[uid].icon)
+          rows[uid].icon.src = this.env.deletedicon;
+        }
+      }
+  };
+
   /*********************************************************/
   /*********           login form methods          *********/
   /*********************************************************/
@@ -1737,7 +1795,9 @@ function rcube_webmail()
       }
 
     // check for empty body
-    if ((input_message.value == '' && (!window.tinyMCE || tinyMCE.getContent() == '')) && !confirm(this.get_label('nobodywarning')))
+    if ((input_message.value == '' &&
+         (!window.tinyMCE || tinyMCE.get('compose-body').getContent() == '')) &&
+        !confirm(this.get_label('nobodywarning')))
       {
       input_message.focus();
       return false;
@@ -1775,12 +1835,12 @@ function rcube_webmail()
     {
     // check input fields
     var input_to = rcube_find_object('_to');
-    var input_cc = rcube_find_object('_to');
-    var input_bcc = rcube_find_object('_to');
+    var input_cc = rcube_find_object('_cc');
+    var input_bcc = rcube_find_object('_bcc');
     var input_subject = rcube_find_object('_subject');
-    var input_message = rcube_find_object('_message');
-    
+    var editor, input_message;
     var str = '';
+    
     if (input_to && input_to.value)
       str += input_to.value+':';
     if (input_cc && input_cc.value)
@@ -1789,8 +1849,14 @@ function rcube_webmail()
       str += input_bcc.value+':';
     if (input_subject && input_subject.value)
       str += input_subject.value+':';
-    if (input_message && input_message.value)
+    
+    if (editor = tinyMCE.get('compose-body'))
+      str += editor.getContent();
+    else
+      {
+      input_message = rcube_find_object('_message');
       str += input_message.value;
+      }
     
     if (save)
       this.cmp_hash = str;
@@ -1842,25 +1908,17 @@ function rcube_webmail()
       }
     else
       {
-      var eid = tinyMCE.getEditorId('_message');
-      // editor is a TinyMCE_Control object
-      var editor = tinyMCE.getInstanceById(eid);
-      // if this is null, we should exit
-      if (editor == null) {
-        return false;
-      }
-      var msgDoc = editor.getDoc();
-      var msgBody = msgDoc.body;
+      var editor = tinyMCE.get('compose-body');
 
       if (this.env.signatures && this.env.signatures[id])
         {
         // Append the signature as a span within the body
-        var sigElem = msgDoc.getElementById("_rc_sig");
+        var sigElem = editor.dom.get("_rc_sig");
         if (!sigElem)
           {
-          sigElem = msgDoc.createElement("span");
+          sigElem = editor.getDoc().createElement("span");
           sigElem.setAttribute("id", "_rc_sig");
-          msgBody.appendChild(sigElem);
+          editor.getBody().appendChild(sigElem);
           }
         if (this.env.signatures[id]['is_html'])
           {
@@ -1936,7 +1994,7 @@ function rcube_webmail()
 
       // have to do it this way for IE
       // otherwise the form will be posted to a new window
-      if(document.all && !window.opera)
+      if(document.all)
         {
         var html = '<iframe name="'+frame_name+'" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
         document.body.insertAdjacentHTML('BeforeEnd',html);
@@ -1945,8 +2003,9 @@ function rcube_webmail()
         {
         var frame = document.createElement('IFRAME');
         frame.name = frame_name;
-        frame.width = 10;
-        frame.height = 10;
+        frame.style.border = 'none';
+        frame.style.width = 0;
+        frame.style.height = 0;
         frame.style.visibility = 'hidden';
         document.body.appendChild(frame);
         }
@@ -2111,7 +2170,7 @@ function rcube_webmail()
       }
 
     // start timer
-    this.ksearch_timer = setTimeout(function(){ ref.ksearch_get_results(); }, 200);
+    this.ksearch_timer = window.setTimeout(function(){ ref.ksearch_get_results(); }, 200);
     this.ksearch_input = obj;
     
     return true;
@@ -2138,7 +2197,6 @@ function rcube_webmail()
     cpos = p+insert.length;
     if (this.ksearch_input.setSelectionRange)
       this.ksearch_input.setSelectionRange(cpos, cpos);
-    
   };
 
 
@@ -2207,8 +2265,6 @@ function rcube_webmail()
         {
         li = document.createElement('LI');
         li.innerHTML = a_results[i].replace(/</, '&lt;').replace(/>/, '&gt;');
-        li.onmousedown = function(e){ ref.insert_recipient(this._rcm_id); ref.ksearch_pane.show(0); return rcube_event.cancel(e); };
-        li.style.cursor = 'pointer';
         li._rcm_id = a_result_ids[i];
         ul.appendChild(li);
         }
@@ -2286,7 +2342,7 @@ function rcube_webmail()
 
       var id, frame, ref = this;
       if (id = list.get_single_selection())
-        this.preview_timer = setTimeout(function(){ ref.load_contact(id, 'show'); }, this.dblclick_time + 10);
+        this.preview_timer = window.setTimeout(function(){ ref.load_contact(id, 'show'); }, this.dblclick_time + 10);
       else if (this.env.contentframe)
         this.show_contentframe(false);
 
@@ -2427,7 +2483,7 @@ function rcube_webmail()
       qs += '&_search='+this.env.search_request;
 
     // send request to server
-    this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_from='+(this.env.action ? this.env.action : '')+qs);
+    this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_source='+urlencode(this.env.source)+'&_from='+(this.env.action ? this.env.action : '')+qs);
     return true;
     };
 
@@ -2525,12 +2581,13 @@ function rcube_webmail()
     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.drag_active && this.env.folder && (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, '')) &&
+           !this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2] &&    
+           (folder != this.env.folder.replace(reg, '')) &&
             (!folder.match(new RegExp('^'+RegExp.escape(this.env.folder+this.env.delimiter)))))
           {
           this.set_env('dstfolder', folder);
@@ -2562,8 +2619,7 @@ function rcube_webmail()
     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))
+        (folder = this.env.subscriptionrows['rcmrow'+id][0]))
       this.set_env('folder', folder);
     else
       this.set_env('folder', null);
@@ -2597,12 +2653,20 @@ 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 != '')
-      name = this.env.folder+this.env.delimiter+name;
 
-    if (name)
+      if (name.indexOf(this.env.delimiter)>=0)
+        {
+        alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')');
+        return false;
+        }
+
+      if (this.env.folder && name != '')
+        name = this.env.folder+this.env.delimiter+name;
+
       this.http_post('create-folder', '_name='+urlencode(name), true);
+      }
     else if (form.elements['_folder_name'])
       form.elements['_folder_name'].focus();
     };
@@ -2615,20 +2679,20 @@ function rcube_webmail()
     var temp, row, form;
 
     // reset current renaming
-  if (temp = this.edit_folder)
-    {
-    this.reset_folder_rename();
-    if (temp == id)
-      return;
-    }
+    if (temp = this.edit_folder)
+      {
+      this.reset_folder_rename();
+      if (temp == id)
+        return;
+      }
 
     if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id)))
       {
       var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']');
       this.name_input = document.createElement('INPUT');
-      this.name_input.value = this.env.subscriptionrows[id][1].replace(reg, '');
+      this.name_input.value = this.env.subscriptionrows[id][0].replace(reg, '');
       this.name_input.style.width = '100%';
-      
+
       reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
       this.name_input.__parent = this.env.subscriptionrows[id][0].replace(reg, '');
       this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
@@ -2647,11 +2711,9 @@ function rcube_webmail()
   this.reset_folder_rename = function()
     {
     var cell = this.name_input ? this.name_input.parentNode : null;
+
     if (cell && this.edit_folder && this.env.subscriptionrows[this.edit_folder])
-      {
-      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;');
-      }
+      cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1];
       
     this.edit_folder = null;
     };
@@ -2668,8 +2730,15 @@ function rcube_webmail()
       var newname = this.name_input ? this.name_input.value : null;
       if (this.edit_folder && newname)
         {
+        if (newname.indexOf(this.env.delimiter)>=0)
+          {
+          alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')');
+          return false;
+          }
+
         if (this.name_input.__parent)
           newname = this.name_input.__parent + this.env.delimiter + newname;
+
         this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
         }
       }
@@ -2694,20 +2763,19 @@ function rcube_webmail()
 
       if (this.gui_objects.createfolderhint)
         this.gui_objects.createfolderhint.innerHTML = '';
-
       }
     };
 
 
   // add a new folder to the subscription list by cloning a folder row
-  this.add_folder_row = function(name, display_name, replace)
+  this.add_folder_row = function(name, display_name, replace, before)
     {
-    name = name.replace('\\',"");
     if (!this.gui_objects.subscriptionlist)
       return false;
 
+    // find not protected folder    
     for (var refid in this.env.subscriptionrows)
-      if (this.env.subscriptionrows[refid]!=null)
+      if (this.env.subscriptionrows[refid]!=null && !this.env.subscriptionrows[refid][2])
         break;
 
     var refrow, form;
@@ -2731,14 +2799,18 @@ function rcube_webmail()
       // clone a table row if there are existing rows
       var row = this.clone_table_row(refrow);
       row.id = id;
-      if (replace)
-        tbody.replaceChild(row, replace);
+
+      if (before && (before = this.get_folder_row_id(before)))
+       tbody.insertBefore(row, document.getElementById(before));
       else
-        tbody.appendChild(row);
+        tbody.appendChild(row);          
+      
+      if (replace)
+       tbody.removeChild(replace);
       }
-    
+
     // add to folder/row-ID map
-    this.env.subscriptionrows[row.id] = [name, display_name];
+    this.env.subscriptionrows[row.id] = [name, display_name, 0];
 
     // set folder name
     row.cells[0].innerHTML = display_name;
@@ -2762,7 +2834,6 @@ function rcube_webmail()
         form.elements['_folder_name'].value = ''; 
       }
 
-    this.sort_subscription_list();
     this.init_subscription_list();
     if (selection && document.getElementById('rcmrow'+selection))
       this.subscription_list.select_row(selection);
@@ -2773,13 +2844,13 @@ function rcube_webmail()
 
 
   // replace an existing table row with a new folder line
-  this.replace_folder_row = function(oldfolder, newfolder, display_name)
+  this.replace_folder_row = function(oldfolder, newfolder, display_name, before)
     {
     var id = this.get_folder_row_id(oldfolder);
     var row = document.getElementById(id);
     
     // replace an existing table row (if found)
-    this.add_folder_row(newfolder, display_name, row);
+    this.add_folder_row(newfolder, display_name, row, before);
     
     // rename folder in rename-folder dropdown
     var form, elm;
@@ -2798,7 +2869,7 @@ function rcube_webmail()
       form.elements['_folder_newname'].value = '';
       }
     };
-    
+
 
   // remove the table row of a specific mailbox from the table
   // (the row will not be removed, just hidden)
@@ -2807,7 +2878,7 @@ function rcube_webmail()
     var row;
     var id = this.get_folder_row_id(folder);
     if (id && (row = document.getElementById(id)))
-      row.style.display = 'none';    
+      row.style.display = 'none';
 
     // remove folder from rename-folder list
     var form;
@@ -2874,32 +2945,6 @@ function rcube_webmail()
     return new_row;
     };
 
-  // sort subscription folder list
-  this.sort_subscription_list = function()
-    {
-    var index = new Array();
-    var tbody = this.gui_objects.subscriptionlist.tBodies[0];
-    var swapped = false;
-    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++)
-      {
-      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 = one.cloneNode(true);
-        tbody.replaceChild(swap, two);
-        tbody.replaceChild(two, one);
-        swapped = true;
-        }
-      }
-    if (swapped)
-      this.sort_subscription_list();
-    };
-
 
   /*********************************************************/
   /*********           GUI functionality           *********/
@@ -2923,7 +2968,7 @@ function rcube_webmail()
     var button, obj;
 
     if(!a_buttons || !a_buttons.length)
-      return;
+      return false;
 
     for(var n=0; n<a_buttons.length; n++)
       {
@@ -2991,7 +3036,7 @@ function rcube_webmail()
     var button, img;
 
     if(!a_buttons || !a_buttons.length)
-      return;
+      return false;
 
     for(var n=0; n<a_buttons.length; n++)
       {
@@ -3003,6 +3048,7 @@ function rcube_webmail()
           img.src = button.over;
         }
       }
+      
     };
 
   // mouse down on button
@@ -3098,7 +3144,7 @@ function rcube_webmail()
       this.gui_objects.message.onmousedown = function(){ _rcube.hide_message(); return true; };
     
     if (!hold)
-      this.message_timer = setTimeout(function(){ ref.hide_message(); }, this.message_time);
+      this.message_timer = window.setTimeout(function(){ ref.hide_message(); }, this.message_time);
     };
 
 
@@ -3237,16 +3283,13 @@ function rcube_webmail()
     this.set_page_buttons();
     };
 
+
   // replace content of quota display
-  this.set_quota = function()
+  this.set_quota = function(content)
     {
-    if (this.gui_objects.quotadisplay &&
-        this.gui_objects.quotadisplay.attributes.getNamedItem('display') &&
-        this.gui_objects.quotadisplay.attributes.getNamedItem('id'))
-      this.http_request('quotadisplay', '_display='+
-      this.gui_objects.quotadisplay.attributes.getNamedItem('display').nodeValue+
-      '&_id='+this.gui_objects.quotadisplay.attributes.getNamedItem('id').nodeValue, false);
-     };
+    if (this.gui_objects.quotadisplay && content)
+      this.gui_objects.quotadisplay.innerHTML = content;
+    };
 
 
   // update the mailboxlist
@@ -3291,7 +3334,12 @@ function rcube_webmail()
       }
     };
 
-
+  // update parent's mailboxlist (from preview)
+  this.set_unread_count_from_preview = function(mbox, count, set_title)
+  {
+    parent.rcmail.set_unread_count(mbox, count, set_title);
+  }
+  
   // add row to contacts list
   this.add_contact_row = function(cid, cols, select)
     {
@@ -3322,16 +3370,16 @@ function rcube_webmail()
     };
 
 
-  this.toggle_editor = function(checkbox, textElementName)
+  this.toggle_editor = function(checkbox, textAreaId)
     {
     var ischecked = checkbox.checked;
     if (ischecked)
       {
-        tinyMCE.execCommand('mceAddControl', true, textElementName);
+        tinyMCE.execCommand('mceAddControl', true, textAreaId);
       }
     else
       {
-        tinyMCE.execCommand('mceRemoveControl', true, textElementName);
+        tinyMCE.execCommand('mceRemoveControl', true, textAreaId);
       }
     };
 
@@ -3453,26 +3501,37 @@ function rcube_webmail()
     // process the response data according to the sent action
     switch (request_obj.__action)
       {
+
       case 'delete':
       case 'moveto':
         if (this.env.action=='show')
           this.command('list');
         else if (this.message_list)
           this.message_list.init();
-        break;
 
-      case 'list':
-        if (this.env.messagecount)
-         this.enable_command('purge', (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox));
+      case 'purge':
+      case 'expunge':      
+       if (!this.env.messagecount)
+         {
+           // clear preview pane content
+           if (this.env.contentframe)
+             this.show_contentframe(false);
+           // disable commands useless when mailbox is empty
+           this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource',
+             'print', 'load-attachment', 'purge', 'expunge', 'select-all', 'select-none', 'sort', false);
+         }
 
+       break;
+
+      case 'list':
        this.msglist_select(this.message_list);
 
+      case 'check-recent':
       case 'getunread':
-       this.enable_command('sort', (this.env.messagecount > 0));
+       this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0));
+       this.enable_command('purge', (this.env.messagecount && (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox)));
 
-      case 'expunge':
-        this.enable_command('select-all', 'select-none', 'expunge', this.env.messagecount ? true : false);
-        break;
+       break;
 
       }
 
@@ -3750,7 +3809,7 @@ function rcube_http_request()
 // helper function to call the init method with a delay
 function call_init(o)
   {
-  if (window[o] && window[o].init)
-    setTimeout(o+'.init()', 200);
+    window.setTimeout('if (window[\''+o+'\'] && window[\''+o+'\'].init) { '+o+'.init(); }',
+                      bw.win ? 500 : 200);
   }
 
index 0cb6614a3fea22e8844d1e2f2e929b26f7ce18e1..c35fc99518c4cf6eebb3008cbe75a312fd66a409 100644 (file)
@@ -10,7 +10,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
  
- $Id: common.js 1064 2008-02-13 05:33:41Z till $
+ $Id: common.js 1264 2008-04-07 09:08:06Z alec $
 */
 
 // Constants
@@ -579,18 +579,21 @@ roundcube_browser.prototype.get_cookie = getCookie;
 // tiny replacement for Firebox functionality
 function rcube_console()
 {
-  this.box = rcube_find_object('console');
-  
   this.log = function(msg)
   {
-    if (this.box)
-      this.box.value += str+'\n--------------------------------------\n';
+    box = rcube_find_object('console');
+    if (box)
+      if (msg[msg.length-1]=='\n')
+        box.value += msg+'--------------------------------------\n';
+      else
+        box.value += msg+'\n--------------------------------------\n';
   };
-  
+
   this.reset = function()
   {
-    if (this.box)
-      this.box.value = '';
+    box = rcube_find_object('console');
+    if (box)
+      box.value = '';
   };
 }
 
index 98dde2eca5dfde303a1a059a620cc4487130f3d6..7b22c9e8e5346c6e16da5eea401ca640ad7d82e0 100644 (file)
 
 // Initialize the message editor
 
-function rcmail_editor_init(skin_path)
+function rcmail_editor_init(skin_path, editor_lang)
   {
-  tinyMCE.init({ mode : 'specific_textareas',
+  tinyMCE.init({ mode : "textareas",
+                 editor_selector : "mce_editor",
                  accessibility_focus : false,
                  apply_source_formatting : true,
-                 theme : 'advanced',
-                 plugins : 'emotions,media,nonbreaking,table,searchreplace,spellchecker,visualchars',
-                 theme_advanced_buttons1 : 'bold,italic,underline,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,emotions,charmap,code,forecolor,backcolor,fontselect,fontsizeselect, separator,undo,redo,image,media',
-                 theme_advanced_buttons2 : '',
-                 theme_advanced_buttons3 : '',
-                 theme_advanced_toolbar_location : 'top',
-                 theme_advanced_toolbar_align : 'left',
-                 extended_valid_elements : 'font[face|size|color|style],span[id|class|align|style]',
-                 content_css : skin_path + '/editor_content.css',
-                 editor_css : skin_path + '/editor_ui.css',
-                 external_image_list_url : 'program/js/editor_images.js'
+                 theme : "advanced",
+                 language : editor_lang,
+                 plugins : "emotions,media,nonbreaking,table,searchreplace,visualchars,directionality",
+                 theme_advanced_buttons1 : "bold,italic,underline,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,link,unlink,emotions,charmap,code,forecolor,backcolor,fontselect,fontsizeselect, separator,undo,redo,image,media,ltr,rtl",
+                 theme_advanced_buttons2 : "",
+                 theme_advanced_buttons3 : "",
+                 theme_advanced_toolbar_location : "top",
+                 theme_advanced_toolbar_align : "left",
+                 extended_valid_elements : "font[face|size|color|style],span[id|class|align|style]",
+                 content_css : skin_path + "/editor_content.css",
+                 external_image_list_url : "editor_images.js"
                });
   }
 
-// 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)
@@ -61,7 +42,6 @@ function rcmail_toggle_editor(toggler)
   var selectedEditor = toggler.value;
 
   // determine the currently displayed editor
-
   var htmlFlag = document.getElementsByName('_is_html')[0];
   var isHtml = htmlFlag.value;
 
@@ -80,16 +60,16 @@ function rcmail_toggle_editor(toggler)
     var existingPlainText = composeElement.value;
     var htmlText = "<pre>" + existingPlainText + "</pre>";
     composeElement.value = htmlText;
-    tinyMCE.execCommand('mceAddControl', true, '_message');
+    tinyMCE.execCommand('mceAddControl', true, 'compose-body');
     htmlFlag.value = "1";
     }
   else
     {
     rcmail.set_busy(true, 'converting');
-    var thisMCE = tinyMCE.getInstanceById('_message');
-    var existingHtml = tinyMCE.getContent();
+    var thisMCE = tinyMCE.get('compose-body');
+    var existingHtml = thisMCE.getContent();
     rcmail_html2plain(existingHtml);
-    tinyMCE.execCommand('mceRemoveControl', true, '_message');
+    tinyMCE.execCommand('mceRemoveControl', true, 'compose-body');
     htmlFlag.value = "0";
     }
   }
index 2b3c7a8f66529c582b6c0f26fe89cc40fee27d10..e4d05e315766decacb010b1e014c6f29c0f15028 100644 (file)
@@ -172,7 +172,7 @@ focus: function(e)
   for (var n=0; n<this.selection.length; n++)
   {
     id = this.selection[n];
-    if (this.rows[id].obj)
+    if (this.rows[id] && this.rows[id].obj)
     {
       this.set_classname(this.rows[id].obj, 'selected', true);
       this.set_classname(this.rows[id].obj, 'unfocused', false);
@@ -398,6 +398,9 @@ select_next: function()
  */
 shift_select: function(id, control)
 {
+  if (!this.rows[this.shift_start] || !this.selection.length)
+    this.shift_start = id;
+
   var from_rowIndex = this.rows[this.shift_start].obj.rowIndex;
   var to_rowIndex = this.rows[id].obj.rowIndex;
 
diff --git a/program/js/tiny_mce/blank.htm b/program/js/tiny_mce/blank.htm
deleted file mode 100644 (file)
index 5a4a5a5..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>blank_page</title>\r
-       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-</head>\r
-<body class="mceContentBody">\r
-\r
-</body>\r
-</html>\r
index c093eafa04513a8031ce7aa54bb3b7e869907101..744145a92ead505cc62e56975111c5af3d23bd5e 100644 (file)
-// 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
+tinyMCE.addI18n({en:{\r
+common:{\r
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
+invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+more_colors:"More colors"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+},\r
+print:{\r
+print_desc:"Print"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
+absolute_desc:"Toggle absolute positioning",\r
+content:"New layer..."\r
+},\r
+save:{\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insert non-breaking space character"\r
+},\r
+iespell:{\r
+iespell_desc:"Run spell checking",\r
+download:"ieSpell not detected. Do you want to install it now?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontale rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
+},\r
+advimage:{\r
+image_desc:"Insert/edit image"\r
+},\r
+advlink:{\r
+link_desc:"Insert/edit link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
+},\r
+style:{\r
+desc:"Edit CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All"\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Document properties"\r
+},\r
+template:{\r
+desc:"Insert predefined template content"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on/off."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
+},\r
+pagebreak:{\r
+desc:"Insert page break."\r
+}}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/readme.txt b/program/js/tiny_mce/langs/readme.txt
deleted file mode 100644 (file)
index 9c3a9d9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-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
index 1837b0acbe16906b8643f1ded1a32f5b05d64e36..60d6d4c8f51c5c3910583e84d96fdf9e219afdd2 100644 (file)
-                 GNU LESSER GENERAL PUBLIC LICENSE
-                      Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-                 GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                           NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
+                 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
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js b/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js
deleted file mode 100644 (file)
index 8e1312f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/**\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
deleted file mode 100644 (file)
index d1a6466..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Dummy plugin since cleanup is now moved into core.\r
diff --git a/program/js/tiny_mce/plugins/compat2x/editor_plugin.js b/program/js/tiny_mce/plugins/compat2x/editor_plugin.js
new file mode 100644 (file)
index 0000000..090c94b
--- /dev/null
@@ -0,0 +1 @@
+(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,is=tinymce.is;tinymce.create('tinymce.plugins.Compat2x',{getInfo:function(){return{longname:'Compat2x',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};}});(function(){tinymce.extend(tinyMCE,{addToLang:function(p,l){each(l,function(v,k){tinyMCE.i18n[(tinyMCE.settings.language||'en')+'.'+(p?p+'_':'')+k]=v;});},getInstanceById:function(n){return this.get(n);}});})();(function(){var EditorManager=tinymce.EditorManager;tinyMCE.instances={};tinyMCE.plugins={};tinymce.PluginManager.onAdd.add(function(pm,n,p){tinyMCE.plugins[n]=p;});tinyMCE.majorVersion=tinymce.majorVersion;tinyMCE.minorVersion=tinymce.minorVersion;tinyMCE.releaseDate=tinymce.releaseDate;tinyMCE.baseURL=tinymce.baseURL;tinyMCE.isIE=tinyMCE.isMSIE=tinymce.isIE||tinymce.isOpera;tinyMCE.isMSIE5=tinymce.isIE;tinyMCE.isMSIE5_0=tinymce.isIE;tinyMCE.isMSIE7=tinymce.isIE;tinyMCE.isGecko=tinymce.isGecko;tinyMCE.isSafari=tinymce.isWebKit;tinyMCE.isOpera=tinymce.isOpera;tinyMCE.isMac=false;tinyMCE.isNS7=false;tinyMCE.isNS71=false;tinyMCE.compat=true;TinyMCE_Engine=tinyMCE;tinymce.extend(tinyMCE,{getParam:function(n,dv){return this.activeEditor.getParam(n,dv);},addEvent:function(e,na,f,sc){tinymce.dom.Event.add(e,na,f,sc||this);},getControlHTML:function(n){return EditorManager.activeEditor.controlManager.createControl(n);},loadCSS:function(u){tinymce.DOM.loadCSS(u);},importCSS:function(doc,u){if(doc==document)this.loadCSS(u);else new tinymce.dom.DOMUtils(doc).loadCSS(u);},log:function(){console.debug.apply(console,arguments);},getLang:function(n,dv){var v=EditorManager.activeEditor.getLang(n.replace(/^lang_/g,''),dv);if(/^[0-9\-.]+$/g.test(v))return parseInt(v);return v;},isInstance:function(o){return o!=null&&typeof(o)=="object"&&o.execCommand;},triggerNodeChange:function(){EditorManager.activeEditor.nodeChanged();},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 tinymce.trim(s);},xmlEncode:function(s){return tinymce.DOM.encode(s);},explode:function(s,d){var o=[];tinymce.each(s.split(d),function(v){if(v!='')o.push(v);});return o;},switchClass:function(id,cls){var b;if(/^mceButton/.test(cls)){b=EditorManager.activeEditor.controlManager.get(id);if(!b)return;switch(cls){case"mceButtonNormal":b.setDisabled(false);b.setActive(false);return;case"mceButtonDisabled":b.setDisabled(true);return;case"mceButtonSelected":b.setActive(true);b.setDisabled(false);return;}}},addCSSClass:function(e,n,b){return tinymce.DOM.addClass(e,n,b);},hasCSSClass:function(e,n){return tinymce.DOM.hasClass(e,n);},removeCSSClass:function(e,n){return tinymce.DOM.removeClass(e,n);},getCSSClasses:function(){var cl=EditorManager.activeEditor.dom.getClasses(),o=[];each(cl,function(c){o.push(c['class']);});return o;},setWindowArg:function(n,v){EditorManager.activeEditor.windowManager.params[n]=v;},getWindowArg:function(n,dv){var wm=EditorManager.activeEditor.windowManager,v;v=wm.getParam(n);if(v==='')return'';return v||wm.getFeature(n)||dv;},getParentNode:function(n,f){return this._getDOM().getParent(n,f);},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;},getNodeTree:function(n,na,t,nn){return this.selectNodes(n,function(n){return(!t||n.nodeType==t)&&(!nn||n.nodeName==nn);},na?na:[]);},getAttrib:function(e,n,dv){return this._getDOM().getAttrib(e,n,dv);},setAttrib:function(e,n,v){return this._getDOM().setAttrib(e,n,v);},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;},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;},getContent:function(){return EditorManager.activeEditor.getContent();},getParentElement:function(n,na,f){if(na)na=new RegExp('^('+na.toUpperCase().replace(/,/g,'|')+')$','g');return this._getDOM().getParent(n,function(n){return n.nodeType==1&&(!na||na.test(n.nodeName))&&(!f||f(n));},this.activeEditor.getBody());},importPluginLanguagePack:function(n){tinymce.PluginManager.requireLangPack(n);},getButtonHTML:function(cn,lang,img,c,u,v){var ed=EditorManager.activeEditor;img=img.replace(/\{\$pluginurl\}/g,tinyMCE.pluginURL);img=img.replace(/\{\$themeurl\}/g,tinyMCE.themeURL);lang=lang.replace(/^lang_/g,'');return ed.controlManager.createButton(cn,{title:lang,command:c,ui:u,value:v,scope:this,'class':'compat',image:img});},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;},cancelEvent:function(e){return tinymce.dom.Event.cancel(e);},handleVisualAid:function(e){EditorManager.activeEditor.addVisual(e);},getAbsPosition:function(n,r){return tinymce.DOM.getPos(n,r);},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s;},getVisualAidClass:function(s){return s;},parseStyle:function(s){return this._getDOM().parseStyle(s);},serializeStyle:function(s){return this._getDOM().serializeStyle(s);},openWindow:function(tpl,args){var ed=EditorManager.activeEditor,o={},n;for(n in tpl)o[n]=tpl[n];tpl=o;args=args||{};tpl.url=new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);tpl.inline=tpl.inline||args.inline;ed.windowManager.open(tpl,args);},closeWindow:function(win){EditorManager.activeEditor.windowManager.close(win);},getOuterHTML:function(e){return tinymce.DOM.getOuterHTML(e);},setOuterHTML:function(e,h,d){return tinymce.DOM.setOuterHTML(e,h,d);},hasPlugin:function(n){return tinymce.PluginManager.get(n)!=null;},_setEventsEnabled:function(){},addPlugin:function(pn,f){var t=this;function PluginWrapper(ed){tinyMCE.selectedInstance=ed;ed.onInit.add(function(){t.settings=ed.settings;t.settings['base_href']=tinyMCE.documentBasePath;tinyMCE.settings=t.settings;tinyMCE.documentBasePath=ed.documentBasePath;if(f.initInstance)f.initInstance(ed);ed.contentDocument=ed.getDoc();ed.contentWindow=ed.getWin();ed.undoRedo=ed.undoManager;ed.startContent=ed.getContent({format:'raw'});tinyMCE.instances[ed.id]=ed;tinyMCE.loadedFiles=[];});ed.onActivate.add(function(){tinyMCE.settings=ed.settings;tinyMCE.selectedInstance=ed;});if(f.handleNodeChange){ed.onNodeChange.add(function(ed,cm,n){f.handleNodeChange(ed.id,n,0,0,false,!ed.selection.isCollapsed());});}if(f.onChange){ed.onChange.add(function(ed,n){return f.onChange(ed);});}if(f.cleanup){ed.onGetContent.add(function(){});}this.getInfo=function(){return f.getInfo();};this.createControl=function(n){tinyMCE.pluginURL=tinymce.baseURL+'/plugins/'+pn;tinyMCE.themeURL=tinymce.baseURL+'/themes/'+tinyMCE.activeEditor.settings.theme;if(f.getControlHTML)return f.getControlHTML(n);return null;};this.execCommand=function(cmd,ui,val){if(f.execCommand)return f.execCommand(ed.id,ed.getBody(),cmd,ui,val);return false;};};tinymce.PluginManager.add(pn,PluginWrapper);},_getDOM:function(){return tinyMCE.activeEditor?tinyMCE.activeEditor.dom:tinymce.DOM;},convertRelativeToAbsoluteURL:function(b,u){return new tinymce.util.URI(b).toAbsolute(u);},convertAbsoluteURLToRelativeURL:function(b,u){return new tinymce.util.URI(b).toRelative(u);}});tinymce.extend(tinymce.Editor.prototype,{getFocusElement:function(){return this.selection.getNode();},getData:function(n){if(!this.data)this.data=[];if(!this.data[n])this.data[n]=[];return this.data[n];},hasPlugin:function(n){return this.plugins[n]!=null;},getContainerWin:function(){return window;},getHTML:function(raw){return this.getContent({format:raw?'raw':'html'});},setHTML:function(h){this.setContent(h);},getSel:function(){return this.selection.getSel();},getRng:function(){return this.selection.getRng();},isHidden:function(){var s;if(!tinymce.isGecko)return false;s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},translate:function(s){var c=this.settings.language,o;o=tinymce.EditorManager.i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return tinymce.EditorManager.i18n[c+'.'+b]||'{#'+b+'}';});o=o.replace(/{\$lang_([^}]+)\}/g,function(a,b){return tinymce.EditorManager.i18n[c+'.'+b]||'{$lang_'+b+'}';});return o;},repaint:function(){this.execCommand('mceRepaint');}});tinymce.extend(tinymce.dom.Selection.prototype,{getSelectedText:function(){return this.getContent({format:'text'});},getSelectedHTML:function(){return this.getContent({format:'html'});},getFocusElement:function(){return this.getNode();},selectNode:function(node,collapse,select_text_node,to_start){var t=this;t.select(node,select_text_node||0);if(!is(collapse))collapse=true;if(collapse){if(!is(to_start))to_start=true;t.collapse(to_start);}}});}).call(this);tinymce.PluginManager.add('compat2x',tinymce.plugins.Compat2x);})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/compat2x/editor_plugin_src.js b/program/js/tiny_mce/plugins/compat2x/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..afad77c
--- /dev/null
@@ -0,0 +1,613 @@
+/**\r
+ * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;\r
+\r
+       tinymce.create('tinymce.plugins.Compat2x', {\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Compat2x',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',\r
+                               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       (function() {\r
+               // Extend tinyMCE/EditorManager\r
+               tinymce.extend(tinyMCE, {\r
+                       addToLang : function(p, l) {\r
+                               each(l, function(v, k) {\r
+                                       tinyMCE.i18n[(tinyMCE.settings.language || 'en') + '.' + (p ? p + '_' : '') + k] = v;\r
+                               });\r
+                       },\r
+\r
+                       getInstanceById : function(n) {\r
+                               return this.get(n);\r
+                       }\r
+               });\r
+       })();\r
+\r
+       (function() {\r
+               var EditorManager = tinymce.EditorManager;\r
+\r
+               tinyMCE.instances = {};\r
+               tinyMCE.plugins = {};\r
+               tinymce.PluginManager.onAdd.add(function(pm, n, p) {\r
+                       tinyMCE.plugins[n] = p;\r
+               });\r
+\r
+               tinyMCE.majorVersion = tinymce.majorVersion;\r
+               tinyMCE.minorVersion = tinymce.minorVersion;\r
+               tinyMCE.releaseDate = tinymce.releaseDate;\r
+               tinyMCE.baseURL = tinymce.baseURL;\r
+               tinyMCE.isIE = tinyMCE.isMSIE = tinymce.isIE || tinymce.isOpera;\r
+               tinyMCE.isMSIE5 = tinymce.isIE;\r
+               tinyMCE.isMSIE5_0 = tinymce.isIE;\r
+               tinyMCE.isMSIE7 = tinymce.isIE;\r
+               tinyMCE.isGecko = tinymce.isGecko;\r
+               tinyMCE.isSafari = tinymce.isWebKit;\r
+               tinyMCE.isOpera = tinymce.isOpera;\r
+               tinyMCE.isMac = false;\r
+               tinyMCE.isNS7 = false;\r
+               tinyMCE.isNS71 = false;\r
+               tinyMCE.compat = true;\r
+\r
+               // Extend tinyMCE class\r
+               TinyMCE_Engine = tinyMCE;\r
+               tinymce.extend(tinyMCE, {\r
+                       getParam : function(n, dv) {\r
+                               return this.activeEditor.getParam(n, dv);\r
+                       },\r
+\r
+                       addEvent : function(e, na, f, sc) {\r
+                               tinymce.dom.Event.add(e, na, f, sc || this);\r
+                       },\r
+\r
+                       getControlHTML : function(n) {\r
+                               return EditorManager.activeEditor.controlManager.createControl(n);\r
+                       },\r
+\r
+                       loadCSS : function(u) {\r
+                               tinymce.DOM.loadCSS(u);\r
+                       },\r
+\r
+                       importCSS : function(doc, u) {\r
+                               if (doc == document)\r
+                                       this.loadCSS(u);\r
+                               else\r
+                                       new tinymce.dom.DOMUtils(doc).loadCSS(u);\r
+                       },\r
+\r
+                       log : function() {\r
+                               console.debug.apply(console, arguments);\r
+                       },\r
+\r
+                       getLang : function(n, dv) {\r
+                               var v = EditorManager.activeEditor.getLang(n.replace(/^lang_/g, ''), dv);\r
+\r
+                               // Is number\r
+                               if (/^[0-9\-.]+$/g.test(v))\r
+                                       return parseInt(v);\r
+\r
+                               return v;\r
+                       },\r
+\r
+                       isInstance : function(o) {\r
+                               return o != null && typeof(o) == "object" && o.execCommand;\r
+                       },\r
+\r
+                       triggerNodeChange : function() {\r
+                               EditorManager.activeEditor.nodeChanged();\r
+                       },\r
+\r
+                       regexpReplace : function(in_str, reg_exp, replace_str, opts) {\r
+                               var re;\r
+\r
+                               if (in_str == null)\r
+                                       return in_str;\r
+\r
+                               if (typeof(opts) == "undefined")\r
+                                       opts = 'g';\r
+\r
+                               re = new RegExp(reg_exp, opts);\r
+\r
+                               return in_str.replace(re, replace_str);\r
+                       },\r
+\r
+                       trim : function(s) {\r
+                               return tinymce.trim(s);\r
+                       },\r
+\r
+                       xmlEncode : function(s) {\r
+                               return tinymce.DOM.encode(s);\r
+                       },\r
+\r
+                       explode : function(s, d) {\r
+                               var o = [];\r
+\r
+                               tinymce.each(s.split(d), function(v) {\r
+                                       if (v != '')\r
+                                               o.push(v);\r
+                               });\r
+\r
+                               return o;\r
+                       },\r
+\r
+                       switchClass : function(id, cls) {\r
+                               var b;\r
+\r
+                               if (/^mceButton/.test(cls)) {\r
+                                       b = EditorManager.activeEditor.controlManager.get(id);\r
+\r
+                                       if (!b)\r
+                                               return;\r
+\r
+                                       switch (cls) {\r
+                                               case "mceButtonNormal":\r
+                                                       b.setDisabled(false);\r
+                                                       b.setActive(false);\r
+                                                       return;\r
+\r
+                                               case "mceButtonDisabled":\r
+                                                       b.setDisabled(true);\r
+                                                       return;\r
+\r
+                                               case "mceButtonSelected":\r
+                                                       b.setActive(true);\r
+                                                       b.setDisabled(false);\r
+                                                       return;\r
+                                       }\r
+                               }\r
+                       },\r
+\r
+                       addCSSClass : function(e, n, b) {\r
+                               return tinymce.DOM.addClass(e, n, b);\r
+                       },\r
+\r
+                       hasCSSClass : function(e, n) {\r
+                               return tinymce.DOM.hasClass(e, n);\r
+                       },\r
+\r
+                       removeCSSClass : function(e, n) {\r
+                               return tinymce.DOM.removeClass(e, n);\r
+                       },\r
+\r
+                       getCSSClasses : function() {\r
+                               var cl = EditorManager.activeEditor.dom.getClasses(), o = [];\r
+\r
+                               each(cl, function(c) {\r
+                                       o.push(c['class']);\r
+                               });\r
+\r
+                               return o;\r
+                       },\r
+\r
+                       setWindowArg : function(n, v) {\r
+                               EditorManager.activeEditor.windowManager.params[n] = v;\r
+                       },\r
+\r
+                       getWindowArg : function(n, dv) {\r
+                               var wm = EditorManager.activeEditor.windowManager, v;\r
+\r
+                               v = wm.getParam(n);\r
+                               if (v === '')\r
+                                       return '';\r
+\r
+                               return v || wm.getFeature(n) || dv;\r
+                       },\r
+\r
+                       getParentNode : function(n, f) {\r
+                               return this._getDOM().getParent(n, f);\r
+                       },\r
+\r
+                       selectElements : function(n, na, f) {\r
+                               var i, a = [], nl, x;\r
+\r
+                               for (x=0, na = na.split(','); x<na.length; x++)\r
+                                       for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)\r
+                                               (!f || f(nl[i])) && a.push(nl[i]);\r
+\r
+                               return a;\r
+                       },\r
+\r
+                       getNodeTree : function(n, na, t, nn) {\r
+                               return this.selectNodes(n, function(n) {\r
+                                       return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);\r
+                               }, na ? na : []);\r
+                       },\r
+\r
+                       getAttrib : function(e, n, dv) {\r
+                               return this._getDOM().getAttrib(e, n, dv);\r
+                       },\r
+\r
+                       setAttrib : function(e, n, v) {\r
+                               return this._getDOM().setAttrib(e, n, v);\r
+                       },\r
+\r
+                       getElementsByAttributeValue : function(n, e, a, v) {\r
+                               var i, nl = n.getElementsByTagName(e), o = [];\r
+\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)\r
+                                               o[o.length] = nl[i];\r
+                               }\r
+\r
+                               return o;\r
+                       },\r
+\r
+                       selectNodes : function(n, f, a) {\r
+                               var i;\r
+\r
+                               if (!a)\r
+                                       a = [];\r
+\r
+                               if (f(n))\r
+                                       a[a.length] = n;\r
+\r
+                               if (n.hasChildNodes()) {\r
+                                       for (i=0; i<n.childNodes.length; i++)\r
+                                               tinyMCE.selectNodes(n.childNodes[i], f, a);\r
+                               }\r
+\r
+                               return a;\r
+                       },\r
+\r
+                       getContent : function() {\r
+                               return EditorManager.activeEditor.getContent();\r
+                       },\r
+\r
+                       getParentElement : function(n, na, f) {\r
+                               if (na)\r
+                                       na = new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$', 'g');\r
+\r
+                               return this._getDOM().getParent(n, function(n) {\r
+                                       return n.nodeType == 1 && (!na || na.test(n.nodeName)) && (!f || f(n));\r
+                               }, this.activeEditor.getBody());\r
+                       },\r
+\r
+                       importPluginLanguagePack : function(n) {\r
+                               tinymce.PluginManager.requireLangPack(n);\r
+                       },\r
+\r
+                       getButtonHTML : function(cn, lang, img, c, u, v) {\r
+                               var ed = EditorManager.activeEditor;\r
+\r
+                               img = img.replace(/\{\$pluginurl\}/g, tinyMCE.pluginURL);\r
+                               img = img.replace(/\{\$themeurl\}/g, tinyMCE.themeURL);\r
+                               lang = lang.replace(/^lang_/g, '');\r
+\r
+                               return ed.controlManager.createButton(cn, {\r
+                                       title : lang,\r
+                                       command : c,\r
+                                       ui : u,\r
+                                       value : v,\r
+                                       scope : this,\r
+                                       'class' : 'compat',\r
+                                       image : img\r
+                               });\r
+                       },\r
+\r
+                       addSelectAccessibility : function(e, s, w) {\r
+                               // Add event handlers \r
+                               if (!s._isAccessible) {\r
+                                       s.onkeydown = tinyMCE.accessibleEventHandler;\r
+                                       s.onblur = tinyMCE.accessibleEventHandler;\r
+                                       s._isAccessible = true;\r
+                                       s._win = w;\r
+                               }\r
+\r
+                               return false;\r
+                       },\r
+\r
+                       accessibleEventHandler : function(e) {\r
+                               var elm, win = this._win;\r
+\r
+                               e = tinymce.isIE ? win.event : e;\r
+                               elm = tinymce.isIE ? e.srcElement : e.target;\r
+\r
+                               // Unpiggyback onchange on blur\r
+                               if (e.type == "blur") {\r
+                                       if (elm.oldonchange) {\r
+                                               elm.onchange = elm.oldonchange;\r
+                                               elm.oldonchange = null;\r
+                                       }\r
+\r
+                                       return true;\r
+                               }\r
+\r
+                               // Piggyback onchange\r
+                               if (elm.nodeName == "SELECT" && !elm.oldonchange) {\r
+                                       elm.oldonchange = elm.onchange;\r
+                                       elm.onchange = null;\r
+                               }\r
+\r
+                               // Execute onchange and remove piggyback\r
+                               if (e.keyCode == 13 || e.keyCode == 32) {\r
+                                       elm.onchange = elm.oldonchange;\r
+                                       elm.onchange();\r
+                                       elm.oldonchange = null;\r
+\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+\r
+                               return true;\r
+                       },\r
+\r
+                       cancelEvent : function(e) {\r
+                               return tinymce.dom.Event.cancel(e);\r
+                       },\r
+\r
+                       handleVisualAid : function(e) {\r
+                               EditorManager.activeEditor.addVisual(e);\r
+                       },\r
+\r
+                       getAbsPosition : function(n, r) {\r
+                               return tinymce.DOM.getPos(n, r);\r
+                       },\r
+\r
+                       cleanupEventStr : function(s) {\r
+                               s = "" + s;\r
+                               s = s.replace('function anonymous()\n{\n', '');\r
+                               s = s.replace('\n}', '');\r
+                               s = s.replace(/^return true;/gi, ''); // Remove event blocker\r
+\r
+                               return s;\r
+                       },\r
+\r
+                       getVisualAidClass : function(s) {\r
+                               // TODO: Implement\r
+                               return s;\r
+                       },\r
+\r
+                       parseStyle : function(s) {\r
+                               return this._getDOM().parseStyle(s);\r
+                       },\r
+\r
+                       serializeStyle : function(s) {\r
+                               return this._getDOM().serializeStyle(s);\r
+                       },\r
+\r
+                       openWindow : function(tpl, args) {\r
+                               var ed = EditorManager.activeEditor, o = {}, n;\r
+\r
+                               // Convert name/value array to object\r
+                               for (n in tpl)\r
+                                       o[n] = tpl[n];\r
+\r
+                               tpl = o;\r
+\r
+                               args = args || {};\r
+                               tpl.url = new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);\r
+                               tpl.inline = tpl.inline || args.inline;\r
+\r
+                               ed.windowManager.open(tpl, args);\r
+                       },\r
+\r
+                       closeWindow : function(win) {\r
+                               EditorManager.activeEditor.windowManager.close(win);\r
+                       },\r
+\r
+                       getOuterHTML : function(e) {\r
+                               return tinymce.DOM.getOuterHTML(e);\r
+                       },\r
+\r
+                       setOuterHTML : function(e, h, d) {\r
+                               return tinymce.DOM.setOuterHTML(e, h, d);\r
+                       },\r
+\r
+                       hasPlugin : function(n) {\r
+                               return tinymce.PluginManager.get(n) != null;\r
+                       },\r
+\r
+                       _setEventsEnabled : function() {\r
+                               // Ignore it!!\r
+                       },\r
+\r
+                       addPlugin : function(pn, f) {\r
+                               var t = this;\r
+\r
+                               function PluginWrapper(ed) {\r
+                                       tinyMCE.selectedInstance = ed;\r
+\r
+                                       ed.onInit.add(function() {\r
+                                               t.settings = ed.settings;\r
+                                               t.settings['base_href'] = tinyMCE.documentBasePath;\r
+                                               tinyMCE.settings = t.settings;\r
+                                               tinyMCE.documentBasePath = ed.documentBasePath;\r
+                                               //ed.formElement = DOM.get(ed.id);\r
+\r
+                                               if (f.initInstance)\r
+                                                       f.initInstance(ed);\r
+\r
+                                               ed.contentDocument = ed.getDoc();\r
+                                               ed.contentWindow = ed.getWin();\r
+                                               ed.undoRedo = ed.undoManager;\r
+                                               ed.startContent = ed.getContent({format : 'raw'});\r
+\r
+                                               tinyMCE.instances[ed.id] = ed;\r
+                                               tinyMCE.loadedFiles = [];\r
+                                       });\r
+\r
+                                       ed.onActivate.add(function() {\r
+                                               tinyMCE.settings = ed.settings;\r
+                                               tinyMCE.selectedInstance = ed;\r
+                                       });\r
+\r
+                               /*      if (f.removeInstance) {\r
+                                               ed.onDestroy.add(function() {\r
+                                                       return f.removeInstance(ed.id);\r
+                                               });\r
+                                       }*/\r
+\r
+                                       if (f.handleNodeChange) {\r
+                                               ed.onNodeChange.add(function(ed, cm, n) {\r
+                                                       f.handleNodeChange(ed.id, n, 0, 0, false, !ed.selection.isCollapsed());\r
+                                               });\r
+                                       }\r
+\r
+                                       if (f.onChange) {\r
+                                               ed.onChange.add(function(ed, n) {\r
+                                                       return f.onChange(ed);\r
+                                               });\r
+                                       }\r
+\r
+                                       if (f.cleanup) {\r
+                                               ed.onGetContent.add(function() {\r
+                                                       //f.cleanup(type, content, inst);\r
+                                               });\r
+                                       }\r
+\r
+                                       this.getInfo = function() {\r
+                                               return f.getInfo();\r
+                                       };\r
+\r
+                                       this.createControl = function(n) {\r
+                                               tinyMCE.pluginURL = tinymce.baseURL + '/plugins/' + pn;\r
+                                               tinyMCE.themeURL = tinymce.baseURL + '/themes/' + tinyMCE.activeEditor.settings.theme;\r
+\r
+                                               if (f.getControlHTML)\r
+                                                       return f.getControlHTML(n);\r
+\r
+                                               return null;\r
+                                       };\r
+\r
+                                       this.execCommand = function(cmd, ui, val) {\r
+                                               if (f.execCommand)\r
+                                                       return f.execCommand(ed.id, ed.getBody(), cmd, ui, val);\r
+\r
+                                               return false;\r
+                                       };\r
+                               };\r
+\r
+                               tinymce.PluginManager.add(pn, PluginWrapper);\r
+                       },\r
+\r
+                       _getDOM : function() {\r
+                               return tinyMCE.activeEditor ? tinyMCE.activeEditor.dom : tinymce.DOM;\r
+                       },\r
+\r
+                       convertRelativeToAbsoluteURL : function(b, u) {\r
+                               return new tinymce.util.URI(b).toAbsolute(u);\r
+                       },\r
+\r
+                       convertAbsoluteURLToRelativeURL : function(b, u) {\r
+                               return new tinymce.util.URI(b).toRelative(u);\r
+                       }\r
+               });\r
+\r
+               // Extend Editor class\r
+               tinymce.extend(tinymce.Editor.prototype, {\r
+                       getFocusElement : function() {\r
+                               return this.selection.getNode();\r
+                       },\r
+\r
+                       getData : function(n) {\r
+                               if (!this.data)\r
+                                       this.data = [];\r
+\r
+                               if (!this.data[n])\r
+                                       this.data[n] = [];\r
+\r
+                               return this.data[n];\r
+                       },\r
+\r
+                       hasPlugin : function(n) {\r
+                               return this.plugins[n] != null;\r
+                       },\r
+\r
+                       getContainerWin : function() {\r
+                               return window;\r
+                       },\r
+\r
+                       getHTML : function(raw) {\r
+                               return this.getContent({ format : raw ? 'raw' : 'html'});\r
+                       },\r
+\r
+                       setHTML : function(h) {\r
+                               this.setContent(h);\r
+                       },\r
+\r
+                       getSel : function() {\r
+                               return this.selection.getSel();\r
+                       },\r
+\r
+                       getRng : function() {\r
+                               return this.selection.getRng();\r
+                       },\r
+\r
+                       isHidden : function() {\r
+                               var s;\r
+\r
+                               if (!tinymce.isGecko)\r
+                                       return false;\r
+\r
+                               s = this.getSel();\r
+\r
+                               // Weird, wheres that cursor selection?\r
+                               return (!s || !s.rangeCount || s.rangeCount == 0);\r
+                       },\r
+\r
+                       translate : function(s) {\r
+                               var c = this.settings.language, o;\r
+\r
+                               o = tinymce.EditorManager.i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {\r
+                                       return tinymce.EditorManager.i18n[c + '.' + b] || '{#' + b + '}';\r
+                               });\r
+\r
+                               o = o.replace(/{\$lang_([^}]+)\}/g, function(a, b) {\r
+                                       return tinymce.EditorManager.i18n[c + '.' + b] || '{$lang_' + b + '}';\r
+                               });\r
+\r
+                               return o;\r
+                       },\r
+\r
+                       repaint : function() {\r
+                               this.execCommand('mceRepaint');\r
+                       }\r
+               });\r
+\r
+               // Extend selection\r
+               tinymce.extend(tinymce.dom.Selection.prototype, {\r
+                       getSelectedText : function() {\r
+                               return this.getContent({format : 'text'});\r
+                       },\r
+\r
+                       getSelectedHTML : function() {\r
+                               return this.getContent({format : 'html'});\r
+                       },\r
+\r
+                       getFocusElement : function() {\r
+                               return this.getNode();\r
+                       },\r
+\r
+                       selectNode : function(node, collapse, select_text_node, to_start) {\r
+                               var t = this;\r
+\r
+                               t.select(node, select_text_node || 0);\r
+\r
+                               if (!is(collapse))\r
+                                       collapse = true;\r
+\r
+                               if (collapse) {\r
+                                       if (!is(to_start))\r
+                                               to_start = true;\r
+\r
+                                       t.collapse(to_start);\r
+                               }\r
+                       }\r
+               });\r
+       }).call(this);\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('compat2x', tinymce.plugins.Compat2x);\r
+})();\r
+\r
diff --git a/program/js/tiny_mce/plugins/contextmenu/editor_plugin.js b/program/js/tiny_mce/plugins/contextmenu/editor_plugin.js
new file mode 100644 (file)
index 0000000..7dc3438
--- /dev/null
@@ -0,0 +1 @@
+(function(){var Event=tinymce.dom.Event,each=tinymce.each,DOM=tinymce.DOM;tinymce.create('tinymce.plugins.ContextMenu',{init:function(ed){var t=this;t.editor=ed;t.onContextMenu=new tinymce.util.Dispatcher(this);ed.onContextMenu.add(function(ed,e){if(!e.ctrlKey){t._getMenu(ed).showMenu(e.clientX,e.clientY);Event.add(document,'click',hide);Event.cancel(e);}});function hide(){if(t._menu){t._menu.removeAll();t._menu.destroy();Event.remove(document,'click',hide);}};ed.onMouseDown.add(hide);ed.onKeyDown.add(hide);},getInfo:function(){return{longname:'Contextmenu',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_getMenu:function(ed){var t=this,m=t._menu,se=ed.selection,col=se.isCollapsed(),el=se.getNode()||ed.getBody(),am,p1,p2;if(m){m.removeAll();m.destroy();}p1=DOM.getPos(ed.getContentAreaContainer());p2=DOM.getPos(ed.getContainer());m=ed.controlManager.createDropMenu('contextmenu',{offset_x:p1.x,offset_y:p1.y,constrain:1});t._menu=m;m.add({title:'advanced.cut_desc',icon:'cut',cmd:'Cut'}).setDisabled(col);m.add({title:'advanced.copy_desc',icon:'copy',cmd:'Copy'}).setDisabled(col);m.add({title:'advanced.paste_desc',icon:'paste',cmd:'Paste'});if((el.nodeName=='A'&&!ed.dom.getAttrib(el,'name'))||!col){m.addSeparator();m.add({title:'advanced.link_desc',icon:'link',cmd:ed.plugins.advlink?'mceAdvLink':'mceLink',ui:true});m.add({title:'advanced.unlink_desc',icon:'unlink',cmd:'UnLink'});}m.addSeparator();m.add({title:'advanced.image_desc',icon:'image',cmd:ed.plugins.advimage?'mceAdvImage':'mceImage',ui:true});m.addSeparator();am=m.addMenu({title:'contextmenu.align'});am.add({title:'contextmenu.left',icon:'justifyleft',cmd:'JustifyLeft'});am.add({title:'contextmenu.center',icon:'justifycenter',cmd:'JustifyCenter'});am.add({title:'contextmenu.right',icon:'justifyright',cmd:'JustifyRight'});am.add({title:'contextmenu.full',icon:'justifyfull',cmd:'JustifyFull'});t.onContextMenu.dispatch(t,m,el,col);return m;}});tinymce.PluginManager.add('contextmenu',tinymce.plugins.ContextMenu);})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/program/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..6492641
--- /dev/null
@@ -0,0 +1,97 @@
+/**\r
+ * $Id: editor_plugin_src.js 755 2008-03-29 19:14:42Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;\r
+\r
+       tinymce.create('tinymce.plugins.ContextMenu', {\r
+               init : function(ed) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+                       t.onContextMenu = new tinymce.util.Dispatcher(this);\r
+\r
+                       ed.onContextMenu.add(function(ed, e) {\r
+                               if (!e.ctrlKey) {\r
+                                       t._getMenu(ed).showMenu(e.clientX, e.clientY);\r
+                                       Event.add(document, 'click', hide);\r
+                                       Event.cancel(e);\r
+                               }\r
+                       });\r
+\r
+                       function hide() {\r
+                               if (t._menu) {\r
+                                       t._menu.removeAll();\r
+                                       t._menu.destroy();\r
+                                       Event.remove(document, 'click', hide);\r
+                               }\r
+                       };\r
+\r
+                       ed.onMouseDown.add(hide);\r
+                       ed.onKeyDown.add(hide);\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Contextmenu',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               _getMenu : function(ed) {\r
+                       var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2;\r
+\r
+                       if (m) {\r
+                               m.removeAll();\r
+                               m.destroy();\r
+                       }\r
+\r
+                       p1 = DOM.getPos(ed.getContentAreaContainer());\r
+                       p2 = DOM.getPos(ed.getContainer());\r
+\r
+                       m = ed.controlManager.createDropMenu('contextmenu', {\r
+                               offset_x : p1.x,\r
+                               offset_y : p1.y,\r
+/*                             vp_offset_x : p2.x,\r
+                               vp_offset_y : p2.y,*/\r
+                               constrain : 1\r
+                       });\r
+\r
+                       t._menu = m;\r
+\r
+                       m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col);\r
+                       m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col);\r
+                       m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'});\r
+\r
+                       if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) {\r
+                               m.addSeparator();\r
+                               m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});\r
+                               m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});\r
+                       }\r
+\r
+                       m.addSeparator();\r
+                       m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});\r
+\r
+                       m.addSeparator();\r
+                       am = m.addMenu({title : 'contextmenu.align'});\r
+                       am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'});\r
+                       am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'});\r
+                       am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'});\r
+                       am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'});\r
+\r
+                       t.onContextMenu.dispatch(t, m, el, col);\r
+\r
+                       return m;\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/directionality/editor_plugin.js b/program/js/tiny_mce/plugins/directionality/editor_plugin.js
new file mode 100644 (file)
index 0000000..6966d80
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create('tinymce.plugins.Directionality',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceDirectionLTR',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="ltr")ed.dom.setAttrib(e,"dir","ltr");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addCommand('mceDirectionRTL',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="rtl")ed.dom.setAttrib(e,"dir","rtl");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addButton('ltr',{title:'directionality.ltr_desc',cmd:'mceDirectionLTR'});ed.addButton('rtl',{title:'directionality.rtl_desc',cmd:'mceDirectionRTL'});ed.onNodeChange.add(t._nodeChange,t);},getInfo:function(){return{longname:'Directionality',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_nodeChange:function(ed,cm,n){var dom=ed.dom,dir;n=dom.getParent(n,dom.isBlock);if(!n){cm.setDisabled('ltr',1);cm.setDisabled('rtl',1);return;}dir=dom.getAttrib(n,'dir');cm.setActive('ltr',dir=="ltr");cm.setDisabled('ltr',0);cm.setActive('rtl',dir=="rtl");cm.setDisabled('rtl',0);}});tinymce.PluginManager.add('directionality',tinymce.plugins.Directionality);})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/directionality/editor_plugin_src.js b/program/js/tiny_mce/plugins/directionality/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..81818e3
--- /dev/null
@@ -0,0 +1,79 @@
+/**\r
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.Directionality', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       ed.addCommand('mceDirectionLTR', function() {\r
+                               var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock);\r
+\r
+                               if (e) {\r
+                                       if (ed.dom.getAttrib(e, "dir") != "ltr")\r
+                                               ed.dom.setAttrib(e, "dir", "ltr");\r
+                                       else\r
+                                               ed.dom.setAttrib(e, "dir", "");\r
+                               }\r
+\r
+                               ed.nodeChanged();\r
+                       });\r
+\r
+                       ed.addCommand('mceDirectionRTL', function() {\r
+                               var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock);\r
+\r
+                               if (e) {\r
+                                       if (ed.dom.getAttrib(e, "dir") != "rtl")\r
+                                               ed.dom.setAttrib(e, "dir", "rtl");\r
+                                       else\r
+                                               ed.dom.setAttrib(e, "dir", "");\r
+                               }\r
+\r
+                               ed.nodeChanged();\r
+                       });\r
+\r
+                       ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'});\r
+                       ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'});\r
+\r
+                       ed.onNodeChange.add(t._nodeChange, t);\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Directionality',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _nodeChange : function(ed, cm, n) {\r
+                       var dom = ed.dom, dir;\r
+\r
+                       n = dom.getParent(n, dom.isBlock);\r
+                       if (!n) {\r
+                               cm.setDisabled('ltr', 1);\r
+                               cm.setDisabled('rtl', 1);\r
+                               return;\r
+                       }\r
+\r
+                       dir = dom.getAttrib(n, 'dir');\r
+                       cm.setActive('ltr', dir == "ltr");\r
+                       cm.setDisabled('ltr', 0);\r
+                       cm.setActive('rtl', dir == "rtl");\r
+                       cm.setDisabled('rtl', 0);\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality);\r
+})();
\ No newline at end of file
index 4d81e5a86bf80750317bc26a1b8f676cdc1aa840..87fac106d44b7f181cabb8feb3ee916440136200 100644 (file)
@@ -1 +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
+(function(){tinymce.create('tinymce.plugins.EmotionsPlugin',{init:function(ed,url){ed.addCommand('mceEmotion',function(){ed.windowManager.open({file:url+'/emotions.htm',width:250+parseInt(ed.getLang('emotions.delta_width',0)),height:160+parseInt(ed.getLang('emotions.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('emotions',{title:'emotions.emotions_desc',cmd:'mceEmotion'});},getInfo:function(){return{longname:'Emotions',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('emotions',tinymce.plugins.EmotionsPlugin);})();
\ No newline at end of file
index c7d60cf3f5c03b6c94af352d3004fb7bcf8c0a24..df0d370aeab690245bf03bb35623dd7b180720d0 100644 (file)
@@ -1,63 +1,40 @@
 /**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $\r
  *\r
  * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ * @copyright Copyright © 2004-2008, 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
+(function() {\r
+       tinymce.create('tinymce.plugins.EmotionsPlugin', {\r
+               init : function(ed, url) {\r
+                       // Register commands\r
+                       ed.addCommand('mceEmotion', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/emotions.htm',\r
+                                       width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)),\r
+                                       height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'});\r
+               },\r
+\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
-               // Pass to next handler in chain\r
-               return false;\r
-       }\r
-};\r
-\r
-// Register plugin\r
-tinyMCE.addPlugin('emotions', TinyMCE_EmotionsPlugin);\r
+       // Register plugin\r
+       tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin);\r
+})();
\ No newline at end of file
index fca8ffa08103d4e99ca5e7fe286098797ac35dd4..8110ee029a668ad024cbfb8e5a40ab34ada41117 100644 (file)
@@ -1,38 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#emotions_dlg.title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/emotions.js"></script>\r
        <base target="_self" />\r
 </head>\r
-<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<body style="display: none">\r
        <div align="center">\r
-               <div class="title">{$lang_emotions_title}:<br /><br /></div>\r
+               <div class="title">{#emotions_dlg.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
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-cool.gif','emotions_dlg.cool');"><img src="img/smiley-cool.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cool}" title="{#emotions_dlg.cool}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-cry.gif','emotions_dlg.cry');"><img src="img/smiley-cry.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cry}" title="{#emotions_dlg.cry}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-embarassed.gif','emotions_dlg.embarassed');"><img src="img/smiley-embarassed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.embarassed}" title="{#emotions_dlg.embarassed}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-foot-in-mouth.gif','emotions_dlg.foot_in_mouth');"><img src="img/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.foot_in_mouth}" title="{#emotions_dlg.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
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-frown.gif','emotions_dlg.frown');"><img src="img/smiley-frown.gif" width="18" height="18" border="0" alt="{#emotions_dlg.frown}" title="{#emotions_dlg.frown}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-innocent.gif','emotions_dlg.innocent');"><img src="img/smiley-innocent.gif" width="18" height="18" border="0" alt="{#emotions_dlg.innocent}" title="{#emotions_dlg.innocent}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-kiss.gif','emotions_dlg.kiss');"><img src="img/smiley-kiss.gif" width="18" height="18" border="0" alt="{#emotions_dlg.kiss}" title="{#emotions_dlg.kiss}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-laughing.gif','emotions_dlg.laughing');"><img src="img/smiley-laughing.gif" width="18" height="18" border="0" alt="{#emotions_dlg.laughing}" title="{#emotions_dlg.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
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-money-mouth.gif','emotions_dlg.money_mouth');"><img src="img/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.money_mouth}" title="{#emotions_dlg.money_mouth}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-sealed.gif','emotions_dlg.sealed');"><img src="img/smiley-sealed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.sealed}" title="{#emotions_dlg.sealed}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-smile.gif','emotions_dlg.smile');"><img src="img/smiley-smile.gif" width="18" height="18" border="0" alt="{#emotions_dlg.smile}" title="{#emotions_dlg.smile}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-surprised.gif','emotions_dlg.surprised');"><img src="img/smiley-surprised.gif" width="18" height="18" border="0" alt="{#emotions_dlg.surprised}" title="{#emotions_dlg.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
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-tongue-out.gif','emotions_dlg.tongue_out');"><img src="img/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{#emotions_dlg.tongue-out}" title="{#emotions_dlg.tongue_out}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-undecided.gif','emotions_dlg.undecided');"><img src="img/smiley-undecided.gif" width="18" height="18" border="0" alt="{#emotions_dlg.undecided}" title="{#emotions_dlg.undecided}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-wink.gif','emotions_dlg.wink');"><img src="img/smiley-wink.gif" width="18" height="18" border="0" alt="{#emotions_dlg.wink}" title="{#emotions_dlg.wink}" /></a></td>\r
+                       <td><a href="javascript:EmotionsDialog.insert('smiley-yell.gif','emotions_dlg.yell');"><img src="img/smiley-yell.gif" width="18" height="18" border="0" alt="{#emotions_dlg.yell}" title="{#emotions_dlg.yell}" /></a></td>\r
                  </tr>\r
                </table>\r
        </div>\r
diff --git a/program/js/tiny_mce/plugins/emotions/images/emotions.gif b/program/js/tiny_mce/plugins/emotions/images/emotions.gif
deleted file mode 100644 (file)
index a39ed8e..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/emotions.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/readme.txt b/program/js/tiny_mce/plugins/emotions/images/readme.txt
deleted file mode 100644 (file)
index a3cea1b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644 (file)
index ba90cc3..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif and /dev/null 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
deleted file mode 100644 (file)
index 74d897a..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif and /dev/null 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
deleted file mode 100644 (file)
index 963a96b..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif and /dev/null 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
deleted file mode 100644 (file)
index 16f68cc..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif and /dev/null 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
deleted file mode 100644 (file)
index 716f55e..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif and /dev/null 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
deleted file mode 100644 (file)
index 334d49e..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif and /dev/null 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
deleted file mode 100644 (file)
index 4efd549..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif and /dev/null 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
deleted file mode 100644 (file)
index 1606c11..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif and /dev/null 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
deleted file mode 100644 (file)
index ca2451e..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif and /dev/null 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
deleted file mode 100644 (file)
index b33d3cc..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif and /dev/null 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
deleted file mode 100644 (file)
index e6a9e60..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif and /dev/null 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
deleted file mode 100644 (file)
index cb99cdd..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif and /dev/null 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
deleted file mode 100644 (file)
index 2075dc1..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif and /dev/null 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
deleted file mode 100644 (file)
index bef7e25..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif and /dev/null 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
deleted file mode 100644 (file)
index 9faf1af..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif and /dev/null 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
deleted file mode 100644 (file)
index 648e6e8..0000000
Binary files a/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-cool.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-cool.gif
new file mode 100644 (file)
index 0000000..ba90cc3
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-cool.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif
new file mode 100644 (file)
index 0000000..74d897a
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif
new file mode 100644 (file)
index 0000000..963a96b
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/program/js/tiny_mce/plugins/emotions/img/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/img/smiley-foot-in-mouth.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-frown.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-frown.gif
new file mode 100644 (file)
index 0000000..716f55e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-frown.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif
new file mode 100644 (file)
index 0000000..334d49e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif
new file mode 100644 (file)
index 0000000..4efd549
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif
new file mode 100644 (file)
index 0000000..1606c11
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif
new file mode 100644 (file)
index 0000000..ca2451e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif
new file mode 100644 (file)
index 0000000..b33d3cc
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif
new file mode 100644 (file)
index 0000000..e6a9e60
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif
new file mode 100644 (file)
index 0000000..cb99cdd
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif
new file mode 100644 (file)
index 0000000..2075dc1
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif
new file mode 100644 (file)
index 0000000..bef7e25
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-wink.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-wink.gif
new file mode 100644 (file)
index 0000000..9faf1af
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-wink.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/img/smiley-yell.gif b/program/js/tiny_mce/plugins/emotions/img/smiley-yell.gif
new file mode 100644 (file)
index 0000000..648e6e8
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/img/smiley-yell.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/js/emotions.js b/program/js/tiny_mce/plugins/emotions/js/emotions.js
new file mode 100644 (file)
index 0000000..c549367
--- /dev/null
@@ -0,0 +1,22 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var EmotionsDialog = {\r
+       init : function(ed) {\r
+               tinyMCEPopup.resizeToInnerSize();\r
+       },\r
+\r
+       insert : function(file, title) {\r
+               var ed = tinyMCEPopup.editor, dom = ed.dom;\r
+\r
+               tinyMCEPopup.execCommand('mceInsertContent', false, dom.createHTML('img', {\r
+                       src : tinyMCEPopup.getWindowArg('plugin_url') + '/img/' + file,\r
+                       alt : ed.getLang(title),\r
+                       title : ed.getLang(title),\r
+                       border : 0\r
+               }));\r
+\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(EmotionsDialog.init, EmotionsDialog);\r
diff --git a/program/js/tiny_mce/plugins/emotions/jscripts/functions.js b/program/js/tiny_mce/plugins/emotions/jscripts/functions.js
deleted file mode 100644 (file)
index 95a9eaf..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-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
deleted file mode 100644 (file)
index 3cdd675..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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/langs/en_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..3b57ad9
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('en.emotions_dlg',{\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/readme.txt b/program/js/tiny_mce/plugins/emotions/readme.txt
deleted file mode 100644 (file)
index 4fdb78a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Check the TinyMCE documentation for details on this plugin.\r
index 7873235e72a7768b3b3e78814ee3a2e2dd75eb08..1bf6a758696c2a69384e7eb4595ea156d86c6ccc 100644 (file)
@@ -1,26 +1,6 @@
-.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {
-       border: 1px dotted #cc0000;
-       background-position: center;
-       background-repeat: no-repeat;
-       background-color: #ffffcc;
-}
-
-.mceItemShockWave {
-       background-image: url('../images/shockwave.gif');
-}
-
-.mceItemFlash {
-       background-image: url('../images/flash.gif');
-}
-
-.mceItemQuickTime {
-       background-image: url('../images/quicktime.gif');
-}
-
-.mceItemWindowsMedia {
-       background-image: url('../images/windowsmedia.gif');
-}
-
-.mceItemRealMedia {
-       background-image: url('../images/realmedia.gif');
-}
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc;}\r
+.mceItemShockWave {background-image: url(../img/shockwave.gif);}\r
+.mceItemFlash {background-image:url(../img/flash.gif);}\r
+.mceItemQuickTime {background-image:url(../img/quicktime.gif);}\r
+.mceItemWindowsMedia {background-image:url(../img/windowsmedia.gif);}\r
+.mceItemRealMedia {background-image:url(../img/realmedia.gif);}\r
index 62d666a5f83bc5d8cc31d0b0b514526501fdce70..89c6bd5a055cdbf55727100dace8e41a9b95049c 100644 (file)
@@ -1,68 +1,68 @@
-#id, #name, #hspace, #vspace, #class_name, #align {
-       width: 100px;
-}
-
-#hspace, #vspace {
-       width: 50px;
-}
-
-#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode {
-       width: 100px;
-}
-
-#flash_base, #flash_flashvars {
-       width: 240px;
-}
-
-#width, #height {
-       width: 40px;
-}
-
-#src, #media_type {
-       width: 250px;
-}
-
-#class {
-       width: 120px;
-}
-
-#prev {
-       margin: 0;
-       border: 1px solid black;
-       width: 99%;
-       height: 230px;
-       overflow: auto;
-}
-
-.panel_wrapper div.current {
-       height: 390px;
-       overflow: auto;
-}
-
-#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options {
-       display: none;
-}
-
-.mceAddSelectValue {
-       background-color: #DDDDDD;
-}
-
-#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 {
-       width: 70px;
-}
-
-#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume {
-       width: 70px;
-}
-
-#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks {
-       width: 70px;
-}
-
-#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle {
-       width: 90px;
-}
-
-#qt_qtsrc {
-       width: 200px;
-}
+#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
index f0cbaee788e7c01170495b8d409619244c86e15e..4591be7a475a69807c3eefba445c51fdb7e0e33e 100644 (file)
@@ -1 +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}pl.src=tinyMCE.convertURL(pl.src,null,true);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+"'");pl.src=tinyMCE.convertURL(pl.src,null,true);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
+(function(){var each=tinymce.each;tinymce.create('tinymce.plugins.MediaPlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;function isMediaElm(n){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);};ed.addCommand('mceMedia',function(){ed.windowManager.open({file:url+'/media.htm',width:430+parseInt(ed.getLang('media.delta_width',0)),height:470+parseInt(ed.getLang('media.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('media',{title:'media.desc',cmd:'mceMedia'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('media',n.nodeName=='IMG'&&isMediaElm(n));});ed.onInit.add(function(){var lo={mceItemFlash:'flash',mceItemShockWave:'shockwave',mceItemWindowsMedia:'windowsmedia',mceItemQuickTime:'quicktime',mceItemRealMedia:'realmedia'};if(ed.settings.content_css!==false)ed.dom.loadCSS(url+"/css/content.css");if(ed.theme.onResolveName){ed.theme.onResolveName.add(function(th,o){if(o.name=='img'){each(lo,function(v,k){if(ed.dom.hasClass(o.node,k)){o.name=v;o.title=ed.dom.getAttrib(o.node,'title');return false;}});}});}if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){if(e.nodeName=='IMG'&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)){m.add({title:'media.edit',icon:'media',cmd:'mceMedia'});}});}});ed.onBeforeSetContent.add(function(ed,o){var h=o.content;h=h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(a,b,c){var o=t._parse(c);return'<img class="mceItem'+b+'" title="'+ed.dom.encode(c)+'" src="'+url+'/img/trans.gif" width="'+o.width+'" height="'+o.height+'" />'});h=h.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');h=h.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');h=h.replace(/<\/(object|embed)([^>]*)>/gi,'</span>');h=h.replace(/<param([^>]*)>/gi,function(a,b){return'<span '+b.replace(/value=/gi,'_value=')+' class="mceItemParam"></span>'});h=h.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');o.content=h;});ed.onSetContent.add(function(){t._spansToImgs(ed.getBody());});ed.onPreProcess.add(function(ed,o){var dom=ed.dom;if(o.set){t._spansToImgs(o.node);each(dom.select('IMG',o.node),function(n){var p;if(isMediaElm(n)){p=t._parse(n.title);dom.setAttrib(n,'width',dom.getAttrib(n,'width',p.width||100));dom.setAttrib(n,'height',dom.getAttrib(n,'height',p.height||100));}});}if(o.get){each(dom.select('IMG',o.node),function(n){var ci,cb,mt;if(ed.getParam('media_use_script')){if(isMediaElm(n))n.className=n.className.replace(/mceItem/g,'mceTemp');return;}switch(n.className){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=ed.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(ci){dom.replace(t._buildObj({classid:ci,codebase:cb,type:mt},n),n);}});}});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/_value=/g,'value=');});if(ed.getParam('media_use_script')){function getAttr(s,n){n=new RegExp(n+'=\"([^\"]+)\"','g').exec(s);return n?ed.dom.decode(n[1]):'';};ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<img[^>]+>/g,function(im){var cl=getAttr(im,'class');if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)){at=t._parse(getAttr(im,'title'));at.width=getAttr(im,'width');at.height=getAttr(im,'height');im='<script type="text/javascript">write'+cl.substring(7)+'({'+t._serialize(at)+'});</script>';}return im;});});}},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};},_buildObj:function(o,n){var ob,ed=this.editor,dom=ed.dom,p=this._parse(n.title);p.width=o.width=dom.getAttrib(n,'width')||100;p.height=o.height=dom.getAttrib(n,'height')||100;ob=dom.create('span',{mce_name:'object',classid:"clsid:"+o.classid,codebase:o.codebase,width:o.width,height:o.height});if(p.src)p.src=ed.convertURL(p.src,'src',n);each(p,function(v,k){if(!/^(width|height|codebase|classid)$/.test(k)){if(o.type=='application/x-mplayer2'&&k=='src')k='url';dom.add(ob,'span',{mce_name:'param',name:k,'_value':v});}});dom.add(ob,'span',tinymce.extend({mce_name:'embed',type:o.type},p));return ob;},_spansToImgs:function(p){var t=this,dom=t.editor.dom,im,ci;each(dom.select('span',p),function(n){if(dom.getAttrib(n,'class')=='mceItemObject'){ci=dom.getAttrib(n,"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':dom.replace(t._createImg('mceItemFlash',n),n);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}return;}if(dom.getAttrib(n,'class')=='mceItemEmbed'){switch(dom.getAttrib(n,'type')){case'application/x-shockwave-flash':dom.replace(t._createImg('mceItemFlash',n),n);break;case'application/x-director':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'application/x-mplayer2':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'video/quicktime':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'audio/x-pn-realaudio-plugin':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}}});},_createImg:function(cl,n){var im,dom=this.editor.dom,pa={},ti='';im=dom.create('img',{src:this.url+'/img/trans.gif',width:dom.getAttrib(n,'width')||100,height:dom.getAttrib(n,'height')||100,'class':cl});each(['id','name','width','height','bgcolor','align','flashvars','src','wmode'],function(na){var v=dom.getAttrib(n,na);if(v)pa[na]=v;});each(dom.select('span',n),function(n){if(dom.hasClass(n,'mceItemParam'))pa[dom.getAttrib(n,'name')]=dom.getAttrib(n,'_value');});if(pa.movie){pa.src=pa.movie;delete pa.movie;}delete pa.width;delete pa.height;im.title=this._serialize(pa);return im;},_parse:function(s){return tinymce.util.JSON.parse('{'+s+'}');},_serialize:function(o){return tinymce.util.JSON.serialize(o).replace(/[{}]/g,'');}});tinymce.PluginManager.add('media',tinymce.plugins.MediaPlugin);})();
\ No newline at end of file
index ee7e13427b447a298c970a8a5d25e7f8f6011ee7..d9df5b53454cdf699f1dc2f2e7f2dba4b95a04f1 100644 (file)
-/**
- * $Id: editor_plugin_src.js 296 2007-08-21 10:36:35Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/* Import plugin specific language pack */
-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) {
-               // Warn if user has flash plugin and media plugin at the same time
-               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) {
-               // Handle commands
-               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;
-          }
-
-          // Pass to next handler in chain
-          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[i].align = nl[i].title.replace(/.*align:([a-z]+).*/gi, '$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;
-                                       }
-                               }
-
-                               // Handle embed (if any)
-                               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));
-
-                                       // Is not flash, skip it
-                                       if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))
-                                               continue;
-
-                                       endPos += 2;
-
-                                       // Parse attributes
-                                       at = attribs['title'];
-                                       if (at) {
-                                               at = at.replace(/&(#39|apos);/g, "'");
-                                               at = at.replace(/&#quot;/g, '"');
-
-                                               try {
-                                                       pl = eval('x={' + at + '};');
-                                               } catch (ex) {
-                                                       pl = {};
-                                               }
-                                       }
-
-                                       // Use object/embed
-                                       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;
-                                               }
-
-                                               // Convert the URL
-                                               pl.src = tinyMCE.convertURL(pl.src, null, true);
-
-                                               embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs);
-                                       } else {
-                                               // Use script version
-                                               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 + "'");
-
-                                               // Force absolute URL
-                                               pl.src = tinyMCE.convertURL(pl.src, null, true);
-                                               at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'");
-
-                                               embedHTML = '<script type="text/javascript">' + s + '({' + at + '});</script>';
-                                       }
-
-                                       // Insert embed/object chunk
-                                       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] + '" />';
-
-                               // Add extra url parameter if it's an absolute URL on WMP
-                               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;
-
-                       // Skip url parameter for embed tag on WMP
-                       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);
+/**\r
+ * $Id: editor_plugin_src.js 763 2008-04-03 13:25:45Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.plugins.MediaPlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+                       \r
+                       t.editor = ed;\r
+                       t.url = url;\r
+\r
+                       function isMediaElm(n) {\r
+                               return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);\r
+                       };\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceMedia', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/media.htm',\r
+                                       width : 430 + parseInt(ed.getLang('media.delta_width', 0)),\r
+                                       height : 470 + parseInt(ed.getLang('media.delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               cm.setActive('media', n.nodeName == 'IMG' && isMediaElm(n));\r
+                       });\r
+\r
+                       ed.onInit.add(function() {\r
+                               var lo = {\r
+                                       mceItemFlash : 'flash',\r
+                                       mceItemShockWave : 'shockwave',\r
+                                       mceItemWindowsMedia : 'windowsmedia',\r
+                                       mceItemQuickTime : 'quicktime',\r
+                                       mceItemRealMedia : 'realmedia'\r
+                               };\r
+\r
+                               if (ed.settings.content_css !== false)\r
+                                       ed.dom.loadCSS(url + "/css/content.css");\r
+\r
+                               if (ed.theme.onResolveName) {\r
+                                       ed.theme.onResolveName.add(function(th, o) {\r
+                                               if (o.name == 'img') {\r
+                                                       each(lo, function(v, k) {\r
+                                                               if (ed.dom.hasClass(o.node, k)) {\r
+                                                                       o.name = v;\r
+                                                                       o.title = ed.dom.getAttrib(o.node, 'title');\r
+                                                                       return false;\r
+                                                               }\r
+                                                       });\r
+                                               }\r
+                                       });\r
+                               }\r
+\r
+                               if (ed && ed.plugins.contextmenu) {\r
+                                       ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {\r
+                                               if (e.nodeName == 'IMG' && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)) {\r
+                                                       m.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});\r
+                                               }\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       ed.onBeforeSetContent.add(function(ed, o) {\r
+                               var h = o.content;\r
+\r
+                               h = h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) {\r
+                                       var o = t._parse(c);\r
+\r
+                                       return '<img class="mceItem' + b + '" title="' + ed.dom.encode(c) + '" src="' + url + '/img/trans.gif" width="' + o.width + '" height="' + o.height + '" />'\r
+                               });\r
+\r
+                               h = h.replace(/<object([^>]*)>/gi, '<span class="mceItemObject" $1>');\r
+                               h = h.replace(/<embed([^>]*)>/gi, '<span class="mceItemEmbed" $1>');\r
+                               h = h.replace(/<\/(object|embed)([^>]*)>/gi, '</span>');\r
+                               h = h.replace(/<param([^>]*)>/gi, function(a, b) {return '<span ' + b.replace(/value=/gi, '_value=') + ' class="mceItemParam"></span>'});\r
+                               h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam"></span>');\r
+\r
+                               o.content = h;\r
+                       });\r
+\r
+                       ed.onSetContent.add(function() {\r
+                               t._spansToImgs(ed.getBody());\r
+                       });\r
+\r
+                       ed.onPreProcess.add(function(ed, o) {\r
+                               var dom = ed.dom;\r
+\r
+                               if (o.set) {\r
+                                       t._spansToImgs(o.node);\r
+\r
+                                       each(dom.select('IMG', o.node), function(n) {\r
+                                               var p;\r
+\r
+                                               if (isMediaElm(n)) {\r
+                                                       p = t._parse(n.title);\r
+                                                       dom.setAttrib(n, 'width', dom.getAttrib(n, 'width', p.width || 100));\r
+                                                       dom.setAttrib(n, 'height', dom.getAttrib(n, 'height', p.height || 100));\r
+                                               }\r
+                                       });\r
+                               }\r
+\r
+                               if (o.get) {\r
+                                       each(dom.select('IMG', o.node), function(n) {\r
+                                               var ci, cb, mt;\r
+\r
+                                               if (ed.getParam('media_use_script')) {\r
+                                                       if (isMediaElm(n))\r
+                                                               n.className = n.className.replace(/mceItem/g, 'mceTemp');\r
+\r
+                                                       return;\r
+                                               }\r
+\r
+                                               switch (n.className) {\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 = ed.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
+                                               if (ci) {\r
+                                                       dom.replace(t._buildObj({\r
+                                                               classid : ci,\r
+                                                               codebase : cb,\r
+                                                               type : mt\r
+                                                       }, n), n);\r
+                                               }\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       ed.onPostProcess.add(function(ed, o) {\r
+                               o.content = o.content.replace(/_value=/g, 'value=');\r
+                       });\r
+\r
+                       if (ed.getParam('media_use_script')) {\r
+                               function getAttr(s, n) {\r
+                                       n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s);\r
+\r
+                                       return n ? ed.dom.decode(n[1]) : '';\r
+                               };\r
+\r
+                               ed.onPostProcess.add(function(ed, o) {\r
+                                       o.content = o.content.replace(/<img[^>]+>/g, function(im) {\r
+                                               var cl = getAttr(im, 'class');\r
+\r
+                                               if (/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)) {\r
+                                                       at = t._parse(getAttr(im, 'title'));\r
+                                                       at.width = getAttr(im, 'width');\r
+                                                       at.height = getAttr(im, 'height');\r
+                                                       im = '<script type="text/javascript">write' + cl.substring(7) + '({' + t._serialize(at) + '});</script>';\r
+                                               }\r
+\r
+                                               return im;\r
+                                       });\r
+                               });\r
+                       }\r
+               },\r
+\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
+               // Private methods\r
+\r
+               _buildObj : function(o, n) {\r
+                       var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title);\r
+\r
+                       p.width = o.width = dom.getAttrib(n, 'width') || 100;\r
+                       p.height = o.height = dom.getAttrib(n, 'height') || 100;\r
+\r
+                       ob = dom.create('span', {\r
+                               mce_name : 'object',\r
+                               classid : "clsid:" + o.classid,\r
+                               codebase : o.codebase,\r
+                               width : o.width,\r
+                               height : o.height\r
+                       });\r
+\r
+                       if (p.src)\r
+                               p.src = ed.convertURL(p.src, 'src', n);\r
+\r
+                       each (p, function(v, k) {\r
+                               if (!/^(width|height|codebase|classid)$/.test(k)) {\r
+                                       // Use url instead of src in IE for Windows media\r
+                                       if (o.type == 'application/x-mplayer2' && k == 'src')\r
+                                               k = 'url';\r
+\r
+                                       dom.add(ob, 'span', {mce_name : 'param', name : k, '_value' : v});\r
+                               }\r
+                       });\r
+\r
+                       dom.add(ob, 'span', tinymce.extend({mce_name : 'embed', type : o.type}, p));\r
+\r
+                       return ob;\r
+               },\r
+\r
+               _spansToImgs : function(p) {\r
+                       var t = this, dom = t.editor.dom, im, ci;\r
+\r
+                       each(dom.select('span', p), function(n) {\r
+                               // Convert object into image\r
+                               if (dom.getAttrib(n, 'class') == 'mceItemObject') {\r
+                                       ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, '');\r
+\r
+                                       switch (ci) {\r
+                                               case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':\r
+                                                       dom.replace(t._createImg('mceItemFlash', n), n);\r
+                                                       break;\r
+\r
+                                               case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':\r
+                                                       dom.replace(t._createImg('mceItemShockWave', n), n);\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
+                                                       dom.replace(t._createImg('mceItemWindowsMedia', n), n);\r
+                                                       break;\r
+\r
+                                               case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':\r
+                                                       dom.replace(t._createImg('mceItemQuickTime', n), n);\r
+                                                       break;\r
+\r
+                                               case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':\r
+                                                       dom.replace(t._createImg('mceItemRealMedia', n), n);\r
+                                                       break;\r
+\r
+                                               default:\r
+                                                       dom.replace(t._createImg('mceItemFlash', n), n);\r
+                                       }\r
+                                       \r
+                                       return;\r
+                               }\r
+\r
+                               // Convert embed into image\r
+                               if (dom.getAttrib(n, 'class') == 'mceItemEmbed') {\r
+                                       switch (dom.getAttrib(n, 'type')) {\r
+                                               case 'application/x-shockwave-flash':\r
+                                                       dom.replace(t._createImg('mceItemFlash', n), n);\r
+                                                       break;\r
+\r
+                                               case 'application/x-director':\r
+                                                       dom.replace(t._createImg('mceItemShockWave', n), n);\r
+                                                       break;\r
+\r
+                                               case 'application/x-mplayer2':\r
+                                                       dom.replace(t._createImg('mceItemWindowsMedia', n), n);\r
+                                                       break;\r
+\r
+                                               case 'video/quicktime':\r
+                                                       dom.replace(t._createImg('mceItemQuickTime', n), n);\r
+                                                       break;\r
+\r
+                                               case 'audio/x-pn-realaudio-plugin':\r
+                                                       dom.replace(t._createImg('mceItemRealMedia', n), n);\r
+                                                       break;\r
+\r
+                                               default:\r
+                                                       dom.replace(t._createImg('mceItemFlash', n), n);\r
+                                       }\r
+                               }                       \r
+                       });\r
+               },\r
+\r
+               _createImg : function(cl, n) {\r
+                       var im, dom = this.editor.dom, pa = {}, ti = '';\r
+\r
+                       // Create image\r
+                       im = dom.create('img', {\r
+                               src : this.url + '/img/trans.gif',\r
+                               width : dom.getAttrib(n, 'width') || 100,\r
+                               height : dom.getAttrib(n, 'height') || 100,\r
+                               'class' : cl\r
+                       });\r
+\r
+                       // Setup base parameters\r
+                       each(['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode'], function(na) {\r
+                               var v = dom.getAttrib(n, na);\r
+\r
+                               if (v)\r
+                                       pa[na] = v;\r
+                       });\r
+\r
+                       // Add optional parameters\r
+                       each(dom.select('span', n), function(n) {\r
+                               if (dom.hasClass(n, 'mceItemParam'))\r
+                                       pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_value');\r
+                       });\r
+\r
+                       // Use src not movie\r
+                       if (pa.movie) {\r
+                               pa.src = pa.movie;\r
+                               delete pa.movie;\r
+                       }\r
+\r
+                       delete pa.width;\r
+                       delete pa.height;\r
+\r
+                       im.title = this._serialize(pa);\r
+\r
+                       return im;\r
+               },\r
+\r
+               _parse : function(s) {\r
+                       return tinymce.util.JSON.parse('{' + s + '}');\r
+               },\r
+\r
+               _serialize : function(o) {\r
+                       return tinymce.util.JSON.serialize(o).replace(/[{}]/g, '');\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/images/flash.gif b/program/js/tiny_mce/plugins/media/images/flash.gif
deleted file mode 100644 (file)
index cb192e6..0000000
Binary files a/program/js/tiny_mce/plugins/media/images/flash.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/media/images/media.gif b/program/js/tiny_mce/plugins/media/images/media.gif
deleted file mode 100644 (file)
index 856df52..0000000
Binary files a/program/js/tiny_mce/plugins/media/images/media.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/media/images/quicktime.gif b/program/js/tiny_mce/plugins/media/images/quicktime.gif
deleted file mode 100644 (file)
index 3b04991..0000000
Binary files a/program/js/tiny_mce/plugins/media/images/quicktime.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/media/images/realmedia.gif b/program/js/tiny_mce/plugins/media/images/realmedia.gif
deleted file mode 100644 (file)
index fdfe0b9..0000000
Binary files a/program/js/tiny_mce/plugins/media/images/realmedia.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/media/images/shockwave.gif b/program/js/tiny_mce/plugins/media/images/shockwave.gif
deleted file mode 100644 (file)
index 5f235df..0000000
Binary files a/program/js/tiny_mce/plugins/media/images/shockwave.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/media/images/windowsmedia.gif b/program/js/tiny_mce/plugins/media/images/windowsmedia.gif
deleted file mode 100644 (file)
index ab50f2d..0000000
Binary files a/program/js/tiny_mce/plugins/media/images/windowsmedia.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/media/img/flash.gif b/program/js/tiny_mce/plugins/media/img/flash.gif
new file mode 100644 (file)
index 0000000..cb192e6
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/flash.gif differ
diff --git a/program/js/tiny_mce/plugins/media/img/flv_player.swf b/program/js/tiny_mce/plugins/media/img/flv_player.swf
new file mode 100644 (file)
index 0000000..042c2ab
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/flv_player.swf differ
diff --git a/program/js/tiny_mce/plugins/media/img/quicktime.gif b/program/js/tiny_mce/plugins/media/img/quicktime.gif
new file mode 100644 (file)
index 0000000..3b04991
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/quicktime.gif differ
diff --git a/program/js/tiny_mce/plugins/media/img/realmedia.gif b/program/js/tiny_mce/plugins/media/img/realmedia.gif
new file mode 100644 (file)
index 0000000..fdfe0b9
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/realmedia.gif differ
diff --git a/program/js/tiny_mce/plugins/media/img/shockwave.gif b/program/js/tiny_mce/plugins/media/img/shockwave.gif
new file mode 100644 (file)
index 0000000..5f235df
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/shockwave.gif differ
diff --git a/program/js/tiny_mce/plugins/media/img/trans.gif b/program/js/tiny_mce/plugins/media/img/trans.gif
new file mode 100644 (file)
index 0000000..3884865
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/trans.gif differ
diff --git a/program/js/tiny_mce/plugins/media/img/windowsmedia.gif b/program/js/tiny_mce/plugins/media/img/windowsmedia.gif
new file mode 100644 (file)
index 0000000..ab50f2d
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/img/windowsmedia.gif differ
diff --git a/program/js/tiny_mce/plugins/media/js/embed.js b/program/js/tiny_mce/plugins/media/js/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/js/media.js b/program/js/tiny_mce/plugins/media/js/media.js
new file mode 100644 (file)
index 0000000..2877d16
--- /dev/null
@@ -0,0 +1,621 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var oldWidth, oldHeight, ed, url;\r
+\r
+if (url = tinyMCEPopup.getParam("media_external_list_url"))\r
+       document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');\r
+\r
+function init() {\r
+       var pl = "", f, val;\r
+       var type = "flash", fe, i;\r
+\r
+       ed = tinyMCEPopup.editor;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       f = document.forms[0]\r
+\r
+       fe = ed.selection.getNode();\r
+       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {\r
+               pl = fe.title;\r
+\r
+               switch (ed.dom.getAttrib(fe, 'class')) {\r
+                       case 'mceItemFlash':\r
+                               type = 'flash';\r
+                               break;\r
+\r
+                       case 'mceItemFlashVideo':\r
+                               type = 'flv';\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 = ed.getLang('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('medialist','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('filebrowser'))\r
+               document.getElementById('src').style.width = '230px';\r
+\r
+       // Setup form\r
+       if (pl != "") {\r
+               pl = tinyMCEPopup.editor.plugins.media._parse(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 = ed.dom.getAttrib(fe, "width")) != "")\r
+                       pl.width = f.width.value = val;\r
+\r
+               if ((val = ed.dom.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
+       tinyMCEPopup.restoreSelection();\r
+\r
+       if (!AutoValidator.validate(f)) {\r
+               alert(ed.getLang('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 = ed.selection.getNode();\r
+       if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.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 "flv":\r
+                               fe.className = "mceItemFlashVideo";\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
+                       ed.execCommand('mceRepaint');\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="' + tinyMCEPopup.getWindowArg("plugin_url") + '/img/trans.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 "flv":\r
+                               h += ' class="mceItemFlashVideo"';\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
+               ed.execCommand('mceInsertContent', false, h);\r
+       }\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function updatePreview() {\r
+       var f = document.forms[0], type;\r
+\r
+       f.width.value = f.width.value || '320';\r
+       f.height.value = f.height.value || '240';\r
+\r
+       type = getType(f.src.value);\r
+       selectByValue(f, 'media_type', type);\r
+       changedType(type);\r
+       generatePreview();\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" onchange="this.form.src.value=this.options[this.selectedIndex].value;updatePreview();">';\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 = ed.getParam("media_types", "flash=swf;flv=flv;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.match(/watch\?v=(.+)(.*)/)) {\r
+               f.width.value = '425';\r
+               f.height.value = '350';\r
+               f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1];\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(ed.getLang("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('flv_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
+       if (n == 'src')\r
+               v = tinyMCEPopup.editor.convertURL(v, 'src', null);\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 = ed.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 = tinyMCEPopup.editor.plugins.media._parse(pl);\r
+\r
+       if (!pl.src) {\r
+               p.innerHTML = '';\r
+               return;\r
+       }\r
+\r
+       pl.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(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
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/media/jscripts/embed.js b/program/js/tiny_mce/plugins/media/jscripts/embed.js
deleted file mode 100644 (file)
index 6fe25de..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.
- */
-
-function writeFlash(p) {
-       writeEmbed(
-               'D27CDB6E-AE6D-11cf-96B8-444553540000',
-               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
-               'application/x-shockwave-flash',
-               p
-       );
-}
-
-function writeShockWave(p) {
-       writeEmbed(
-       '166B1BCA-3F9C-11CF-8075-444553540000',
-       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
-       'application/x-director',
-               p
-       );
-}
-
-function writeQuickTime(p) {
-       writeEmbed(
-               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
-               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
-               'video/quicktime',
-               p
-       );
-}
-
-function writeRealMedia(p) {
-       writeEmbed(
-               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
-               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
-               'audio/x-pn-realaudio-plugin',
-               p
-       );
-}
-
-function writeWindowsMedia(p) {
-       p.url = p.src;
-       writeEmbed(
-               '6BF52A52-394A-11D3-B153-00C04F79FAA6',
-               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
-               'application/x-mplayer2',
-               p
-       );
-}
-
-function writeEmbed(cls, cb, mt, p) {
-       var h = '', n;
-
-       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)
-               h += '<param name="' + n + '" value="' + p[n] + '">';
-
-       h += '<embed type="' + mt + '"';
-
-       for (n in p)
-               h += n + '="' + p[n] + '" ';
-
-       h += '></embed></object>';
-
-       document.write(h);
-}
diff --git a/program/js/tiny_mce/plugins/media/jscripts/media.js b/program/js/tiny_mce/plugins/media/jscripts/media.js
deleted file mode 100644 (file)
index 2b9a4f0..0000000
+++ /dev/null
@@ -1,594 +0,0 @@
-var oldWidth, oldHeight;
-var url = tinyMCE.getParam("media_external_list_url");
-if (url != null) {
-       // Fix relative
-       if (url.charAt(0) != '/' && url.indexOf('://') == -1)
-               url = tinyMCE.documentBasePath + "/" + url;
-
-       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
-}
-
-function init() {
-       var pl = "", f, val;
-       var type = "flash", fe, i;
-
-       tinyMCEPopup.resizeToInnerSize();
-       f = document.forms[0]
-
-       fe = tinyMCE.selectedInstance.getFocusElement();
-       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {
-               pl = "x={" + fe.title + "};";
-
-               switch (tinyMCE.getAttrib(fe, 'class')) {
-                       case 'mceItemFlash':
-                               type = 'flash';
-                               break;
-
-                       case 'mceItemShockWave':
-                               type = 'shockwave';
-                               break;
-
-                       case 'mceItemWindowsMedia':
-                               type = 'wmp';
-                               break;
-
-                       case 'mceItemQuickTime':
-                               type = 'qt';
-                               break;
-
-                       case 'mceItemRealMedia':
-                               type = 'rmp';
-                               break;
-               }
-
-               document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); 
-       }
-
-       document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
-       document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');
-       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
-
-       var html = getMediaListHTML('filebrowser','src','media','media');
-       if (html == "")
-               document.getElementById("linklistrow").style.display = 'none';
-       else
-               document.getElementById("linklistcontainer").innerHTML = html;
-
-       // Resize some elements
-       if (isVisible('filebrowsercontainer'))
-               document.getElementById('src').style.width = '230px';
-
-       // Setup form
-       if (pl != "") {
-               pl = eval(pl);
-
-               switch (type) {
-                       case "flash":
-                               setBool(pl, 'flash', 'play');
-                               setBool(pl, 'flash', 'loop');
-                               setBool(pl, 'flash', 'menu');
-                               setBool(pl, 'flash', 'swliveconnect');
-                               setStr(pl, 'flash', 'quality');
-                               setStr(pl, 'flash', 'scale');
-                               setStr(pl, 'flash', 'salign');
-                               setStr(pl, 'flash', 'wmode');
-                               setStr(pl, 'flash', 'base');
-                               setStr(pl, 'flash', 'flashvars');
-                       break;
-
-                       case "qt":
-                               setBool(pl, 'qt', 'loop');
-                               setBool(pl, 'qt', 'autoplay');
-                               setBool(pl, 'qt', 'cache');
-                               setBool(pl, 'qt', 'controller');
-                               setBool(pl, 'qt', 'correction');
-                               setBool(pl, 'qt', 'enablejavascript');
-                               setBool(pl, 'qt', 'kioskmode');
-                               setBool(pl, 'qt', 'autohref');
-                               setBool(pl, 'qt', 'playeveryframe');
-                               setBool(pl, 'qt', 'tarsetcache');
-                               setStr(pl, 'qt', 'scale');
-                               setStr(pl, 'qt', 'starttime');
-                               setStr(pl, 'qt', 'endtime');
-                               setStr(pl, 'qt', 'tarset');
-                               setStr(pl, 'qt', 'qtsrcchokespeed');
-                               setStr(pl, 'qt', 'volume');
-                               setStr(pl, 'qt', 'qtsrc');
-                       break;
-
-                       case "shockwave":
-                               setBool(pl, 'shockwave', 'sound');
-                               setBool(pl, 'shockwave', 'progress');
-                               setBool(pl, 'shockwave', 'autostart');
-                               setBool(pl, 'shockwave', 'swliveconnect');
-                               setStr(pl, 'shockwave', 'swvolume');
-                               setStr(pl, 'shockwave', 'swstretchstyle');
-                               setStr(pl, 'shockwave', 'swstretchhalign');
-                               setStr(pl, 'shockwave', 'swstretchvalign');
-                       break;
-
-                       case "wmp":
-                               setBool(pl, 'wmp', 'autostart');
-                               setBool(pl, 'wmp', 'enabled');
-                               setBool(pl, 'wmp', 'enablecontextmenu');
-                               setBool(pl, 'wmp', 'fullscreen');
-                               setBool(pl, 'wmp', 'invokeurls');
-                               setBool(pl, 'wmp', 'mute');
-                               setBool(pl, 'wmp', 'stretchtofit');
-                               setBool(pl, 'wmp', 'windowlessvideo');
-                               setStr(pl, 'wmp', 'balance');
-                               setStr(pl, 'wmp', 'baseurl');
-                               setStr(pl, 'wmp', 'captioningid');
-                               setStr(pl, 'wmp', 'currentmarker');
-                               setStr(pl, 'wmp', 'currentposition');
-                               setStr(pl, 'wmp', 'defaultframe');
-                               setStr(pl, 'wmp', 'playcount');
-                               setStr(pl, 'wmp', 'rate');
-                               setStr(pl, 'wmp', 'uimode');
-                               setStr(pl, 'wmp', 'volume');
-                       break;
-
-                       case "rmp":
-                               setBool(pl, 'rmp', 'autostart');
-                               setBool(pl, 'rmp', 'loop');
-                               setBool(pl, 'rmp', 'autogotourl');
-                               setBool(pl, 'rmp', 'center');
-                               setBool(pl, 'rmp', 'imagestatus');
-                               setBool(pl, 'rmp', 'maintainaspect');
-                               setBool(pl, 'rmp', 'nojava');
-                               setBool(pl, 'rmp', 'prefetch');
-                               setBool(pl, 'rmp', 'shuffle');
-                               setStr(pl, 'rmp', 'console');
-                               setStr(pl, 'rmp', 'controls');
-                               setStr(pl, 'rmp', 'numloop');
-                               setStr(pl, 'rmp', 'scriptcallbacks');
-                       break;
-               }
-
-               setStr(pl, null, 'src');
-               setStr(pl, null, 'id');
-               setStr(pl, null, 'name');
-               setStr(pl, null, 'vspace');
-               setStr(pl, null, 'hspace');
-               setStr(pl, null, 'bgcolor');
-               setStr(pl, null, 'align');
-               setStr(pl, null, 'width');
-               setStr(pl, null, 'height');
-
-               if ((val = tinyMCE.getAttrib(fe, "width")) != "")
-                       pl.width = f.width.value = val;
-
-               if ((val = tinyMCE.getAttrib(fe, "height")) != "")
-                       pl.height = f.height.value = val;
-
-               oldWidth = pl.width ? parseInt(pl.width) : 0;
-               oldHeight = pl.height ? parseInt(pl.height) : 0;
-       } else
-               oldWidth = oldHeight = 0;
-
-       selectByValue(f, 'media_type', type);
-       changedType(type);
-       updateColor('bgcolor_pick', 'bgcolor');
-
-       TinyMCE_EditableSelects.init();
-       generatePreview();
-}
-
-function insertMedia() {
-       var fe, f = document.forms[0], h;
-
-       if (!AutoValidator.validate(f)) {
-               alert(tinyMCE.getLang('lang_invalid_data'));
-               return false;
-       }
-
-       f.width.value = f.width.value == "" ? 100 : f.width.value;
-       f.height.value = f.height.value == "" ? 100 : f.height.value;
-
-       fe = tinyMCE.selectedInstance.getFocusElement();
-       if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {
-               switch (f.media_type.options[f.media_type.selectedIndex].value) {
-                       case "flash":
-                               fe.className = "mceItemFlash";
-                               break;
-
-                       case "shockwave":
-                               fe.className = "mceItemShockWave";
-                               break;
-
-                       case "qt":
-                               fe.className = "mceItemQuickTime";
-                               break;
-
-                       case "wmp":
-                               fe.className = "mceItemWindowsMedia";
-                               break;
-
-                       case "rmp":
-                               fe.className = "mceItemRealMedia";
-                               break;
-               }
-
-               if (fe.width != f.width.value || fe.height != f.height.height)
-                       tinyMCE.selectedInstance.repaint();
-
-               fe.title = serializeParameters();
-               fe.width = f.width.value;
-               fe.height = f.height.value;
-               fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');
-               fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');
-               fe.align = f.align.options[f.align.selectedIndex].value;
-       } else {
-               h = '<img src="' + tinyMCE.getParam("theme_href") + '/images/spacer.gif"' ;
-
-               switch (f.media_type.options[f.media_type.selectedIndex].value) {
-                       case "flash":
-                               h += ' class="mceItemFlash"';
-                               break;
-
-                       case "shockwave":
-                               h += ' class="mceItemShockWave"';
-                               break;
-
-                       case "qt":
-                               h += ' class="mceItemQuickTime"';
-                               break;
-
-                       case "wmp":
-                               h += ' class="mceItemWindowsMedia"';
-                               break;
-
-                       case "rmp":
-                               h += ' class="mceItemRealMedia"';
-                               break;
-               }
-
-               h += ' title="' + serializeParameters() + '"';
-               h += ' width="' + f.width.value + '"';
-               h += ' height="' + f.height.value + '"';
-               h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';
-
-               h += ' />';
-
-               tinyMCE.selectedInstance.execCommand('mceInsertContent', false, h);
-       }
-
-       tinyMCEPopup.close();
-}
-
-function getMediaListHTML() {
-       if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {
-               var html = "";
-
-               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;">';
-               html += '<option value="">---</option>';
-
-               for (var i=0; i<tinyMCEMediaList.length; i++)
-                       html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';
-
-               html += '</select>';
-
-               return html;
-       }
-
-       return "";
-}
-
-function getType(v) {
-       var fo, i, c, el, x, f = document.forms[0];
-
-       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(';');
-
-       // YouTube
-       if (v.indexOf('http://www.youtube.com/watch?v=') == 0 || v.indexOf('http://youtube.com/watch?v=') == 0) {
-               f.width.value = '425';
-               f.height.value = '350';
-
-               v = v.replace('http://youtube.com/watch?v=', '');
-               v = v.replace('http://www.youtube.com/watch?v=', '');
-
-               f.src.value = 'http://www.youtube.com/v/' + v;
-               return 'flash';
-       }
-
-       // Google video
-       if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {
-               f.width.value = '425';
-               f.height.value = '326';
-               f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';
-               return 'flash';
-       }
-
-       for (i=0; i<fo.length; i++) {
-               c = fo[i].split('=');
-
-               el = c[1].split(',');
-               for (x=0; x<el.length; x++)
-               if (v.indexOf('.' + el[x]) != -1)
-                       return c[0];
-       }
-
-       return null;
-}
-
-function switchType(v) {
-       var t = getType(v), d = document, f = d.forms[0];
-
-       if (!t)
-               return;
-
-       selectByValue(d.forms[0], 'media_type', t);
-       changedType(t);
-
-       // Update qtsrc also
-       if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {
-               alert(tinyMCE.getLang("lang_media_qt_stream_warn"));
-
-               if (f.qt_qtsrc.value == '')
-                       f.qt_qtsrc.value = f.src.value;
-       }
-}
-
-function changedType(t) {
-       var d = document;
-
-       d.getElementById('flash_options').style.display = 'none';
-       d.getElementById('qt_options').style.display = 'none';
-       d.getElementById('shockwave_options').style.display = 'none';
-       d.getElementById('wmp_options').style.display = 'none';
-       d.getElementById('rmp_options').style.display = 'none';
-       d.getElementById(t + '_options').style.display = 'block';
-}
-
-function serializeParameters() {
-       var d = document, f = d.forms[0], s = '';
-
-       switch (f.media_type.options[f.media_type.selectedIndex].value) {
-               case "flash":
-                       s += getBool('flash', 'play', true);
-                       s += getBool('flash', 'loop', true);
-                       s += getBool('flash', 'menu', true);
-                       s += getBool('flash', 'swliveconnect', false);
-                       s += getStr('flash', 'quality');
-                       s += getStr('flash', 'scale');
-                       s += getStr('flash', 'salign');
-                       s += getStr('flash', 'wmode');
-                       s += getStr('flash', 'base');
-                       s += getStr('flash', 'flashvars');
-               break;
-
-               case "qt":
-                       s += getBool('qt', 'loop', false);
-                       s += getBool('qt', 'autoplay', true);
-                       s += getBool('qt', 'cache', false);
-                       s += getBool('qt', 'controller', true);
-                       s += getBool('qt', 'correction', false, 'none', 'full');
-                       s += getBool('qt', 'enablejavascript', false);
-                       s += getBool('qt', 'kioskmode', false);
-                       s += getBool('qt', 'autohref', false);
-                       s += getBool('qt', 'playeveryframe', false);
-                       s += getBool('qt', 'targetcache', false);
-                       s += getStr('qt', 'scale');
-                       s += getStr('qt', 'starttime');
-                       s += getStr('qt', 'endtime');
-                       s += getStr('qt', 'target');
-                       s += getStr('qt', 'qtsrcchokespeed');
-                       s += getStr('qt', 'volume');
-                       s += getStr('qt', 'qtsrc');
-               break;
-
-               case "shockwave":
-                       s += getBool('shockwave', 'sound');
-                       s += getBool('shockwave', 'progress');
-                       s += getBool('shockwave', 'autostart');
-                       s += getBool('shockwave', 'swliveconnect');
-                       s += getStr('shockwave', 'swvolume');
-                       s += getStr('shockwave', 'swstretchstyle');
-                       s += getStr('shockwave', 'swstretchhalign');
-                       s += getStr('shockwave', 'swstretchvalign');
-               break;
-
-               case "wmp":
-                       s += getBool('wmp', 'autostart', true);
-                       s += getBool('wmp', 'enabled', false);
-                       s += getBool('wmp', 'enablecontextmenu', true);
-                       s += getBool('wmp', 'fullscreen', false);
-                       s += getBool('wmp', 'invokeurls', true);
-                       s += getBool('wmp', 'mute', false);
-                       s += getBool('wmp', 'stretchtofit', false);
-                       s += getBool('wmp', 'windowlessvideo', false);
-                       s += getStr('wmp', 'balance');
-                       s += getStr('wmp', 'baseurl');
-                       s += getStr('wmp', 'captioningid');
-                       s += getStr('wmp', 'currentmarker');
-                       s += getStr('wmp', 'currentposition');
-                       s += getStr('wmp', 'defaultframe');
-                       s += getStr('wmp', 'playcount');
-                       s += getStr('wmp', 'rate');
-                       s += getStr('wmp', 'uimode');
-                       s += getStr('wmp', 'volume');
-               break;
-
-               case "rmp":
-                       s += getBool('rmp', 'autostart', false);
-                       s += getBool('rmp', 'loop', false);
-                       s += getBool('rmp', 'autogotourl', true);
-                       s += getBool('rmp', 'center', false);
-                       s += getBool('rmp', 'imagestatus', true);
-                       s += getBool('rmp', 'maintainaspect', false);
-                       s += getBool('rmp', 'nojava', false);
-                       s += getBool('rmp', 'prefetch', false);
-                       s += getBool('rmp', 'shuffle', false);
-                       s += getStr('rmp', 'console');
-                       s += getStr('rmp', 'controls');
-                       s += getStr('rmp', 'numloop');
-                       s += getStr('rmp', 'scriptcallbacks');
-               break;
-       }
-
-       s += getStr(null, 'id');
-       s += getStr(null, 'name');
-       s += getStr(null, 'src');
-       s += getStr(null, 'align');
-       s += getStr(null, 'bgcolor');
-       s += getInt(null, 'vspace');
-       s += getInt(null, 'hspace');
-       s += getStr(null, 'width');
-       s += getStr(null, 'height');
-
-       s = s.length > 0 ? s.substring(0, s.length - 1) : s;
-
-       return s;
-}
-
-function setBool(pl, p, n) {
-       if (typeof(pl[n]) == "undefined")
-               return;
-
-       document.forms[0].elements[p + "_" + n].checked = pl[n];
-}
-
-function setStr(pl, p, n) {
-       var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];
-
-       if (typeof(pl[n]) == "undefined")
-               return;
-
-       if (e.type == "text")
-               e.value = pl[n];
-       else
-               selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);
-}
-
-function getBool(p, n, d, tv, fv) {
-       var v = document.forms[0].elements[p + "_" + n].checked;
-
-       tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";
-       fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";
-
-       return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ',');
-}
-
-function getStr(p, n, d) {
-       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];
-       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;
-
-       return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");
-}
-
-function getInt(p, n, d) {
-       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];
-       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;
-
-       return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");
-}
-
-function jsEncode(s) {
-       s = s.replace(new RegExp('\\\\', 'g'), '\\\\');
-       s = s.replace(new RegExp('"', 'g'), '\\"');
-       s = s.replace(new RegExp("'", 'g'), "\\'");
-
-       return s;
-}
-
-function generatePreview(c) {
-       var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;
-
-       p.innerHTML = '<!-- x --->';
-
-       nw = parseInt(f.width.value);
-       nh = parseInt(f.height.value);
-
-       if (f.width.value != "" && f.height.value != "") {
-               if (f.constrain.checked) {
-                       if (c == 'width' && oldWidth != 0) {
-                               wp = nw / oldWidth;
-                               nh = Math.round(wp * nh);
-                               f.height.value = nh;
-                       } else if (c == 'height' && oldHeight != 0) {
-                               hp = nh / oldHeight;
-                               nw = Math.round(hp * nw);
-                               f.width.value = nw;
-                       }
-               }
-       }
-
-       if (f.width.value != "")
-               oldWidth = nw;
-
-       if (f.height.value != "")
-               oldHeight = nh;
-
-       // After constrain
-       pl = serializeParameters();
-
-       switch (f.media_type.options[f.media_type.selectedIndex].value) {
-               case "flash":
-                       cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
-                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';
-                       type = 'application/x-shockwave-flash';
-                       break;
-
-               case "shockwave":
-                       cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';
-                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';
-                       type = 'application/x-director';
-                       break;
-
-               case "qt":
-                       cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';
-                       codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';
-                       type = 'video/quicktime';
-                       break;
-
-               case "wmp":
-                       cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';
-                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
-                       type = 'application/x-mplayer2';
-                       break;
-
-               case "rmp":
-                       cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';
-                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
-                       type = 'audio/x-pn-realaudio-plugin';
-                       break;
-       }
-
-       if (pl == '') {
-               p.innerHTML = '';
-               return;
-       }
-
-       pl = eval('x={' + pl + '};');
-
-       if (!pl.src) {
-               p.innerHTML = '';
-               return;
-       }
-
-       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);
-       pl.width = !pl.width ? 100 : pl.width;
-       pl.height = !pl.height ? 100 : pl.height;
-       pl.id = !pl.id ? 'obj' : pl.id;
-       pl.name = !pl.name ? 'eobj' : pl.name;
-       pl.align = !pl.align ? '' : pl.align;
-
-       h += '<object classid="clsid:' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';
-
-       for (n in pl) {
-               h += '<param name="' + n + '" value="' + pl[n] + '">';
-
-               // Add extra url parameter if it's an absolute URL
-               if (n == 'src' && pl[n].indexOf('://') != -1)
-                       h += '<param name="url" value="' + pl[n] + '" />';
-       }
-
-       h += '<embed type="' + type + '" ';
-
-       for (n in pl)
-               h += n + '="' + pl[n] + '" ';
-
-       h += '></embed></object>';
-
-       p.innerHTML = "<!-- x --->" + h;
-}
diff --git a/program/js/tiny_mce/plugins/media/langs/en.js b/program/js/tiny_mce/plugins/media/langs/en.js
deleted file mode 100644 (file)
index 177438d..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-// UK lang variables
-
-tinyMCE.addToLang('media',{
-title : 'Insert / edit embedded media',
-desc : 'Insert / edit embedded media',
-general : 'General',
-advanced : 'Advanced',
-file : 'File/URL',
-list : 'List',
-size : 'Dimensions',
-preview : 'Preview',
-constrain_proportions : 'Constrain proportions',
-type : 'Type',
-id : 'Id',
-name : 'Name',
-class_name : 'Class',
-vspace : 'V-Space',
-hspace : 'H-Space',
-play : 'Auto play',
-loop : 'Loop',
-menu : 'Show menu',
-quality : 'Quality',
-scale : 'Scale',
-align : 'Align',
-salign : 'SAlign',
-wmode : 'WMode',
-bgcolor : 'Background',
-base : 'Base',
-flashvars : 'Flashvars',
-liveconnect : 'SWLiveConnect',
-autohref : 'AutoHREF',
-cache : 'Cache',
-hidden : 'Hidden',
-controller : 'Controller',
-kioskmode : 'Kiosk mode',
-playeveryframe : 'Play every frame',
-targetcache : 'Target cache',
-correction : 'No correction',
-enablejavascript : 'Enable JavaScript',
-starttime : 'Start time',
-endtime : 'End time',
-href : 'Href',
-qtsrcchokespeed : 'Choke speed',
-target : 'Target',
-volume : 'Volume',
-autostart : 'Auto start',
-enabled : 'Enabled',
-fullscreen : 'Fullscreen',
-invokeurls : 'Invoke URLs',
-mute : 'Mute',
-stretchtofit : 'Stretch to fit',
-windowlessvideo : 'Windowless video',
-balance : 'Balance',
-baseurl : 'Base URL',
-captioningid : 'Captioning id',
-currentmarker : 'Current marker',
-currentposition : 'Current position',
-defaultframe : 'Default frame',
-playcount : 'Play count',
-rate : 'Rate',
-uimode : 'UI Mode',
-flash_options : 'Flash options',
-qt_options : 'Quicktime options',
-wmp_options : 'Windows media player options',
-rmp_options : 'Real media player options',
-shockwave_options : 'Shockwave options',
-autogotourl : 'Auto goto URL',
-center : 'Center',
-imagestatus : 'Image status',
-maintainaspect : 'Maintain aspect',
-nojava : 'No java',
-prefetch : 'Prefetch',
-shuffle : 'Shuffle',
-console : 'Console',
-numloop : 'Num loops',
-controls : 'Controls',
-scriptcallbacks : 'Script callbacks',
-swstretchstyle : 'Stretch style',
-swstretchhalign : 'Stretch H-Align',
-swstretchvalign : 'Stretch V-Align',
-sound : 'Sound',
-progress : 'Progress',
-qtsrc : 'QT Src',
-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..',
-align_top : 'Top',
-align_right : 'Right',
-align_bottom : 'Bottom',
-align_left : 'Left',
-align_center : 'Center',
-align_top_left : 'Top left',
-align_top_right : 'Top right',
-align_bottom_left : 'Bottom left',
-align_bottom_right : 'Bottom right'
-});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/en_dlg.js b/program/js/tiny_mce/plugins/media/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..6d0a996
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('en.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index 2b1ef80e3ebd166d3d388221dc485e5f4a165a66..8b3bc1d6b6afa28bf80a2c8111914e8833f99410 100644 (file)
@@ -1,35 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#media_dlg.title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/media.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
        <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
+<body 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
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');generatePreview();" onmousedown="return false;">{#media_dlg.general}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#media_dlg.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
+                                       <legend>{#media_dlg.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><label for="media_type">{#media_dlg.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="flv">Flash video (FLV)</option> -->\r
                                                                                <option value="qt">Quicktime</option>\r
                                                                                <option value="shockwave">Shockwave</option>\r
                                                                                <option value="wmp">Windows Media</option>\r
                                                                </td>\r
                                                        </tr>\r
                                                        <tr>\r
-                                                       <td><label for="src">{$lang_media_file}</label></td>\r
+                                                       <td><label for="src">{#media_dlg.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><input id="src" name="src" type="text" value="" class="mceFocus" 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><label for="linklist">{#media_dlg.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><label for="width">{#media_dlg.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
+                                                                       <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">{#media_dlg.constrain_proportions}</label></td>\r
+                                                                               </tr>\r
+                                                                       </table>\r
+                                                               </td>\r
                                                        </tr>\r
                                        </table>\r
                                </fieldset>\r
 \r
                                <fieldset>\r
-                                       <legend>{$lang_media_preview}</legend>\r
+                                       <legend>{#media_dlg.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
+                                       <legend>{#media_dlg.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><label for="id">{#media_dlg.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><label for="name">{#media_dlg.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><label for="align">{#media_dlg.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
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="top">{#media_dlg.align_top}</option>\r
+                                                                       <option value="right">{#media_dlg.align_right}</option>\r
+                                                                       <option value="bottom">{#media_dlg.align_bottom}</option>\r
+                                                                       <option value="left">{#media_dlg.align_left}</option>\r
                                                                </select>\r
                                                        </td>\r
 \r
-                                                       <td><label for="bgcolor">{$lang_media_bgcolor}</label></td>\r
+                                                       <td><label for="bgcolor">{#media_dlg.bgcolor}</label></td>\r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="vspace">{$lang_media_vspace}</label></td>\r
+                                                       <td><label for="vspace">{#media_dlg.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><label for="hspace">{#media_dlg.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
+                                       <legend>{#media_dlg.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><label for="flash_quality">{#media_dlg.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="">{#not_set}</option> \r
                                                                        <option value="high">high</option>\r
                                                                        <option value="low">low</option>\r
                                                                        <option value="autolow">autolow</option>\r
                                                                </select>\r
                                                        </td>\r
 \r
-                                                       <td><label for="flash_scale">{$lang_media_scale}</label></td>\r
+                                                       <td><label for="flash_scale">{#media_dlg.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="">{#not_set}</option> \r
                                                                        <option value="showall">showall</option>\r
                                                                        <option value="noborder">noborder</option>\r
                                                                        <option value="exactfit">exactfit</option>\r
+                                                                       <option value="noscale">noscale</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="flash_wmode">{$lang_media_wmode}</label></td>\r
+                                                       <td><label for="flash_wmode">{#media_dlg.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="">{#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><label for="flash_salign">{#media_dlg.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
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="l">{#media_dlg.align_left}</option>\r
+                                                                       <option value="t">{#media_dlg.align_top}</option>\r
+                                                                       <option value="r">{#media_dlg.align_right}</option>\r
+                                                                       <option value="b">{#media_dlg.align_bottom}</option>\r
+                                                                       <option value="tl">{#media_dlg.align_top_left}</option>\r
+                                                                       <option value="tr">{#media_dlg.align_top_right}</option>\r
+                                                                       <option value="bl">{#media_dlg.align_bottom_left}</option>\r
+                                                                       <option value="br">{#media_dlg.align_bottom_right}</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\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
+                                                                               <td><label for="flash_play">{#media_dlg.play}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="flash_loop">{#media_dlg.loop}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="flash_menu">{#media_dlg.menu}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\r
 \r
                                        <table>\r
                                                <tr>\r
-                                                       <td><label for="flash_base">{$lang_media_base}</label></td>\r
+                                                       <td><label for="flash_base">{#media_dlg.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><label for="flash_flashvars">{#media_dlg.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="flv_options">\r
+                                       <legend>{#media_dlg.flv_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="flv_scalemode">{#media_dlg.flv_scalemode}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flv_scalemode" name="flv_scalemode" onchange="generatePreview();">\r
+                                                                       <option value="">{#not_set}</option> \r
+                                                                       <option value="none">none</option>\r
+                                                                       <option value="double">double</option>\r
+                                                                       <option value="full">full</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="flv_buffer">{#media_dlg.flv_buffer}</label></td>\r
+                                                       <td><input type="text" id="flv_buffer" name="flv_buffer" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flv_startimage">{#media_dlg.flv_startimage}</label></td>\r
+                                                       <td><input type="text" id="flv_startimage" name="flv_startimage" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>\r
+                                                       <td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flv_defaultvolume">{#media_dlg.flv_defaultvolume}</label></td>\r
+                                                       <td><input type="text" id="flv_defaultvolume" name="flv_defaultvolume" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>\r
+                                                       <td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></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="flv_hiddengui" name="flv_hiddengui" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flv_hiddengui">{#media_dlg.flv_hiddengui}</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="flv_autostart" name="flv_autostart" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flv_autostart">{#media_dlg.flv_autostart}</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="flv_loop" name="flv_loop" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flv_loop">{#media_dlg.flv_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="flv_showscalemodes" name="flv_showscalemodes" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flv_showscalemodes">{#media_dlg.flv_showscalemodes}</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="flv_smoothvideo" name="flash_flv_flv_smoothvideosmoothvideo" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flv_smoothvideo">{#media_dlg.flv_smoothvideo}</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="flv_jscallback" name="flv_jscallback" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flv_jscallback">{#media_dlg.flv_jscallback}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
                                <fieldset id="qt_options">\r
-                                       <legend>{$lang_media_qt_options}</legend>\r
+                                       <legend>{#media_dlg.qt_options}</legend>\r
 \r
                                        <table border="0" cellpadding="4" cellspacing="0">\r
                                                <tr>\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
+                                                                               <td><label for="qt_loop">{#media_dlg.loop}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_autoplay">{#media_dlg.play}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_cache">{#media_dlg.cache}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_controller">{#media_dlg.controller}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_correction">{#media_dlg.correction}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_enablejavascript">{#media_dlg.enablejavascript}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_kioskmode">{#media_dlg.kioskmode}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_autohref">{#media_dlg.autohref}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_playeveryframe">{#media_dlg.playeveryframe}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="qt_targetcache">{#media_dlg.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><label for="qt_scale">{#media_dlg.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="">{#not_set}</option> \r
                                                                        <option value="tofit">tofit</option>\r
                                                                        <option value="aspect">aspect</option>\r
                                                                </select>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="qt_starttime">{$lang_media_starttime}</label></td>\r
+                                                       <td><label for="qt_starttime">{#media_dlg.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><label for="qt_endtime">{#media_dlg.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><label for="qt_target">{#media_dlg.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><label for="qt_href">{#media_dlg.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><label for="qt_qtsrcchokespeed">{#media_dlg.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><label for="qt_volume">{#media_dlg.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><label for="qt_qtsrc">{#media_dlg.qtsrc}</label></td>\r
                                                        <td colspan="4">\r
                                                        <table border="0" cellspacing="0" cellpadding="0">\r
                                                                  <tr>\r
                                </fieldset>\r
 \r
                                <fieldset id="wmp_options">\r
-                                       <legend>{$lang_media_wmp_options}</legend>\r
+                                       <legend>{#media_dlg.wmp_options}</legend>\r
 \r
                                        <table border="0" cellpadding="4" cellspacing="0">\r
                                                <tr>\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
+                                                                               <td><label for="wmp_autostart">{#media_dlg.autostart}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_enabled">{#media_dlg.enabled}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_enablecontextmenu">{#media_dlg.menu}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_fullscreen">{#media_dlg.fullscreen}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_invokeurls">{#media_dlg.invokeurls}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_mute">{#media_dlg.mute}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_stretchtofit">{#media_dlg.stretchtofit}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="wmp_windowlessvideo">{#media_dlg.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><label for="wmp_balance">{#media_dlg.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><label for="wmp_baseurl">{#media_dlg.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><label for="wmp_captioningid">{#media_dlg.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><label for="wmp_currentmarker">{#media_dlg.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><label for="wmp_currentposition">{#media_dlg.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><label for="wmp_defaultframe">{#media_dlg.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><label for="wmp_playcount">{#media_dlg.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><label for="wmp_rate">{#media_dlg.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><label for="wmp_uimode">{#media_dlg.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><label for="wmp_volume">{#media_dlg.volume}</label></td>\r
                                                        <td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td>\r
                                                </tr>\r
 \r
                                </fieldset>\r
 \r
                                <fieldset id="rmp_options">\r
-                                       <legend>{$lang_media_rmp_options}</legend>\r
+                                       <legend>{#media_dlg.rmp_options}</legend>\r
 \r
                                        <table border="0" cellpadding="4" cellspacing="0">\r
                                                <tr>\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
+                                                                               <td><label for="rmp_autostart">{#media_dlg.autostart}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_loop">{#media_dlg.loop}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_autogotourl">{#media_dlg.autogotourl}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_center">{#media_dlg.center}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_imagestatus">{#media_dlg.imagestatus}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_maintainaspect">{#media_dlg.maintainaspect}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_nojava">{#media_dlg.nojava}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_prefetch">{#media_dlg.prefetch}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="rmp_shuffle">{#media_dlg.shuffle}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="rmp_console">{$lang_media_console}</label></td>\r
+                                                       <td><label for="rmp_console">{#media_dlg.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><label for="rmp_controls">{#media_dlg.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><label for="rmp_numloop">{#media_dlg.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><label for="rmp_scriptcallbacks">{#media_dlg.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
+                                       <legend>{#media_dlg.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><label for="shockwave_swstretchstyle">{#media_dlg.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="none">{#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><label for="shockwave_swvolume">{#media_dlg.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><label for="shockwave_swstretchhalign">{#media_dlg.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
+                                                                       <option value="none">{#not_set}</option>\r
+                                                                       <option value="left">{#media_dlg.align_left}</option>\r
+                                                                       <option value="center">{#media_dlg.align_center}</option>\r
+                                                                       <option value="right">{#media_dlg.align_right}</option>\r
                                                                </select>\r
                                                        </td>\r
 \r
-                                                       <td><label for="shockwave_swstretchvalign">{$lang_media_swstretchvalign}</label></td>\r
+                                                       <td><label for="shockwave_swstretchvalign">{#media_dlg.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="none">{#not_set}</option>\r
                                                                        <option value="meet">Meet</option>\r
                                                                        <option value="fill">Fill</option>\r
                                                                        <option value="stage">Stage</option>\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
+                                                                               <td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="shockwave_sound">{#media_dlg.sound}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\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
+                                                                               <td><label for="shockwave_progress">{#media_dlg.progress}</label></td>\r
                                                                        </tr>\r
                                                                </table>\r
                                                        </td>\r
 \r
                <div class="mceActionPanel">\r
                        <div style="float: left">\r
-                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertMedia();" />\r
+                               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
                        </div>\r
 \r
                        <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                        </div>\r
                </div>\r
        </form>\r
index 5b1279720aa052267e14b59fea40e14e18070076..4fce503c15f747d0ed84affb629f3737a85dbd94 100644 (file)
@@ -1 +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
+(function(){tinymce.create('tinymce.plugins.Nonbreaking',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceNonBreaking',function(){ed.execCommand('mceInsertContent',false,(ed.plugins.visualchars&&ed.plugins.visualchars.state)?'<span class="mceItemHidden mceVisualNbsp">&middot;</span>':'&nbsp;');});ed.addButton('nonbreaking',{title:'nonbreaking.nonbreaking_desc',cmd:'mceNonBreaking'});if(ed.getParam('nonbreaking_force_tab')){ed.onKeyDown.add(function(ed,e){if(tinymce.isIE&&e.keyCode==9){ed.execCommand('mceNonBreaking');ed.execCommand('mceNonBreaking');ed.execCommand('mceNonBreaking');tinymce.dom.Event.cancel(e);}});}},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};}});tinymce.PluginManager.add('nonbreaking',tinymce.plugins.Nonbreaking);})();
\ No newline at end of file
index 73d547855f4ccbf5da779894edb0ee5ec8105d1b..b72375660c317531a795b8c070c86a9c6516b4fa 100644 (file)
@@ -1,62 +1,50 @@
 /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\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
+ * @copyright Copyright © 2004-2008, 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
+(function() {\r
+       tinymce.create('tinymce.plugins.Nonbreaking', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceNonBreaking', function() {\r
+                               ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? '<span class="mceItemHidden mceVisualNbsp">&middot;</span>' : '&nbsp;');\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'});\r
+\r
+                       if (ed.getParam('nonbreaking_force_tab')) {\r
+                               ed.onKeyDown.add(function(ed, e) {\r
+                                       if (tinymce.isIE && e.keyCode == 9) {\r
+                                               ed.execCommand('mceNonBreaking');\r
+                                               ed.execCommand('mceNonBreaking');\r
+                                               ed.execCommand('mceNonBreaking');\r
+                                               tinymce.dom.Event.cancel(e);\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\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
-               return "";\r
-       },\r
+               // Private methods\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
+       // Register plugin\r
+       tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif b/program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif
deleted file mode 100644 (file)
index a731fc9..0000000
Binary files a/program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/nonbreaking/langs/en.js b/program/js/tiny_mce/plugins/nonbreaking/langs/en.js
deleted file mode 100644 (file)
index fd49a64..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// 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/paste/blank.htm b/program/js/tiny_mce/plugins/paste/blank.htm
new file mode 100644 (file)
index 0000000..7ba26bd
--- /dev/null
@@ -0,0 +1,22 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<title>blank_page</title>\r
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+<link href="css/blank.css" rel="stylesheet" type="text/css" />\r
+<base target="_self" />\r
+<script type="text/javascript">\r
+function init() {\r
+       if (parent.tinymce.isIE)\r
+               document.body.contentEditable = true;\r
+       else\r
+               document.designMode = 'on';\r
+\r
+       parent.initIframe(document);\r
+       window.focus();\r
+}\r
+</script>\r
+</head>\r
+<body onload="init();">\r
+\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/paste/css/blank.css b/program/js/tiny_mce/plugins/paste/css/blank.css
new file mode 100644 (file)
index 0000000..6b16bac
--- /dev/null
@@ -0,0 +1,14 @@
+html, body {height:98%}\r
+body {\r
+background-color: #FFFFFF;\r
+font-family: Verdana, Arial, Helvetica, sans-serif;\r
+font-size: 10px;\r
+scrollbar-3dlight-color: #F0F0EE;\r
+scrollbar-arrow-color: #676662;\r
+scrollbar-base-color: #F0F0EE;\r
+scrollbar-darkshadow-color: #DDDDDD;\r
+scrollbar-face-color: #E0E0DD;\r
+scrollbar-highlight-color: #F0F0EE;\r
+scrollbar-shadow-color: #F0F0EE;\r
+scrollbar-track-color: #F5F5F5;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/paste/css/pasteword.css b/program/js/tiny_mce/plugins/paste/css/pasteword.css
new file mode 100644 (file)
index 0000000..b3be627
--- /dev/null
@@ -0,0 +1,3 @@
+.sourceIframe {\r
+       border: 1px solid #808080;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/paste/editor_plugin.js b/program/js/tiny_mce/plugins/paste/editor_plugin.js
new file mode 100644 (file)
index 0000000..b317ed2
--- /dev/null
@@ -0,0 +1 @@
+(function(){var Event=tinymce.dom.Event;tinymce.create('tinymce.plugins.PastePlugin',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mcePasteText',function(ui,v){if(ui){if((ed.getParam('paste_use_dialog',true))||(!tinymce.isIE)){ed.windowManager.open({file:url+'/pastetext.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(clipboardData.getData("Text"),true);}else t._insertText(v.html,v.linebreaks);});ed.addCommand('mcePasteWord',function(ui,v){if(ui){if((ed.getParam('paste_use_dialog',true))||(!tinymce.isIE)){ed.windowManager.open({file:url+'/pasteword.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(t._clipboardHTML());}else t._insertWordContent(v);});ed.addCommand('mceSelectAll',function(){ed.execCommand('selectall');});ed.addButton('pastetext',{title:'paste.paste_text_desc',cmd:'mcePasteText',ui:true});ed.addButton('pasteword',{title:'paste.paste_word_desc',cmd:'mcePasteWord',ui:true});ed.addButton('selectall',{title:'paste.selectall_desc',cmd:'mceSelectAll'});if(ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onPaste.add(function(ed,e){return t._handlePasteEvent(e)});}if(!tinymce.isIE&&ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onKeyDown.add(function(ed,e){if(e.ctrlKey&&e.keyCode==86){window.setTimeout(function(){ed.execCommand("mcePasteText",true);},1);Event.cancel(e);}});}},getInfo:function(){return{longname:'Paste text/word',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_handlePasteEvent:function(e){var html=this._clipboardHTML(),ed=this.editor,sel=ed.selection,r;if(ed&&(r=sel.getRng())&&r.text.length>0)ed.execCommand('delete');if(html&&html.length>0)ed.execCommand('mcePasteWord',false,html);return Event.cancel(e);},_insertText:function(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(this.editor.getParam("paste_create_paragraphs",true)){var rl=this.editor.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);content=content.replace(/\r\n\r\n/g,'</p><p>');content=content.replace(/\r\r/g,'</p><p>');content=content.replace(/\n\n/g,'</p><p>');if((pos=content.indexOf('</p><p>'))!=-1){this.editor.execCommand("Delete");var node=this.editor.selection.getNode();var breakElms=[];do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="</p>";before+=content.substring(0,pos);for(var i=0;i<breakElms.length;i++){before+="</"+breakElms[i].nodeName+">";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="<p>";content=before+content.substring(pos+7)+after;}}if(this.editor.getParam("paste_create_linebreaks",true)){content=content.replace(/\r\n/g,'<br />');content=content.replace(/\r/g,'<br />');content=content.replace(/\n/g,'<br />');}}this.editor.execCommand("mceInsertRawHTML",false,content);}},_insertWordContent:function(content){var t=this,ed=t.editor;if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);if(ed.getParam('paste_insert_word_content_callback'))content=ed.execCallback('paste_insert_word_content_callback','before',content);var rl=ed.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>','gi'),'<p><b>$1</b></p>');}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)<BR>","gi"),"<p>"+middot+"$1</p>");content=content.replace(new RegExp('<SPAN style="mso-list: Ignore">','gi'),"<span>"+bull);content=content.replace(/<o:p><\/o:p>/gi,"");content=content.replace(new RegExp('<br style="page-break-before: always;.*>','gi'),'-- page break --');content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");if(this.editor.getParam("paste_remove_spans",true))content=content.replace(/<\/?span[^>]*>/gi,"");if(this.editor.getParam("paste_remove_styles",true))content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(this.editor.getParam("paste_strip_class_attributes","all")){case"all":content=content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi,"<$1$3");break;case"mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break;}content=content.replace(new RegExp('href="?'+this._reEscape(""+document.location)+'','gi'),'href="'+this.editor.documentBaseURI.getURI());content=content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi,"");content=content.replace(/-- page break --/gi,"");if(!this.editor.getParam('force_p_newlines')){content=content.replace('','','gi');content=content.replace('</p>','<br /><br />','gi');}if(!tinymce.isIE&&!this.editor.getParam('force_p_newlines')){content=content.replace(/<\/?p[^>]*>/gi,"");}content=content.replace(/<\/?div[^>]*>/gi,"");if(this.editor.getParam("paste_convert_middot_lists",true)){var div=ed.dom.create("div",null,content);var className=this.editor.getParam("paste_unindented_list_class","unIndentedList");while(this._convertMiddots(div,"--list--"));while(this._convertMiddots(div,middot,className));while(this._convertMiddots(div,bull));content=div.innerHTML;}if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi,'<p>&nbsp;&nbsp;</p>');content=content.replace(/<h[1-6]>/gi,'<p><b>');content=content.replace(/<\/h[1-6]>/gi,'</b></p>');content=content.replace(/<b>&nbsp;<\/b>/gi,'<b>&nbsp;&nbsp;</b>');content=content.replace(/^(&nbsp;)*/gi,'');}content=content.replace(/--list--/gi,"");if(ed.getParam('paste_insert_word_content_callback'))content=ed.execCallback('paste_insert_word_content_callback','after',content);this.editor.execCommand("mceInsertContent",false,content);if(this.editor.getParam('paste_force_cleanup_wordpaste',true)){var ed=this.editor;window.setTimeout(function(){ed.execCommand("mceCleanup");},1);}}},_reEscape:function(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i<s.length;i++){var c=s.charAt(i);if(l.indexOf(c)!=-1)o+='\\'+c;else o+=c;}return o;},_convertMiddots:function(div,search,class_name){var ed=this.editor,mdot=String.fromCharCode(183),bull=String.fromCharCode(8226);var nodes,prevul,i,p,ul,li,np,cp,li;nodes=div.getElementsByTagName("p");for(i=0;i<nodes.length;i++){p=nodes[i];if(p.innerHTML.indexOf(search)==0){ul=ed.dom.create("ul");if(class_name)ul.className=class_name;li=ed.dom.create("li");li.innerHTML=p.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');ul.appendChild(li);np=p.nextSibling;while(np){if(np.nodeType==3&&new RegExp('^\\s$','m').test(np.nodeValue)){np=np.nextSibling;continue;}if(search==mdot){if(np.nodeType==1&&new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)){if(!prevul){prevul=ul;ul=ed.dom.create("ul");prevul.appendChild(ul);}np.innerHTML=np.innerHTML.replace(/^o/,'');}else{if(prevul){ul=prevul;prevul=null;}if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}}else{if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}cp=np.nextSibling;li=ed.dom.create("li");li.innerHTML=np.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');np.parentNode.removeChild(np);ul.appendChild(li);np=cp;}p.parentNode.replaceChild(ul,p);return true;}}return false;},_clipboardHTML:function(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1;}document.body.appendChild(div);}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html;}});tinymce.PluginManager.add('paste',tinymce.plugins.PastePlugin);})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/editor_plugin_src.js b/program/js/tiny_mce/plugins/paste/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..b1e9632
--- /dev/null
@@ -0,0 +1,387 @@
+/**\r
+ * $Id: editor_plugin_src.js 738 2008-03-20 20:00:48Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       var Event = tinymce.dom.Event;\r
+\r
+       tinymce.create('tinymce.plugins.PastePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed; \r
+\r
+                       // Register commands\r
+                       ed.addCommand('mcePasteText', function(ui, v) {\r
+                               if (ui) {\r
+                                       if ((ed.getParam('paste_use_dialog', true)) || (!tinymce.isIE)) {\r
+                                               ed.windowManager.open({\r
+                                                       file : url + '/pastetext.htm',\r
+                                                       width : 450,\r
+                                                       height : 400,\r
+                                                       inline : 1\r
+                                               }, {\r
+                                                       plugin_url : url\r
+                                               });\r
+                                       } else\r
+                                               t._insertText(clipboardData.getData("Text"), true);\r
+                               } else\r
+                                       t._insertText(v.html, v.linebreaks);\r
+                       });\r
+\r
+                       ed.addCommand('mcePasteWord', function(ui, v) {\r
+                               if (ui) {\r
+                                       if ((ed.getParam('paste_use_dialog', true)) || (!tinymce.isIE)) {\r
+                                               ed.windowManager.open({\r
+                                                       file : url + '/pasteword.htm',\r
+                                                       width : 450,\r
+                                                       height : 400,\r
+                                                       inline : 1\r
+                                               }, {\r
+                                                       plugin_url : url\r
+                                               });\r
+                                       } else\r
+                                               t._insertText(t._clipboardHTML());\r
+                               } else\r
+                                       t._insertWordContent(v);\r
+                       });\r
+\r
+                       ed.addCommand('mceSelectAll', function() {\r
+                               ed.execCommand('selectall'); \r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('pastetext', {title : 'paste.paste_text_desc', cmd : 'mcePasteText', ui : true});\r
+                       ed.addButton('pasteword', {title : 'paste.paste_word_desc', cmd : 'mcePasteWord', ui : true});\r
+                       ed.addButton('selectall', {title : 'paste.selectall_desc', cmd : 'mceSelectAll'});\r
+\r
+                       if (ed.getParam("paste_auto_cleanup_on_paste", false)) {\r
+                               ed.onPaste.add(function(ed, e) {\r
+                                       return t._handlePasteEvent(e)\r
+                               });\r
+                       }\r
+\r
+                       if (!tinymce.isIE && ed.getParam("paste_auto_cleanup_on_paste", false)) {\r
+                               // Force paste dialog if non IE browser\r
+                               ed.onKeyDown.add(function(ed, e) {\r
+                                       if (e.ctrlKey && e.keyCode == 86) {\r
+                                               window.setTimeout(function() {\r
+                                                       ed.execCommand("mcePasteText", true);\r
+                                               }, 1);\r
+\r
+                                               Event.cancel(e);\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Paste text/word',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _handlePasteEvent : function(e) {\r
+                       var html = this._clipboardHTML(), ed = this.editor, sel = ed.selection, r;\r
+\r
+                       // Removes italic, strong etc, the if was needed due to bug #1437114\r
+                       if (ed && (r = sel.getRng()) && r.text.length > 0)\r
+                               ed.execCommand('delete');\r
+\r
+                       if (html && html.length > 0)\r
+                               ed.execCommand('mcePasteWord', false, html);\r
+\r
+                       return Event.cancel(e);\r
+               },\r
+\r
+               _insertText : function(content, bLinebreaks) { \r
+                       if (content && content.length > 0) {\r
+                               if (bLinebreaks) { \r
+                                       // Special paragraph treatment \r
+                                       if (this.editor.getParam("paste_create_paragraphs", true)) {\r
+                                               var rl = this.editor.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
+                                               for (var i=0; i<rl.length; i+=2)\r
+                                                       content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
+\r
+                                               content = content.replace(/\r\n\r\n/g, '</p><p>');\r
+                                               content = content.replace(/\r\r/g, '</p><p>');\r
+                                               content = content.replace(/\n\n/g, '</p><p>');\r
+\r
+                                               // Has paragraphs \r
+                                               if ((pos = content.indexOf('</p><p>')) != -1) { \r
+                                                       this.editor.execCommand("Delete"); \r
+\r
+                                                       var node = this.editor.selection.getNode(); \r
+\r
+                                                       // Get list of elements to break \r
+                                                       var breakElms = [];\r
+\r
+                                                       do { \r
+                                                               if (node.nodeType == 1) { \r
+                                                                       // Don't break tables and break at body \r
+                                                                       if (node.nodeName == "TD" || node.nodeName == "BODY") \r
+                                                                               break; \r
+                       \r
+                                                                       breakElms[breakElms.length] = node; \r
+                                                               } \r
+                                                       } while(node = node.parentNode); \r
+\r
+                                                       var before = "", after = "</p>"; \r
+                                                       before += content.substring(0, pos); \r
+\r
+                                                       for (var i=0; i<breakElms.length; i++) { \r
+                                                               before += "</" + breakElms[i].nodeName + ">"; \r
+                                                               after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; \r
+                                                       } \r
+\r
+                                                       before += "<p>"; \r
+                                                       content = before + content.substring(pos+7) + after; \r
+                                               } \r
+                                       } \r
+\r
+                                       if (this.editor.getParam("paste_create_linebreaks", true)) {\r
+                                               content = content.replace(/\r\n/g, '<br />');\r
+                                               content = content.replace(/\r/g, '<br />');\r
+                                               content = content.replace(/\n/g, '<br />');\r
+                                       }\r
+                               } \r
+                       \r
+                               this.editor.execCommand("mceInsertRawHTML", false, content); \r
+                       }\r
+               },\r
+\r
+               _insertWordContent : function(content) { \r
+                       var t = this, ed = t.editor;\r
+\r
+                       if (content && content.length > 0) {\r
+                               // Cleanup Word content\r
+                               var bull = String.fromCharCode(8226);\r
+                               var middot = String.fromCharCode(183);\r
+\r
+                               if (ed.getParam('paste_insert_word_content_callback'))\r
+                                       content = ed.execCallback('paste_insert_word_content_callback', 'before', content);\r
+\r
+                               var rl = ed.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
+                               for (var i=0; i<rl.length; i+=2)\r
+                                       content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
+\r
+                               if (this.editor.getParam("paste_convert_headers_to_strong", false)) {\r
+                                       content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');\r
+                               }\r
+\r
+                               content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");\r
+                               content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");\r
+                               content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list\r
+                               content = content.replace(/<o:p><\/o:p>/gi, "");\r
+                               content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks\r
+                               content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments\r
+\r
+                               if (this.editor.getParam("paste_remove_spans", true))\r
+                                       content = content.replace(/<\/?span[^>]*>/gi, "");\r
+\r
+                               if (this.editor.getParam("paste_remove_styles", true))\r
+                                       content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");\r
+\r
+                               content = content.replace(/<\/?font[^>]*>/gi, "");\r
+\r
+                               // Strips class attributes.\r
+                               switch (this.editor.getParam("paste_strip_class_attributes", "all")) {\r
+                                       case "all":\r
+                                               content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");\r
+                                               break;\r
+\r
+                                       case "mso":\r
+                                               content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");\r
+                                               break;\r
+                               }\r
+\r
+                               content = content.replace(new RegExp('href="?' + this._reEscape("" + document.location) + '', 'gi'), 'href="' + this.editor.documentBaseURI.getURI());\r
+                               content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");\r
+                               content = content.replace(/<\\?\?xml[^>]*>/gi, "");\r
+                               content = content.replace(/<\/?\w+:[^>]*>/gi, "");\r
+                               content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks\r
+                               content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks\r
+\r
+               //              content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;\r
+               //              content = content.replace(/<p>&nbsp;<\/p>/gi, '');\r
+\r
+                               if (!this.editor.getParam('force_p_newlines')) {\r
+                                       content = content.replace('', '' ,'gi');\r
+                                       content = content.replace('</p>', '<br /><br />' ,'gi');\r
+                               }\r
+\r
+                               if (!tinymce.isIE && !this.editor.getParam('force_p_newlines')) {\r
+                                       content = content.replace(/<\/?p[^>]*>/gi, "");\r
+                               }\r
+\r
+                               content = content.replace(/<\/?div[^>]*>/gi, "");\r
+\r
+                               // Convert all middlot lists to UL lists\r
+                               if (this.editor.getParam("paste_convert_middot_lists", true)) {\r
+                                       var div = ed.dom.create("div", null, content);\r
+\r
+                                       // Convert all middot paragraphs to li elements\r
+                                       var className = this.editor.getParam("paste_unindented_list_class", "unIndentedList");\r
+\r
+                                       while (this._convertMiddots(div, "--list--")) ; // bull\r
+                                       while (this._convertMiddots(div, middot, className)) ; // Middot\r
+                                       while (this._convertMiddots(div, bull)) ; // bull\r
+\r
+                                       content = div.innerHTML;\r
+                               }\r
+\r
+                               // Replace all headers with strong and fix some other issues\r
+                               if (this.editor.getParam("paste_convert_headers_to_strong", false)) {\r
+                                       content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');\r
+                                       content = content.replace(/<h[1-6]>/gi, '<p><b>');\r
+                                       content = content.replace(/<\/h[1-6]>/gi, '</b></p>');\r
+                                       content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');\r
+                                       content = content.replace(/^(&nbsp;)*/gi, '');\r
+                               }\r
+\r
+                               content = content.replace(/--list--/gi, ""); // Remove --list--\r
+\r
+                               if (ed.getParam('paste_insert_word_content_callback'))\r
+                                       content = ed.execCallback('paste_insert_word_content_callback', 'after', content);\r
+\r
+                               // Insert cleaned content\r
+                               this.editor.execCommand("mceInsertContent", false, content);\r
+\r
+                               if (this.editor.getParam('paste_force_cleanup_wordpaste', true)) {\r
+                                       var ed = this.editor;\r
+\r
+                                       window.setTimeout(function() {\r
+                                               ed.execCommand("mceCleanup");\r
+                                       }, 1); // Do normal cleanup detached from this thread\r
+                               }\r
+                       }\r
+               },\r
+\r
+               _reEscape : function(s) {\r
+                       var l = "?.\\*[](){}+^$:";\r
+                       var o = "";\r
+\r
+                       for (var i=0; i<s.length; i++) {\r
+                               var c = s.charAt(i);\r
+\r
+                               if (l.indexOf(c) != -1)\r
+                                       o += '\\' + c;\r
+                               else\r
+                                       o += c;\r
+                       }\r
+\r
+                       return o;\r
+               },\r
+\r
+               _convertMiddots : function(div, search, class_name) {\r
+                       var ed = this.editor, mdot = String.fromCharCode(183), bull = String.fromCharCode(8226);\r
+                       var nodes, prevul, i, p, ul, li, np, cp, li;\r
+\r
+                       nodes = div.getElementsByTagName("p");\r
+                       for (i=0; i<nodes.length; i++) {\r
+                               p = nodes[i];\r
+\r
+                               // Is middot\r
+                               if (p.innerHTML.indexOf(search) == 0) {\r
+                                       ul = ed.dom.create("ul");\r
+\r
+                                       if (class_name)\r
+                                               ul.className = class_name;\r
+\r
+                                       // Add the first one\r
+                                       li = ed.dom.create("li");\r
+                                       li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
+                                       ul.appendChild(li);\r
+\r
+                                       // Add the rest\r
+                                       np = p.nextSibling;\r
+                                       while (np) {\r
+                                               // If the node is whitespace, then\r
+                                               // ignore it and continue on.\r
+                                               if (np.nodeType == 3 && new RegExp('^\\s$', 'm').test(np.nodeValue)) {\r
+                                                               np = np.nextSibling;\r
+                                                               continue;\r
+                                               }\r
+\r
+                                               if (search == mdot) {\r
+                                                               if (np.nodeType == 1 && new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)) {\r
+                                                                               // Second level of nesting\r
+                                                                               if (!prevul) {\r
+                                                                                               prevul = ul;\r
+                                                                                               ul = ed.dom.create("ul");\r
+                                                                                               prevul.appendChild(ul);\r
+                                                                               }\r
+                                                                               np.innerHTML = np.innerHTML.replace(/^o/, '');\r
+                                                               } else {\r
+                                                                               // Pop the stack if we're going back up to the first level\r
+                                                                               if (prevul) {\r
+                                                                                               ul = prevul;\r
+                                                                                               prevul = null;\r
+                                                                               }\r
+                                                                               // Not element or middot paragraph\r
+                                                                               if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)\r
+                                                                                               break;\r
+                                                               }\r
+                                               } else {\r
+                                                               // Not element or middot paragraph\r
+                                                               if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)\r
+                                                                               break;\r
+                                                       }\r
+\r
+                                               cp = np.nextSibling;\r
+                                               li = ed.dom.create("li");\r
+                                               li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
+                                               np.parentNode.removeChild(np);\r
+                                               ul.appendChild(li);\r
+                                               np = cp;\r
+                                       }\r
+\r
+                                       p.parentNode.replaceChild(ul, p);\r
+\r
+                                       return true;\r
+                               }\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+\r
+               _clipboardHTML : function() {\r
+                       var div = document.getElementById('_TinyMCE_clipboardHTML');\r
+\r
+                       if (!div) {\r
+                               var div = document.createElement('DIV');\r
+                               div.id = '_TinyMCE_clipboardHTML';\r
+\r
+                               with (div.style) {\r
+                                       visibility = 'hidden';\r
+                                       overflow = 'hidden';\r
+                                       position = 'absolute';\r
+                                       width = 1;\r
+                                       height = 1;\r
+                               }\r
+\r
+                               document.body.appendChild(div);\r
+                       }\r
+\r
+                       div.innerHTML = '';\r
+                       var rng = document.body.createTextRange();\r
+                       rng.moveToElementText(div);\r
+                       rng.execCommand('Paste');\r
+                       var html = div.innerHTML;\r
+                       div.innerHTML = '';\r
+                       return html;\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('paste', tinymce.plugins.PastePlugin);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/js/pastetext.js b/program/js/tiny_mce/plugins/paste/js/pastetext.js
new file mode 100644 (file)
index 0000000..326bb16
--- /dev/null
@@ -0,0 +1,42 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+function saveContent() {\r
+       if (document.forms[0].htmlSource.value == '') {\r
+               tinyMCEPopup.close();\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.execCommand('mcePasteText', false, {\r
+               html : document.forms[0].htmlSource.value,\r
+               linebreaks : document.forms[0].linebreaks.checked\r
+       });\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinymce.isGecko)\r
+               document.body.spellcheck = tinyMCEPopup.getParam("gecko_spellcheck");\r
+\r
+       resizeInputs();\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function resizeInputs() {\r
+       if (!tinymce.isIE) {\r
+               wHeight = self.innerHeight-80;\r
+               wWidth = self.innerWidth-17;\r
+       } else {\r
+               wHeight = document.body.clientHeight-80;\r
+               wWidth = document.body.clientWidth-17;\r
+       }\r
+\r
+       document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';\r
+       document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';\r
+}\r
+\r
+tinyMCEPopup.onInit.add(onLoadInit);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/js/pasteword.js b/program/js/tiny_mce/plugins/paste/js/pasteword.js
new file mode 100644 (file)
index 0000000..6701b99
--- /dev/null
@@ -0,0 +1,56 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+function saveContent() {\r
+       var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;\r
+\r
+       if (html == ''){\r
+               tinyMCEPopup.close();\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.execCommand('mcePasteWord', false, html);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Fix for endless reloading in FF\r
+       window.setTimeout(createIFrame, 10);\r
+}\r
+\r
+function createIFrame() {\r
+       document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function initIframe(doc) {\r
+       var dir = tinyMCEPopup.editor.settings.directionality;\r
+\r
+       doc.body.dir = dir;\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinymce.isGecko)\r
+               doc.body.spellcheck = tinyMCEPopup.getParam("gecko_spellcheck");\r
+\r
+       resizeInputs();\r
+}\r
+\r
+function resizeInputs() {\r
+       if (!tinymce.isIE) {\r
+               wHeight = self.innerHeight - 80;\r
+               wWidth = self.innerWidth - 18;\r
+       } else {\r
+               wHeight = document.body.clientHeight - 80;\r
+               wWidth = document.body.clientWidth - 18;\r
+       }\r
+\r
+       var elm = document.getElementById('frmData');\r
+       if (elm) {\r
+               elm.style.height = Math.abs(wHeight) + 'px';\r
+               elm.style.width  = Math.abs(wWidth) + 'px';\r
+       }\r
+}\r
+\r
+tinyMCEPopup.onInit.add(onLoadInit);\r
diff --git a/program/js/tiny_mce/plugins/paste/langs/en_dlg.js b/program/js/tiny_mce/plugins/paste/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..eeac778
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('en.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/pastetext.htm b/program/js/tiny_mce/plugins/paste/pastetext.htm
new file mode 100644 (file)
index 0000000..2f2b341
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#paste.paste_text_desc}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/pastetext.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">\r
+<form name="source" onsubmit="saveContent();return false;" action="#">\r
+       <div style="float: left" class="title">{#paste.paste_text_desc}</div>\r
+\r
+       <div style="float: right">\r
+               <input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label>\r
+       </div>\r
+\r
+       <br style="clear: both" />\r
+\r
+       <div>{#paste_dlg.text_title}</div>\r
+\r
+       <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" name="insert" value="{#insert}" id="insert" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body> \r
+</html>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/pasteword.htm b/program/js/tiny_mce/plugins/paste/pasteword.htm
new file mode 100644 (file)
index 0000000..9e5ab1b
--- /dev/null
@@ -0,0 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <title>{#paste.paste_word_desc}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/pasteword.js"></script>\r
+       <link href="css/pasteword.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">\r
+       <form name="source" onsubmit="saveContent();" action="#">\r
+               <div class="title">{#paste.paste_word_desc}</div>\r
+\r
+               <div>{#paste_dlg.word_title}</div>\r
+\r
+               <div id="iframecontainer"></div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{#insert}" onclick="saveContent();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/readme.txt b/program/js/tiny_mce/plugins/readme.txt
deleted file mode 100644 (file)
index 9192b26..0000000
+++ /dev/null
@@ -1 +0,0 @@
-This is the location you place TinyMCE plugins.
index 4c7bd13c40d7ee99fcb65b3fca12b06b3f0a0d2c..ecdf58c7b50e826ead437180515681537978100f 100644 (file)
@@ -1,20 +1,6 @@
-/* stylesheet for advsearchreplace plugin*/\r
+.panel_wrapper {height:85px;}\r
+.panel_wrapper div.current {height:85px;}\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
+/* IE */\r
+* html .panel_wrapper {height:100px;}\r
+* html .panel_wrapper div.current {height:100px;}\r
index 959e9cc5c0b6d2fef60189a513a9c9739a2b59fc..7fd913b2b8bf77fb916a6dad3b84848f4ba77710 100644 (file)
@@ -1 +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
+(function(){tinymce.create('tinymce.plugins.SearchReplacePlugin',{init:function(ed,url){function open(m){ed.windowManager.open({file:url+'/searchreplace.htm',width:420+parseInt(ed.getLang('searchreplace.delta_width',0)),height:160+parseInt(ed.getLang('searchreplace.delta_height',0)),inline:1,auto_focus:0},{mode:m,search_string:ed.selection.getContent({format:'text'}),plugin_url:url});};ed.addCommand('mceSearch',function(){open('search');});ed.addCommand('mceReplace',function(){open('replace');});ed.addButton('search',{title:'searchreplace.search_desc',cmd:'mceSearch'});ed.addButton('replace',{title:'searchreplace.replace_desc',cmd:'mceReplace'});ed.addShortcut('ctrl+f','searchreplace.search_desc','mceSearch');},getInfo:function(){return{longname:'Search/Replace',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('searchreplace',tinymce.plugins.SearchReplacePlugin);})();
\ No newline at end of file
index cd2f3a85c55b4a3b1b5dc27cc4423b4883c0d653..59edc3b25fdc8750cd75691218e1a814c2159c45 100644 (file)
 /**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ * $Id: editor_plugin_src.js 686 2008-03-09 18:13:49Z spocke $\r
  *\r
  * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ * @copyright Copyright © 2004-2008, 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
+(function() {\r
+       tinymce.create('tinymce.plugins.SearchReplacePlugin', {\r
+               init : function(ed, url) {\r
+                       function open(m) {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/searchreplace.htm',\r
+                                       width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)),\r
+                                       height : 160 + parseInt(ed.getLang('searchreplace.delta_height', 0)),\r
+                                       inline : 1,\r
+                                       auto_focus : 0\r
+                               }, {\r
+                                       mode : m,\r
+                                       search_string : ed.selection.getContent({format : 'text'}),\r
+                                       plugin_url : url\r
+                               });\r
+                       };\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceSearch', function() {\r
+                               open('search');\r
+                       });\r
+\r
+                       ed.addCommand('mceReplace', function() {\r
+                               open('replace');\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'});\r
+                       ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'});\r
+\r
+                       ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch');\r
+               },\r
+\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
 \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
+       // Register plugin\r
+       tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin);\r
+})();
\ 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
deleted file mode 100644 (file)
index 784c73e..0000000
Binary files a/program/js/tiny_mce/plugins/searchreplace/images/replace.gif and /dev/null 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
deleted file mode 100644 (file)
index 123fa5b..0000000
Binary files a/program/js/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif and /dev/null 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
deleted file mode 100644 (file)
index cc2c56e..0000000
Binary files a/program/js/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/search.gif b/program/js/tiny_mce/plugins/searchreplace/images/search.gif
deleted file mode 100644 (file)
index cfe76b5..0000000
Binary files a/program/js/tiny_mce/plugins/searchreplace/images/search.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/js/searchreplace.js b/program/js/tiny_mce/plugins/searchreplace/js/searchreplace.js
new file mode 100644 (file)
index 0000000..890eb37
--- /dev/null
@@ -0,0 +1,117 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var SearchReplaceDialog = {\r
+       init : function(ed) {\r
+               var f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode");\r
+\r
+               this.switchMode(m);\r
+\r
+               f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string");\r
+\r
+               // Focus input field\r
+               f[m + '_panel_searchstring'].focus();\r
+       },\r
+\r
+       switchMode : function(m) {\r
+               var f, lm = this.lastMode;\r
+\r
+               if (lm != m) {\r
+                       f = document.forms[0];\r
+\r
+                       if (lm) {\r
+                               f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value;\r
+                               f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked;\r
+                               f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked;\r
+                               f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked;\r
+                       }\r
+\r
+                       mcTabs.displayTab(m + '_tab',  m + '_panel');\r
+                       document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none";\r
+                       document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none";\r
+                       this.lastMode = m;\r
+               }\r
+       },\r
+\r
+       searchNext : function(a) {\r
+               var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0;\r
+\r
+               // Get input\r
+               f = document.forms[0];\r
+               s = f[m + '_panel_searchstring'].value;\r
+               b = f[m + '_panel_backwardsu'].checked;\r
+               ca = f[m + '_panel_casesensitivebox'].checked;\r
+               rs = f['replace_panel_replacestring'].value;\r
+\r
+               function fix() {\r
+                       // Correct Firefox graphics glitches\r
+                       r = se.getRng().cloneRange();\r
+                       ed.getDoc().execCommand('SelectAll', false, null);\r
+                       se.setRng(r);\r
+               };\r
+\r
+               function replace() {\r
+                       if (tinymce.isIE)\r
+                               ed.selection.getRng().duplicate().pasteHTML(rs); // Needs to be duplicated due to selection bug in IE\r
+                       else\r
+                               ed.getDoc().execCommand('InsertHTML', false, rs);\r
+               };\r
+\r
+               // IE flags\r
+               if (ca)\r
+                       fl = fl | 4;\r
+\r
+               switch (a) {\r
+                       case 'all':\r
+                               if (tinymce.isIE) {\r
+                                       while (r.findText(s, b ? -1 : 1, fl)) {\r
+                                               r.scrollIntoView();\r
+                                               r.select();\r
+                                               replace();\r
+                                               fo = 1;\r
+                                       }\r
+\r
+                                       tinyMCEPopup.storeSelection();\r
+                               } else {\r
+                                       while (w.find(s, ca, b, false, false, false, false)) {\r
+                                               replace();\r
+                                               fo = 1;\r
+                                       }\r
+                               }\r
+\r
+                               if (fo)\r
+                                       wm.alert(ed.getLang('searchreplace_dlg.allreplaced'));\r
+                               else\r
+                                       wm.alert(ed.getLang('searchreplace_dlg.notfound'));\r
+\r
+                               return;\r
+\r
+                       case 'current':\r
+                               replace();\r
+                               break;\r
+               }\r
+\r
+               se.collapse(b);\r
+               r = se.getRng();\r
+\r
+               // Whats the point\r
+               if (!s)\r
+                       return;\r
+\r
+               if (tinymce.isIE) {\r
+                       if (r.findText(s, b ? -1 : 1, fl)) {\r
+                               r.scrollIntoView();\r
+                               r.select();\r
+                       } else\r
+                               wm.alert(ed.getLang('searchreplace_dlg.notfound'));\r
+\r
+                       tinyMCEPopup.storeSelection();\r
+               } else {\r
+                       if (!w.find(s, ca, b, false, false, false, false))\r
+                               wm.alert(ed.getLang('searchreplace_dlg.notfound'));\r
+                       else\r
+                               fix();\r
+               }\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog);\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js b/program/js/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js
deleted file mode 100644 (file)
index ac6cdf6..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-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
deleted file mode 100644 (file)
index 32af828..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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/langs/en_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..370959a
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('en.searchreplace_dlg',{\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
+allreplaced:"All occurrences of the search string were replaced.",\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/readme.txt b/program/js/tiny_mce/plugins/searchreplace/readme.txt
deleted file mode 100644 (file)
index 4fdb78a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Check the TinyMCE documentation for details on this plugin.\r
index 192e0cbc66f57e5932da1425e5093b576b80a85b..9c95a6a30b90098948b216e8f601d0586cf38b48 100644 (file)
@@ -1,39 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#searchreplace_dlg.replace_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body style="display:none;">\r
+<form onsubmit="SearchReplaceDialog.searchNext('none');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
+                       <li id="search_tab"><span><a href="javascript:SearchReplaceDialog.switchMode('search');" onmousedown="return false;">{#searchreplace.search_desc}</a></span></li>\r
+                       <li id="replace_tab"><span><a href="javascript:SearchReplaceDialog.switchMode('replace');" onmousedown="return false;">{#searchreplace_dlg.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><label for="search_panel_searchstring">{#searchreplace_dlg.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><label>{#searchreplace_dlg.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
+                                                               <td><label for="search_panel_backwardsu">{#searchreplace_dlg.up}</label></td>\r
+                                                               <td><input id="search_panel_backwardsd" name="search_panel_backwards" class="radio" type="radio" checked="checked" /></td>\r
+                                                               <td><label for="search_panel_backwardsd">{#searchreplace_dlg.down}</label></td>\r
                                                        </tr>\r
                                                </table>\r
                                        </td>\r
@@ -43,7 +43,7 @@
                                                <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
+                                                               <td><label for="search_panel_casesensitivebox">{#searchreplace_dlg.mcase}</label></td>\r
                                                        </tr>\r
                                                </table>\r
                                        </td>\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><label for="replace_panel_searchstring">{#searchreplace_dlg.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><label for="replace_panel_replacestring">{#searchreplace_dlg.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><label>{#searchreplace_dlg.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
+                                                               <td><label for="replace_panel_backwardsu">{#searchreplace_dlg.up}</label></td>\r
+                                                               <td><input id="replace_panel_backwardsd" name="replace_panel_backwards" class="radio" type="radio" checked="checked" /></td>\r
+                                                               <td><label for="replace_panel_backwardsd">{#searchreplace_dlg.down}</label></td>\r
                                                        </tr>\r
                                                </table>\r
                                        </td>\r
@@ -79,7 +79,7 @@
                                                <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
+                                                               <td><label for="replace_panel_casesensitivebox">{#searchreplace_dlg.mcase}</label></td>\r
                                                        </tr>\r
                                                </table>\r
                                        </td>\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
+                       <input type="submit" id="insert" name="insert" value="{#searchreplace_dlg.findnext}" />\r
+                       <input type="button" class="button" id="replaceBtn" name="replaceBtn" value="{#searchreplace_dlg.replace}" onclick="SearchReplaceDialog.searchNext('current');" />\r
+                       <input type="button" class="button" id="replaceAllBtn" name="replaceAllBtn" value="{#searchreplace_dlg.replaceall}" onclick="SearchReplaceDialog.searchNext('all');" />\r
                </div>\r
 \r
                <div style="float: right">      \r
-                       <input type="button" id="cancel" name="cancel" value="{$lang_searchreplace_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </div>\r
 </form>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/changelog b/program/js/tiny_mce/plugins/spellchecker/changelog
deleted file mode 100644 (file)
index 608fcd5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644 (file)
index 7be9297..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-<?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
deleted file mode 100644 (file)
index 21fb194..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?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
deleted file mode 100644 (file)
index 348cac3..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?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
deleted file mode 100644 (file)
index 6622248..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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
index fb82733cd53d08058745cde0e700363b8664f548..24efa02170ce8bf23e68fc76d7526d2f60aed2b5 100644 (file)
@@ -1,5 +1 @@
-.mceItemHiddenSpellWord {\r
-       background: url('../images/wline.gif') repeat-x bottom left;\r
-       bo2rder-bottom: 1px dashed red;\r
-       cursor: default;\r
-}\r
+.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;}\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css b/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css
deleted file mode 100644 (file)
index aa4a8ea..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-.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
index dbcda6a5634c3f234f548d71d23e1717dba0f7f8..9cb679961b8388b9cae85281e48cffd556f37582 100644 (file)
@@ -1 +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
+(function(){var JSONRequest=tinymce.util.JSONRequest,each=tinymce.each,DOM=tinymce.DOM;tinymce.create('tinymce.plugins.SpellcheckerPlugin',{getInfo:function(){return{longname:'Spellchecker',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',version:tinymce.majorVersion+"."+tinymce.minorVersion};},init:function(ed,url){var t=this,cm;t.url=url;t.editor=ed;ed.addCommand('mceSpellCheck',function(){if(!t.active){ed.setProgressState(1);t._sendRPC('checkWords',[t.selectedLang,t._getWords()],function(r){if(r.length>0){t.active=1;t._markWords(r);ed.setProgressState(0);ed.nodeChanged();}else{ed.setProgressState(0);ed.windowManager.alert('spellchecker.no_mpell');}});}else t._done();});ed.onInit.add(function(){if(ed.settings.content_css!==false)ed.dom.loadCSS(url+'/css/content.css');});ed.onClick.add(t._showMenu,t);ed.onContextMenu.add(t._showMenu,t);ed.onBeforeGetContent.add(function(){if(t.active)t._removeWords();});ed.onNodeChange.add(function(ed,cm){cm.setActive('spellchecker',t.active);});ed.onSetContent.add(function(){t._done();});ed.onBeforeGetContent.add(function(){t._done();});ed.onBeforeExecCommand.add(function(ed,cmd){if(cmd=='mceFullScreen')t._done();});t.languages={};each(ed.getParam('spellchecker_languages','+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv','hash'),function(v,k){if(k.indexOf('+')===0){k=k.substring(1);t.selectedLang=v;}t.languages[k]=v;});},createControl:function(n,cm){var t=this,c,ed=t.editor;if(n=='spellchecker'){c=cm.createSplitButton(n,{title:'spellchecker.desc',cmd:'mceSpellCheck',scope:t});c.onRenderMenu.add(function(c,m){m.add({title:'spellchecker.langs','class':'mceMenuItemTitle'}).setDisabled(1);each(t.languages,function(v,k){var o={icon:1},mi;o.onclick=function(){mi.setSelected(1);t.selectedItem.setSelected(0);t.selectedItem=mi;t.selectedLang=v;};o.title=k;mi=m.add(o);mi.setSelected(v==t.selectedLang);if(v==t.selectedLang)t.selectedItem=mi;})});return c;}},_walk:function(n,f){var d=this.editor.getDoc(),w;if(d.createTreeWalker){w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while((n=w.nextNode())!=null)f.call(this,n);}else tinymce.walk(n,f,'childNodes');},_getSeparators:function(){var re='',i,str=this.editor.getParam('spellchecker_word_separator_chars','\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}����������������\u201d\u201c');for(i=0;i<str.length;i++)re+='\\'+str.charAt(i);return re;},_getWords:function(){var ed=this.editor,wl=[],tx='',lo={};this._walk(ed.getBody(),function(n){if(n.nodeType==3)tx+=n.nodeValue+' ';});tx=tx.replace(new RegExp('([0-9]|['+this._getSeparators()+'])','g'),' ');tx=tinymce.trim(tx.replace(/(\s+)/g,' '));each(tx.split(' '),function(v){if(!lo[v]){wl.push(v);lo[v]=1;}});return wl;},_removeWords:function(w){var ed=this.editor,dom=ed.dom,se=ed.selection,b=se.getBookmark();each(dom.select('span').reverse(),function(n){if(n&&(dom.hasClass(n,'mceItemHiddenSpellWord')||dom.hasClass(n,'mceItemHidden'))){if(!w||dom.decode(n.innerHTML)==w)dom.remove(n,1);}});se.moveToBookmark(b);},_markWords:function(wl){var r1,r2,r3,r4,r5,w='',ed=this.editor,re=this._getSeparators(),dom=ed.dom,nl=[];var se=ed.selection,b=se.getBookmark();each(wl,function(v){w+=(w?'|':'')+v;});r1=new RegExp('(['+re+'])('+w+')(['+re+'])','g');r2=new RegExp('^('+w+')','g');r3=new RegExp('('+w+')(['+re+']?)$','g');r4=new RegExp('^('+w+')(['+re+']?)$','g');r5=new RegExp('('+w+')(['+re+'])','g');this._walk(this.editor.getBody(),function(n){if(n.nodeType==3){nl.push(n);}});each(nl,function(n){var v;if(n.nodeType==3){v=n.nodeValue;if(r1.test(v)||r2.test(v)||r3.test(v)||r4.test(v)){v=dom.encode(v);v=v.replace(r5,'<span class="mceItemHiddenSpellWord">$1</span>$2');v=v.replace(r3,'<span class="mceItemHiddenSpellWord">$1</span>$2');dom.replace(dom.create('span',{'class':'mceItemHidden'},v),n);}}});se.moveToBookmark(b);},_showMenu:function(ed,e){var t=this,ed=t.editor,m=t._menu,p1,dom=ed.dom,vp=dom.getViewPort(ed.getWin());if(!m){p1=DOM.getPos(ed.getContentAreaContainer());m=ed.controlManager.createDropMenu('spellcheckermenu',{offset_x:p1.x,offset_y:p1.y,'class':'mceNoIcons'});t._menu=m;}if(dom.hasClass(e.target,'mceItemHiddenSpellWord')){m.removeAll();m.add({title:'spellchecker.wait','class':'mceMenuItemTitle'}).setDisabled(1);t._sendRPC('getSuggestions',[t.selectedLang,dom.decode(e.target.innerHTML)],function(r){m.removeAll();if(r.length>0){m.add({title:'spellchecker.sug','class':'mceMenuItemTitle'}).setDisabled(1);each(r,function(v){m.add({title:v,onclick:function(){dom.replace(ed.getDoc().createTextNode(v),e.target);t._checkDone();}});});m.addSeparator();}else m.add({title:'spellchecker.no_sug','class':'mceMenuItemTitle'}).setDisabled(1);m.add({title:'spellchecker.ignore_word',onclick:function(){dom.remove(e.target,1);t._checkDone();}});m.add({title:'spellchecker.ignore_words',onclick:function(){t._removeWords(dom.decode(e.target.innerHTML));t._checkDone();}});m.update();});ed.selection.select(e.target);p1=dom.getPos(e.target);m.showMenu(p1.x,p1.y+e.target.offsetHeight-vp.y);return tinymce.dom.Event.cancel(e);}else m.hideMenu();},_checkDone:function(){var t=this,ed=t.editor,dom=ed.dom,o;each(dom.select('span'),function(n){if(n&&dom.hasClass(n,'mceItemHiddenSpellWord')){o=true;return false;}});if(!o)t._done();},_done:function(){var t=this,la=t.active;if(t.active){t.active=0;t._removeWords();if(t._menu)t._menu.hideMenu();if(la)t.editor.nodeChanged();}},_sendRPC:function(m,p,cb){var t=this,url=t.editor.getParam("spellchecker_rpc_url","{backend}");if(url=='{backend}'){t.editor.setProgressState(0);alert('Please specify: spellchecker_rpc_url');return;}JSONRequest.sendRPC({url:url,method:m,params:p,success:cb,error:function(e,x){t.editor.setProgressState(0);t.editor.windowManager.alert(e.errstr||('Error response: '+x.responseText));}});}});tinymce.PluginManager.add('spellchecker',tinymce.plugins.SpellcheckerPlugin);})();
\ No newline at end of file
index 196d246404006f63205bd4c10fc70d5a979001f0..c913c4603e482a19460362762d3e6c569d9e4ad3 100644 (file)
 /**\r
- * $Id: editor_plugin_src.js 28 2006-08-01 16:02:56Z spocke $\r
+ * $Id: editor_plugin_src.js 425 2007-11-21 15:17:39Z spocke $\r
  *\r
  * @author Moxiecode\r
- * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.\r
+ * @copyright Copyright © 2004-2008, 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
+(function() {\r
+       var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM;\r
+\r
+       tinymce.create('tinymce.plugins.SpellcheckerPlugin', {\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Spellchecker',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               init : function(ed, url) {\r
+                       var t = this, cm;\r
+\r
+                       t.url = url;\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceSpellCheck', function() {\r
+                               if (!t.active) {\r
+                                       ed.setProgressState(1);\r
+                                       t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {\r
+                                               if (r.length > 0) {\r
+                                                       t.active = 1;\r
+                                                       t._markWords(r);\r
+                                                       ed.setProgressState(0);\r
+                                                       ed.nodeChanged();\r
+                                               } else {\r
+                                                       ed.setProgressState(0);\r
+                                                       ed.windowManager.alert('spellchecker.no_mpell');\r
+                                               }\r
+                                       });\r
+                               } else\r
+                                       t._done();\r
+                       });\r
+\r
+                       ed.onInit.add(function() {\r
+                               if (ed.settings.content_css !== false)\r
+                                       ed.dom.loadCSS(url + '/css/content.css');\r
+                       });\r
+\r
+                       ed.onClick.add(t._showMenu, t);\r
+                       ed.onContextMenu.add(t._showMenu, t);\r
+                       ed.onBeforeGetContent.add(function() {\r
+                               if (t.active)\r
+                                       t._removeWords();\r
+                       });\r
+\r
+                       ed.onNodeChange.add(function(ed, cm) {\r
+                               cm.setActive('spellchecker', t.active);\r
+                       });\r
+\r
+                       ed.onSetContent.add(function() {\r
+                               t._done();\r
+                       });\r
+\r
+                       ed.onBeforeGetContent.add(function() {\r
+                               t._done();\r
+                       });\r
+\r
+                       ed.onBeforeExecCommand.add(function(ed, cmd) {\r
+                               if (cmd == 'mceFullScreen')\r
+                                       t._done();\r
+                       });\r
+\r
+                       // Find selected language\r
+                       t.languages = {};\r
+                       each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) {\r
+                               if (k.indexOf('+') === 0) {\r
+                                       k = k.substring(1);\r
+                                       t.selectedLang = v;\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
+                               t.languages[k] = v;\r
+                       });\r
+               },\r
 \r
-       _getBlockBoxLayer : function(inst) {\r
-               if (!inst.spellCheckerBoxL)\r
-                       inst.spellCheckerBoxL = new TinyMCE_Layer(inst.editorId + '_spellcheckerBlockBox', false);\r
+               createControl : function(n, cm) {\r
+                       var t = this, c, ed = t.editor;\r
 \r
-               return inst.spellCheckerBoxL;\r
-       },\r
+                       if (n == 'spellchecker') {\r
+                               c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});\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
+                               c.onRenderMenu.add(function(c, m) {\r
+                                       m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+                                       each(t.languages, function(v, k) {\r
+                                               var o = {icon : 1}, mi;\r
 \r
-               m.clear();\r
-               m.addTitle(tinyMCE.getLang('lang_spellchecker_langs', '', true));\r
+                                               o.onclick = function() {\r
+                                                       mi.setSelected(1);\r
+                                                       t.selectedItem.setSelected(0);\r
+                                                       t.selectedItem = mi;\r
+                                                       t.selectedLang = v;\r
+                                               };\r
 \r
-               for (i=0; i<ar.length; i++) {\r
-                       if (ar[i] != '') {\r
-                               p = ar[i].split('=');\r
-                               c = 'mceMenuCheckItem';\r
+                                               o.title = k;\r
+                                               mi = m.add(o);\r
+                                               mi.setSelected(v == t.selectedLang);\r
 \r
-                               if (p[0].charAt(0) == '+') {\r
-                                       p[0] = p[0].substring(1);\r
+                                               if (v == t.selectedLang)\r
+                                                       t.selectedItem = mi;\r
+                                       })\r
+                               });\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
+                               return 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
 \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
+               // Internal functions\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
+               _walk : function(n, f) {\r
+                       var d = this.editor.getDoc(), w;\r
 \r
-       _onMenuEvent : function(inst, m, n) {\r
-               TinyMCE_SpellCheckerPlugin._buildSettingsMenu(inst, inst.spellCheckerLang);\r
-       },\r
+                       if (d.createTreeWalker) {\r
+                               w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);\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
+                               while ((n = w.nextNode()) != null)\r
+                                       f.call(this, n);\r
+                       } else\r
+                               tinymce.walk(n, f, 'childNodes');\r
+               },\r
 \r
-               // Handle commands\r
-               switch (command) {\r
-                       case "mceSpellCheck":\r
-                               if (!inst.spellcheckerOn) {\r
-                                       inst.spellCheckerBookmark = inst.selection.getBookmark();\r
+               _getSeparators : function() {\r
+                       var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');\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
+                       // Build word separator regexp\r
+                       for (i=0; i<str.length; i++)\r
+                               re += '\\' + str.charAt(i);\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
+                       return re;\r
+               },\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
+               _getWords : function() {\r
+                       var ed = this.editor, wl = [], tx = '', lo = {};\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
+                       // Get area text\r
+                       this._walk(ed.getBody(), function(n) {\r
+                               if (n.nodeType == 3)\r
+                                       tx += n.nodeValue + ' ';\r
+                       });\r
 \r
-                                       inst.spellcheckerOn = true;\r
-                                       tinyMCE.switchClass(editor_id + '_spellchecker', 'mceMenuButtonSelected');\r
+                       // Split words by separator\r
+                       tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');\r
+                       tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));\r
 \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
+                       // Build word array and remove duplicates\r
+                       each(tx.split(' '), function(v) {\r
+                               if (!lo[v]) {\r
+                                       wl.push(v);\r
+                                       lo[v] = 1;\r
                                }\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
+                       return wl;\r
+               },\r
 \r
-               if (id)\r
-                       inst = tinyMCE.getInstanceById(id.substring(0, id.indexOf('|')));\r
+               _removeWords : function(w) {\r
+                       var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark();\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
+                       each(dom.select('span').reverse(), function(n) {\r
+                               if (n && (dom.hasClass(n, 'mceItemHiddenSpellWord') || dom.hasClass(n, 'mceItemHidden'))) {\r
+                                       if (!w || dom.decode(n.innerHTML) == w)\r
+                                               dom.remove(n, 1);\r
                                }\r
-                       }\r
-\r
-                       if (!s && nl[i].length > 0)\r
-                               wl[wl.length] = nl[i];\r
-               }\r
+                       });\r
 \r
-               return wl.join(' ');\r
-       },\r
+                       se.moveToBookmark(b);\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
+               _markWords : function(wl) {\r
+                       var r1, r2, r3, r4, r5, w = '', ed = this.editor, re = this._getSeparators(), dom = ed.dom, nl = [];\r
+                       var se = ed.selection, b = se.getBookmark();\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
+                       each(wl, function(v) {\r
+                               w += (w ? '|' : '') + v;\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
+                       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
-               for (i=nl.length-1; i>=0; i--) {\r
-                       c = tinyMCE.getAttrib(nl[i], 'class');\r
+                       // Collect all text nodes\r
+                       this._walk(this.editor.getBody(), function(n) {\r
+                               if (n.nodeType == 3) {\r
+                                       nl.push(n);\r
+                               }\r
+                       });\r
 \r
-                       if (c == 'mceItemHiddenSpellWord')\r
-                               w++;\r
-               }\r
+                       // Wrap incorrect words in spans\r
+                       each(nl, function(n) {\r
+                               var v;\r
 \r
-               return w;\r
-       },\r
+                               if (n.nodeType == 3) {\r
+                                       v = n.nodeValue;\r
 \r
-       _removeWord : function(e) {\r
-               if (e != null)\r
-                       tinyMCE.setOuterHTML(e, e.innerHTML);\r
-       },\r
+                                       if (r1.test(v) || r2.test(v) || r3.test(v) || r4.test(v)) {\r
+                                               v = dom.encode(v);\r
+                                               v = v.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2');\r
+                                               v = v.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2');\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
+                                               dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n);\r
+                                       }\r
+                               }\r
+                       });\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
+                       se.moveToBookmark(b);\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
+               _showMenu : function(ed, e) {\r
+                       var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin());\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
+                       if (!m) {\r
+                               p1 = DOM.getPos(ed.getContentAreaContainer());\r
+                               //p2 = DOM.getPos(ed.getContainer());\r
 \r
-                               nn = doc.createElement('span');\r
-                               nn.className = "mceItemHidden";\r
-                               nn.innerHTML = nv;\r
+                               m = ed.controlManager.createDropMenu('spellcheckermenu', {\r
+                                       offset_x : p1.x,\r
+                                       offset_y : p1.y,\r
+                                       'class' : 'mceNoIcons'\r
+                               });\r
 \r
-                               // Remove old text node\r
-                               nl[i].parentNode.replaceChild(nn, nl[i]);\r
+                               t._menu = m;\r
                        }\r
-               }\r
-       },\r
 \r
-       _buildMenu : function(sg, max) {\r
-               var i, self = TinyMCE_SpellCheckerPlugin, cm = self._contextMenu;\r
+                       if (dom.hasClass(e.target, 'mceItemHiddenSpellWord')) {\r
+                               m.removeAll();\r
+                               m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+\r
+                               t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(e.target.innerHTML)], function(r) {\r
+                                       m.removeAll();\r
+\r
+                                       if (r.length > 0) {\r
+                                               m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+                                               each(r, function(v) {\r
+                                                       m.add({title : v, onclick : function() {\r
+                                                               dom.replace(ed.getDoc().createTextNode(v), e.target);\r
+                                                               t._checkDone();\r
+                                                       }});\r
+                                               });\r
+\r
+                                               m.addSeparator();\r
+                                       } else\r
+                                               m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
+\r
+                                       m.add({\r
+                                               title : 'spellchecker.ignore_word',\r
+                                               onclick : function() {\r
+                                                       dom.remove(e.target, 1);\r
+                                                       t._checkDone();\r
+                                               }\r
+                                       });\r
+\r
+                                       m.add({\r
+                                               title : 'spellchecker.ignore_words',\r
+                                               onclick : function() {\r
+                                                       t._removeWords(dom.decode(e.target.innerHTML));\r
+                                                       t._checkDone();\r
+                                               }\r
+                                       });\r
+\r
+                                       m.update();\r
+                               });\r
+\r
+                               ed.selection.select(e.target);\r
+                               p1 = dom.getPos(e.target);\r
+                               m.showMenu(p1.x, p1.y + e.target.offsetHeight - vp.y);\r
+\r
+                               return tinymce.dom.Event.cancel(e);\r
+                       } else\r
+                               m.hideMenu();\r
+               },\r
+\r
+               _checkDone : function() {\r
+                       var t = this, ed = t.editor, dom = ed.dom, o;\r
+\r
+                       each(dom.select('span'), function(n) {\r
+                               if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) {\r
+                                       o = true;\r
+                                       return false;\r
+                               }\r
+                       });\r
 \r
-               cm.clear();\r
+                       if (!o)\r
+                               t._done();\r
+               },\r
 \r
-               if (sg != null) {\r
-                       cm.addTitle(tinyMCE.getLang('lang_spellchecker_sug', '', true));\r
+               _done : function() {\r
+                       var t = this, la = t.active;\r
 \r
-                       for (i=0; i<sg.length && i<max; i++)\r
-                               cm.addItem(sg[i], 'tinyMCE.execCommand("mceSpellCheckReplace",false,"' + sg[i] + '");');\r
+                       if (t.active) {\r
+                               t.active = 0;\r
+                               t._removeWords();\r
 \r
-                       cm.addSeparator();\r
-               } else\r
-                       cm.addTitle(tinyMCE.getLang('lang_spellchecker_no_sug', '', true));\r
+                               if (t._menu)\r
+                                       t._menu.hideMenu();\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
+                               if (la)\r
+                                       t.editor.nodeChanged();\r
+                       }\r
+               },\r
 \r
-               cm.update();\r
-       },\r
+               _sendRPC : function(m, p, cb) {\r
+                       var t = this, url = t.editor.getParam("spellchecker_rpc_url", "{backend}");\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
+                       if (url == '{backend}') {\r
+                               t.editor.setProgressState(0);\r
+                               alert('Please specify: spellchecker_rpc_url');\r
+                               return;\r
                        }\r
+\r
+                       JSONRequest.sendRPC({\r
+                               url : url,\r
+                               method : m,\r
+                               params : p,\r
+                               success : cb,\r
+                               error : function(e, x) {\r
+                                       t.editor.setProgressState(0);\r
+                                       t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText));\r
+                               }\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
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif b/program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif
deleted file mode 100644 (file)
index 294a9d2..0000000
Binary files a/program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/spellchecker/images/wline.gif b/program/js/tiny_mce/plugins/spellchecker/images/wline.gif
deleted file mode 100644 (file)
index 7d0a4db..0000000
Binary files a/program/js/tiny_mce/plugins/spellchecker/images/wline.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/spellchecker/img/wline.gif b/program/js/tiny_mce/plugins/spellchecker/img/wline.gif
new file mode 100644 (file)
index 0000000..7d0a4db
Binary files /dev/null and b/program/js/tiny_mce/plugins/spellchecker/img/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
deleted file mode 100644 (file)
index 02fdac5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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
deleted file mode 100644 (file)
index 18345e6..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-<?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
index 7171d4faa6167aaab3d2ffb589e7fffcd03dc588..60264db8e4685427feac135bda95422975c7b8c0 100644 (file)
@@ -1,85 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#table_dlg.cell_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body id="tablecell" 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
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.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
+                                       <legend>{#table_dlg.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><label for="align">{#table_dlg.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 id="align" name="align" class="mceFocus">\r
+                                                                       <option value="">{#not_set}</option>\r
+                                                                       <option value="center">{#table_dlg.align_middle}</option>\r
+                                                                       <option value="left">{#table_dlg.align_left}</option>\r
+                                                                       <option value="right">{#table_dlg.align_right}</option>\r
                                                                </select>\r
                                                        </td>\r
                \r
-                                                       <td><label for="celltype">{$lang_table_cell_type}</label></td>\r
+                                                       <td><label for="celltype">{#table_dlg.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
+                                                                       <option value="td">{#table_dlg.td}</option>\r
+                                                                       <option value="th">{#table_dlg.th}</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td><label for="valign">{#table_dlg.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
+                                                                       <option value="">{#not_set}</option>\r
+                                                                       <option value="top">{#table_dlg.align_top}</option>\r
+                                                                       <option value="middle">{#table_dlg.align_middle}</option>\r
+                                                                       <option value="bottom">{#table_dlg.align_bottom}</option>\r
                                                                </select>\r
                                                        </td>\r
 \r
-                                                       <td><label for="scope">{$lang_table_scope}</label></td>\r
+                                                       <td><label for="scope">{#table_dlg.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
+                                                                       <option value="">{#not_set}</option>\r
+                                                                       <option value="col">{#table.col}</option>\r
+                                                                       <option value="row">{#table.row}</option>\r
+                                                                       <option value="rowgroup">{#table_dlg.rowgroup}</option>\r
+                                                                       <option value="colgroup">{#table_dlg.colgroup}</option>\r
                                                                </select>\r
                                                        </td>\r
 \r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="width">{$lang_table_width}</label></td>\r
+                                                       <td><label for="width">{#table_dlg.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><label for="height">{#table_dlg.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><label for="class">{#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 id="class" name="class" class="mceEditableSelect">\r
+                                                                       <option value="" selected="selected">{#not_set}</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\r
 \r
                        <div id="advanced_panel" class="panel">\r
                                <fieldset>\r
-                                       <legend>{$lang_table_advanced_props}</legend>\r
+                                       <legend>{#table_dlg.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 class="column1"><label for="id">{#table_dlg.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><label for="style">{#table_dlg.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 class="column1"><label for="dir">{#table_dlg.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
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="ltr">{#table_dlg.ltr}</option> \r
+                                                                               <option value="rtl">{#table_dlg.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 class="column1"><label for="lang">{#table_dlg.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 class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\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
+                                       <option value="cell">{#table_dlg.cell_cell}</option>\r
+                                       <option value="row">{#table_dlg.cell_row}</option>\r
+                                       <option value="all">{#table_dlg.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><input type="submit" id="insert" name="insert" value="{#update}" /></div>\r
                        </div>\r
 \r
                        <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                        </div>\r
                </div>\r
        </form>\r
index a47cc1a1efef90071555ae700a4b51ba9bd02980..a067ecdfedbc8a1140bec2ec0d3b2c24e6ceb8fc 100644 (file)
@@ -1,17 +1,17 @@
-/* CSS file for cell dialog in the table plugin */
-
-.panel_wrapper div.current {
-       height: 200px;
-}
-
-.advfield {
-       width: 200px;
-}
-
-#action {
-       margin-bottom: 3px;
-}
-
-#class {
-       width: 150px;
+/* 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
index 0e397db3e25fcd65e36317bf37d28bafa09d00b8..1f7755dafa8eb34a1604c80fa4a92a7626b8bc2b 100644 (file)
@@ -1,25 +1,25 @@
-/* CSS file for row dialog in the table plugin */
-
-.panel_wrapper div.current {
-       height: 200px;
-}
-
-.advfield {
-       width: 200px;
-}
-
-#action {
-       margin-bottom: 3px;
-}
-
-#rowtype,#align,#valign,#class,#height {
-       width: 150px;
-}
-
-#height {
-       width: 50px;    
-}
-
-.col2 {
-       padding-left: 20px;
-}
+/* 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
index 82bb548ca90055efef7fb5e1f882940773fc3138..d11c3f69cba0a9469303f2ac9e159b3dc8e3fc51 100644 (file)
@@ -1,13 +1,13 @@
-/* CSS file for table dialog in the table plugin */
-
-.panel_wrapper div.current {
-       height: 220px;
-}
-
-.advfield {
-       width: 200px;
-}
-
-#class {
-       width: 150px;
-}
+/* CSS file for table dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 245px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}\r
index 2f308f868e60719368cee9ac84f17c9825863b1a..0bf51b9d33c970ba301f36d5001debe223a37674 100644 (file)
@@ -1 +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
+(function(){var each=tinymce.each;tinymce.create('tinymce.plugins.TablePlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;each([['table','table.desc','mceInsertTable',true],['delete_table','table.del','mceTableDelete'],['delete_col','table.delete_col_desc','mceTableDeleteCol'],['delete_row','table.delete_row_desc','mceTableDeleteRow'],['col_after','table.col_after_desc','mceTableInsertColAfter'],['col_before','table.col_before_desc','mceTableInsertColBefore'],['row_after','table.row_after_desc','mceTableInsertRowAfter'],['row_before','table.row_before_desc','mceTableInsertRowBefore'],['row_props','table.row_desc','mceTableRowProps',true],['cell_props','table.cell_desc','mceTableCellProps',true],['split_cells','table.split_cells_desc','mceTableSplitCells',true],['merge_cells','table.merge_cells_desc','mceTableMergeCells',true]],function(c){ed.addButton(c[0],{title:c[1],cmd:c[2],ui:c[3]});});ed.onInit.add(function(){if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){var sm,se=ed.selection,el=se.getNode()||ed.getBody();if(ed.dom.getParent(e,'td')||ed.dom.getParent(e,'th')){m.removeAll();if(el.nodeName=='A'&&!ed.dom.getAttrib(el,'name')){m.add({title:'advanced.link_desc',icon:'link',cmd:ed.plugins.advlink?'mceAdvLink':'mceLink',ui:true});m.add({title:'advanced.unlink_desc',icon:'unlink',cmd:'UnLink'});m.addSeparator();}if(el.nodeName=='IMG'&&el.className.indexOf('mceItem')==-1){m.add({title:'advanced.image_desc',icon:'image',cmd:ed.plugins.advimage?'mceAdvImage':'mceImage',ui:true});m.addSeparator();}m.add({title:'table.desc',icon:'table',cmd:'mceInsertTable',ui:true,value:{action:'insert'}});m.add({title:'table.props_desc',icon:'table_props',cmd:'mceInsertTable',ui:true});m.add({title:'table.del',icon:'delete_table',cmd:'mceTableDelete',ui:true});m.addSeparator();sm=m.addMenu({title:'table.cell'});sm.add({title:'table.cell_desc',icon:'cell_props',cmd:'mceTableCellProps',ui:true});sm.add({title:'table.split_cells_desc',icon:'split_cells',cmd:'mceTableSplitCells',ui:true});sm.add({title:'table.merge_cells_desc',icon:'merge_cells',cmd:'mceTableMergeCells',ui:true});sm=m.addMenu({title:'table.row'});sm.add({title:'table.row_desc',icon:'row_props',cmd:'mceTableRowProps',ui:true});sm.add({title:'table.row_before_desc',icon:'row_before',cmd:'mceTableInsertRowBefore'});sm.add({title:'table.row_after_desc',icon:'row_after',cmd:'mceTableInsertRowAfter'});sm.add({title:'table.delete_row_desc',icon:'delete_row',cmd:'mceTableDeleteRow'});sm.addSeparator();sm.add({title:'table.cut_row_desc',icon:'cut',cmd:'mceTableCutRow'});sm.add({title:'table.copy_row_desc',icon:'copy',cmd:'mceTableCopyRow'});sm.add({title:'table.paste_row_before_desc',icon:'paste',cmd:'mceTablePasteRowBefore'});sm.add({title:'table.paste_row_after_desc',icon:'paste',cmd:'mceTablePasteRowAfter'});sm=m.addMenu({title:'table.col'});sm.add({title:'table.col_before_desc',icon:'col_before',cmd:'mceTableInsertColBefore'});sm.add({title:'table.col_after_desc',icon:'col_after',cmd:'mceTableInsertColAfter'});sm.add({title:'table.delete_col_desc',icon:'delete_col',cmd:'mceTableDeleteCol'});}else m.add({title:'table.desc',icon:'table',cmd:'mceInsertTable',ui:true});});}});ed.onKeyDown.add(function(ed,e){if(e.keyCode==9&&ed.dom.getParent(ed.selection.getNode(),'TABLE'))ed.undoManager.add();});ed.onNodeChange.add(function(ed,cm,n){var p=ed.dom.getParent(n,'td,th,caption');cm.setActive('table',!!p);if(p&&p.nodeName==='CAPTION')p=null;cm.setDisabled('delete_table',!p);cm.setDisabled('delete_col',!p);cm.setDisabled('delete_table',!p);cm.setDisabled('delete_row',!p);cm.setDisabled('col_after',!p);cm.setDisabled('col_before',!p);cm.setDisabled('row_after',!p);cm.setDisabled('row_before',!p);cm.setDisabled('row_props',!p);cm.setDisabled('cell_props',!p);cm.setDisabled('split_cells',!p||(parseInt(ed.dom.getAttrib(p,'colspan','1'))<2&&parseInt(ed.dom.getAttrib(p,'rowspan','1'))<2));cm.setDisabled('merge_cells',!p);});if(!tinymce.isIE){ed.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g,tinymce.isOpera?'<$1$2>&nbsp;</$1>':'<$1$2><br mce_bogus="1" /></$1>');});}},execCommand:function(cmd,ui,val){var ed=this.editor,b;switch(cmd){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":ed.execCommand('mceBeginUndoLevel');this._doExecCommand(cmd,ui,val);ed.execCommand('mceEndUndoLevel');return true;}return false;},getInfo:function(){return{longname:'Tables',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_doExecCommand:function(command,user_interface,value){var inst=this.editor,ed=inst,url=this.url;var focusElm=inst.selection.getNode();var trElm=inst.dom.getParent(focusElm,"tr");var tdElm=inst.dom.getParent(focusElm,"td,th");var tableElm=inst.dom.getParent(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 select(dx,dy){var td;grid=getTableGrid(tableElm);dx=dx||0;dy=dy||0;dx=Math.max(cpos.cellindex+dx,0);dy=Math.max(cpos.rowindex+dy,0);inst.execCommand('mceRepaint');td=getCell(grid,dy,dx);if(td){inst.selection.select(td.firstChild||td);inst.selection.collapse(1);}};function makeTD(){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';}function getColRowSpan(td){var colspan=inst.dom.getAttrib(td,"colspan");var rowspan=inst.dom.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=[],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]=[];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");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';if(tinymce.isIE)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=inst.dom.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");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';}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){inst.windowManager.open({url:url+'/row.htm',width:400+parseInt(inst.getLang('table.rowprops_delta_width',0)),height:295+parseInt(inst.getLang('table.rowprops_delta_height',0)),inline:1},{plugin_url:url});}return true;case"mceTableCellProps":if(tdElm==null)return true;if(user_interface){inst.windowManager.open({url:url+'/cell.htm',width:400+parseInt(inst.getLang('table.cellprops_delta_width',0)),height:295+parseInt(inst.getLang('table.cellprops_delta_height',0)),inline:1},{plugin_url:url});}return true;case"mceInsertTable":if(user_interface){inst.windowManager.open({url:url+'/table.htm',width:400+parseInt(inst.getLang('table.table_delta_width',0)),height:320+parseInt(inst.getLang('table.table_delta_height',0)),inline:1},{plugin_url:url,action:value?value.action:0});}return true;case"mceTableDelete":var table=inst.dom.getParent(inst.selection.getNode(),"table");if(table){table.parentNode.removeChild(table);inst.execCommand('mceRepaint');}return true;case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":if(!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");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}trElm.parentNode.insertBefore(newTR,trElm);select(0,1);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");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';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);}select(0,1);break;case"mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1){inst.dom.remove(inst.dom.getParent(tableElm,"table"));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);select(0,-1);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);if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm);}else tdElm.colSpan++;lastTDElm=tdElm;}}select();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);if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';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;}}select(1);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){inst.dom.remove(inst.dom.getParent(tableElm,"table"));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;}}select(-1);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");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';trElm.insertBefore(newTD,nextElm(tdElm,"TD,TH"));if(rowspan>1)addRows(newTD,trElm,rowspan);}addRows(tdElm,trElm,rowspan);}tableElm=inst.dom.getParent(inst.selection.getNode(),"table");break;case"mceTableMergeCells":var rows=[];var sel=inst.selection.getSel();var grid=getTableGrid(tableElm);if(tinymce.isIE||sel.rangeCount==1){if(user_interface){var sp=getColRowSpan(tdElm);inst.windowManager.open({url:url+'/merge_cells.htm',width:240+parseInt(inst.getLang('table.merge_cells_delta_width',0)),height:110+parseInt(inst.getLang('table.merge_cells_delta_height',0)),inline:1},{action:"update",numcols:sp.colspan,numrows:sp.rowspan,plugin_url:url});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=[];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;var td=getCell(grid,cpos.rowindex,cpos.cellindex);each(ed.dom.select('br',td),function(e,i){if(i>0&&ed.dom.getAttrib('mce_bogus'))ed.dom.remove(e);});}}}else{var cells=[];var sel=inst.selection.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=[];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=[];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=html.replace(/[ \t\r\n]/g,"");if(chk!="<br/>"&&chk!="<br>"&&chk!='<br mce_bogus="1"/>'&&(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--;}}}}each(ed.dom.select('br',tdElm),function(e,i){if(i>0&&ed.dom.getAttrib(e,'mce_bogus'))ed.dom.remove(e);});break;}tableElm=inst.dom.getParent(inst.selection.getNode(),"table");inst.addVisual(tableElm);inst.nodeChanged();}return true;}return false;}});tinymce.PluginManager.add('table',tinymce.plugins.TablePlugin);})();
\ No newline at end of file
index 75aaa4deca39fde0d08c9e49c63ce59eec6428f0..0baafb1f6911622462d0ac911a48483437a376a0 100644 (file)
 /**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ * $Id: editor_plugin_src.js 768 2008-04-04 13:52:49Z spocke $\r
  *\r
  * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ * @copyright Copyright © 2004-2008, 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
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.plugins.TablePlugin', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+                       t.url = url;\r
+\r
+                       // Register buttons\r
+                       each([\r
+                               ['table', 'table.desc', 'mceInsertTable', true],\r
+                               ['delete_table', 'table.del', 'mceTableDelete'],\r
+                               ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],\r
+                               ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],\r
+                               ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],\r
+                               ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],\r
+                               ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],\r
+                               ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],\r
+                               ['row_props', 'table.row_desc', 'mceTableRowProps', true],\r
+                               ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],\r
+                               ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],\r
+                               ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]\r
+                       ], function(c) {\r
+                               ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});\r
+                       });\r
+\r
+                       ed.onInit.add(function() {\r
+                               if (ed && ed.plugins.contextmenu) {\r
+                                       ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {\r
+                                               var sm, se = ed.selection, el = se.getNode() || ed.getBody();\r
+\r
+                                               if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {\r
+                                                       m.removeAll();\r
+\r
+                                                       if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {\r
+                                                               m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});\r
+                                                               m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});\r
+                                                               m.addSeparator();\r
+                                                       }\r
 \r
-               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
+                                                       if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {\r
+                                                               m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});\r
+                                                               m.addSeparator();\r
+                                                       }\r
 \r
-               // 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
+                                                       m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true, value : {action : 'insert'}});\r
+                                                       m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable', ui : true});\r
+                                                       m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete', ui : true});\r
+                                                       m.addSeparator();\r
+\r
+                                                       // Cell menu\r
+                                                       sm = m.addMenu({title : 'table.cell'});\r
+                                                       sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps', ui : true});\r
+                                                       sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells', ui : true});\r
+                                                       sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells', ui : true});\r
+\r
+                                                       // Row menu\r
+                                                       sm = m.addMenu({title : 'table.row'});\r
+                                                       sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps', ui : true});\r
+                                                       sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});\r
+                                                       sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});\r
+                                                       sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});\r
+                                                       sm.addSeparator();\r
+                                                       sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});\r
+                                                       sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});\r
+                                                       sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'});\r
+                                                       sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'});\r
+\r
+                                                       // Column menu\r
+                                                       sm = m.addMenu({title : 'table.col'});\r
+                                                       sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});\r
+                                                       sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});\r
+                                                       sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});\r
+                                               } else\r
+                                                       m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true});\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       // Add undo level when new rows are created using the tab key\r
+                       ed.onKeyDown.add(function(ed, e) {\r
+                               if (e.keyCode == 9 && ed.dom.getParent(ed.selection.getNode(), 'TABLE'))\r
+                                       ed.undoManager.add();\r
+                       });\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               var p = ed.dom.getParent(n, 'td,th,caption');\r
+\r
+                               cm.setActive('table', !!p);\r
+                               if (p && p.nodeName === 'CAPTION')\r
+                                       p = null;\r
+\r
+                               cm.setDisabled('delete_table', !p);\r
+                               cm.setDisabled('delete_col', !p);\r
+                               cm.setDisabled('delete_table', !p);\r
+                               cm.setDisabled('delete_row', !p);\r
+                               cm.setDisabled('col_after', !p);\r
+                               cm.setDisabled('col_before', !p);\r
+                               cm.setDisabled('row_after', !p);\r
+                               cm.setDisabled('row_before', !p);\r
+                               cm.setDisabled('row_props', !p);\r
+                               cm.setDisabled('cell_props', !p);\r
+                               cm.setDisabled('split_cells', !p || (parseInt(ed.dom.getAttrib(p, 'colspan', '1')) < 2 && parseInt(ed.dom.getAttrib(p, 'rowspan', '1')) < 2));\r
+                               cm.setDisabled('merge_cells', !p);\r
+                       });\r
+\r
+                       // Padd empty table cells\r
+                       if (!tinymce.isIE) {\r
+                               ed.onBeforeSetContent.add(function(ed, o) {\r
+                                       if (o.initial)\r
+                                               o.content = o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g, tinymce.isOpera ? '<$1$2>&nbsp;</$1>' : '<$1$2><br mce_bogus="1" /></$1>');\r
+                               });\r
+                       }\r
+               },\r
+\r
+               execCommand : function(cmd, ui, val) {\r
+                       var ed = this.editor, b;\r
+\r
+                       // Is table command\r
+                       switch (cmd) {\r
+                               case "mceInsertTable":\r
+                               case "mceTableRowProps":\r
+                               case "mceTableCellProps":\r
+                               case "mceTableSplitCells":\r
+                               case "mceTableMergeCells":\r
+                               case "mceTableInsertRowBefore":\r
+                               case "mceTableInsertRowAfter":\r
+                               case "mceTableDeleteRow":\r
+                               case "mceTableInsertColBefore":\r
+                               case "mceTableInsertColAfter":\r
+                               case "mceTableDeleteCol":\r
+                               case "mceTableCutRow":\r
+                               case "mceTableCopyRow":\r
+                               case "mceTablePasteRowBefore":\r
+                               case "mceTablePasteRowAfter":\r
+                               case "mceTableDelete":\r
+                                       ed.execCommand('mceBeginUndoLevel');\r
+                                       this._doExecCommand(cmd, ui, val);\r
+                                       ed.execCommand('mceEndUndoLevel');\r
 \r
-               return "";\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
+                                       return true;\r
+                       }\r
 \r
-                               return true;\r
-               }\r
+                       // Pass to next handler in chain\r
+                       return false;\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Tables',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               },\r
+\r
+               // Private plugin internal methods\r
+\r
+               /**\r
+                * Executes the table commands.\r
+                */\r
+               _doExecCommand : function(command, user_interface, value) {\r
+                       var inst = this.editor, ed = inst, url = this.url;\r
+                       var focusElm = inst.selection.getNode();\r
+                       var trElm = inst.dom.getParent(focusElm, "tr");\r
+                       var tdElm = inst.dom.getParent(focusElm, "td,th");\r
+                       var tableElm = inst.dom.getParent(focusElm, "table");\r
+                       var doc = inst.contentWindow.document;\r
+                       var tableBorder = tableElm ? tableElm.getAttribute("border") : "";\r
+\r
+                       // Get first TD if no TD found\r
+                       if (trElm && tdElm == null)\r
+                               tdElm = trElm.cells[0];\r
+\r
+                       function inArray(ar, v) {\r
+                               for (var i=0; i<ar.length; i++) {\r
+                                       // Is array\r
+                                       if (ar[i].length > 0 && inArray(ar[i], v))\r
+                                               return true;\r
+\r
+                                       // Found value\r
+                                       if (ar[i] == v)\r
+                                               return true;\r
+                               }\r
 \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
+                               return false;\r
+                       }\r
 \r
-               // Within a tr element\r
-               if (tinyMCE.getParentElement(node, "tr"))\r
-                       tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonSelected');\r
+                       function select(dx, dy) {\r
+                               var td;\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
+                               grid = getTableGrid(tableElm);\r
+                               dx = dx || 0;\r
+                               dy = dy || 0;\r
+                               dx = Math.max(cpos.cellindex + dx, 0);\r
+                               dy = Math.max(cpos.rowindex + dy, 0);\r
 \r
-       // Private plugin internal methods\r
+                               // Recalculate grid and select\r
+                               inst.execCommand('mceRepaint');\r
+                               td = getCell(grid, dy, dx);\r
 \r
-       _mouseDownHandler : function(e) {\r
-               var elm = tinyMCE.isMSIE ? event.srcElement : e.target;\r
-               var focusElm = tinyMCE.selectedInstance.getFocusElement();\r
+                               if (td) {\r
+                                       inst.selection.select(td.firstChild || td);\r
+                                       inst.selection.collapse(1);\r
+                               }\r
+                       };\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
+                       function makeTD() {\r
+                               var newTD = doc.createElement("td");\r
 \r
-                               // Found value\r
-                               if (ar[i] == v)\r
-                                       return true;\r
+                               if (!tinymce.isIE)\r
+                                       newTD.innerHTML = '<br mce_bogus="1"/>';\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
+                       function getColRowSpan(td) {\r
+                               var colspan = inst.dom.getAttrib(td, "colspan");\r
+                               var rowspan = inst.dom.getAttrib(td, "rowspan");\r
 \r
-                       colspan = colspan == "" ? 1 : parseInt(colspan);\r
-                       rowspan = rowspan == "" ? 1 : parseInt(rowspan);\r
+                               colspan = colspan == "" ? 1 : parseInt(colspan);\r
+                               rowspan = rowspan == "" ? 1 : parseInt(rowspan);\r
 \r
-                       return {colspan : colspan, rowspan : rowspan};\r
-               }\r
+                               return {colspan : colspan, rowspan : rowspan};\r
+                       }\r
 \r
-               function getCellPos(grid, td) {\r
-                       var x, y;\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
+                               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
 \r
-                       return null;\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
+                       function getCell(grid, row, col) {\r
+                               if (grid[row] && grid[row][col])\r
+                                       return grid[row][col];\r
 \r
-                       return null;\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
+                       function getTableGrid(table) {\r
+                               var grid = [], 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
+                               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
+                                               // 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
+                                               // Fill box\r
+                                               for (y2=y; y2<y+sd['rowspan']; y2++) {\r
+                                                       if (!grid[y2])\r
+                                                               grid[y2] = [];\r
 \r
-                                               for (x2=xstart; x2<xstart+sd['colspan']; x2++)\r
-                                                       grid[y2][x2] = td;\r
+                                                       for (x2=xstart; x2<xstart+sd['colspan']; x2++)\r
+                                                               grid[y2][x2] = td;\r
+                                               }\r
                                        }\r
                                }\r
+\r
+                               return grid;\r
                        }\r
 \r
-                       return grid;\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
-               function trimRow(table, tr, td, new_tr) {\r
-                       var grid = getTableGrid(table), cpos = getCellPos(grid, td);\r
-                       var cells, lastElm;\r
-\r
-                       // Time to crop away some\r
-                       if (new_tr.cells.length != tr.childNodes.length) {\r
-                               cells = tr.childNodes;\r
-                               lastElm = null;\r
-\r
-                               for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {\r
-                                       var remove = true;\r
-                                       var sd = getColRowSpan(td);\r
-\r
-                                       // Remove due to rowspan\r
-                                       if (inArray(cells, td)) {\r
-                                               new_tr.childNodes[x]._delete = true;\r
-                                       } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan\r
-                                               for (var i=x; i<x+td.colSpan; i++)\r
-                                                       new_tr.childNodes[i]._delete = true;\r
-                                       }\r
+                                               if ((lastElm == null || td != lastElm) && sd.rowspan > 1)\r
+                                                       td.rowSpan = sd.rowspan + 1;\r
 \r
-                                       if ((lastElm == null || td != lastElm) && sd.rowspan > 1)\r
-                                               td.rowSpan = sd.rowspan + 1;\r
+                                               lastElm = td;\r
+                                       }\r
 \r
-                                       lastElm = td;\r
+                                       deleteMarked(tableElm);\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
+                       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
+                               return null;\r
+                       }\r
 \r
-               function nextElm(node, names) {\r
-                       var namesAr = names.split(',');\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
+                               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
-                       return null;\r
-               }\r
+                       function deleteMarked(tbl) {\r
+                               if (tbl.rows == 0)\r
+                                       return;\r
 \r
-               function deleteMarked(tbl) {\r
-                       if (tbl.rows == 0)\r
-                               return;\r
+                               var tr = tbl.rows[0];\r
+                               do {\r
+                                       var next = nextElm(tr, "TR");\r
 \r
-                       var tr = tbl.rows[0];\r
-                       do {\r
-                               var next = nextElm(tr, "TR");\r
+                                       // Delete row\r
+                                       if (tr._delete) {\r
+                                               tr.parentNode.removeChild(tr);\r
+                                               continue;\r
+                                       }\r
 \r
-                               // Delete row\r
-                               if (tr._delete) {\r
-                                       tr.parentNode.removeChild(tr);\r
-                                       continue;\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
-                               // Delete cells\r
-                               var td = tr.cells[0];\r
-                               if (td.cells > 1) {\r
-                                       do {\r
-                                               var nexttd = nextElm(td, "TD,TH");\r
+                                                       if (td._delete)\r
+                                                               td.parentNode.removeChild(td);\r
+                                               } while ((td = nexttd) != null);\r
+                                       }\r
+                               } while ((tr = next) != null);\r
+                       }\r
 \r
-                                               if (td._delete)\r
-                                                       td.parentNode.removeChild(td);\r
-                                       } while ((td = nexttd) != null);\r
-                               }\r
-                       } while ((tr = next) != null);\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
 \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
+                                       if (!tinymce.isIE)\r
+                                               newTD.innerHTML = '<br mce_bogus="1"/>';\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
+                                       if (tinymce.isIE)\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
+                                       trNext = nextElm(trNext, "TR");\r
+                               }\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
+                       function copyRow(doc, table, tr) {\r
+                               var grid = getTableGrid(table);\r
+                               var newTR = tr.cloneNode(false);\r
+                               var cpos = getCellPos(grid, tr.cells[0]);\r
+                               var lastCell = null;\r
+                               var tableBorder = inst.dom.getAttrib(table, "border");\r
+                               var tdElm = null;\r
+\r
+                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                       var newTD = null;\r
+\r
+                                       if (lastCell != tdElm) {\r
+                                               for (var i=0; i<tr.cells.length; i++) {\r
+                                                       if (tdElm == tr.cells[i]) {\r
+                                                               newTD = tdElm.cloneNode(true);\r
+                                                               break;\r
+                                                       }\r
                                                }\r
                                        }\r
-                               }\r
 \r
-                               if (newTD == null) {\r
-                                       newTD = doc.createElement("td");\r
-                                       newTD.innerHTML = "&nbsp;";\r
-                               }\r
+                                       if (newTD == null) {\r
+                                               newTD = doc.createElement("td");\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
+                                               if (!tinymce.isIE)\r
+                                                       newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                                       }\r
 \r
-               // ---- Commands -----\r
+                                       // Reset col/row span\r
+                                       newTD.colSpan = 1;\r
+                                       newTD.rowSpan = 1;\r
 \r
-               // Handle commands\r
-               switch (command) {\r
-                       case "mceTableRowProps":\r
-                               if (trElm == null)\r
-                                       return true;\r
+                                       newTR.appendChild(newTD);\r
 \r
-                               if (user_interface) {\r
-                                       // Setup template\r
-                                       var template = new Array();\r
+                                       lastCell = tdElm;\r
+                               }\r
 \r
-                                       template['file'] = '../../plugins/table/row.htm';\r
-                                       template['width'] = 380;\r
-                                       template['height'] = 295;\r
+                               return newTR;\r
+                       }\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
+                       // ---- Commands -----\r
+\r
+                       // Handle commands\r
+                       switch (command) {\r
+                               case "mceTableRowProps":\r
+                                       if (trElm == null)\r
+                                               return true;\r
+\r
+                                       if (user_interface) {\r
+                                               inst.windowManager.open({\r
+                                                       url : url + '/row.htm',\r
+                                                       width : 400 + parseInt(inst.getLang('table.rowprops_delta_width', 0)),\r
+                                                       height : 295 + parseInt(inst.getLang('table.rowprops_delta_height', 0)),\r
+                                                       inline : 1\r
+                                               }, {\r
+                                                       plugin_url : url\r
+                                               });\r
+                                       }\r
 \r
-                                       // Open window\r
-                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
-                               }\r
+                                       return true;\r
 \r
-                               return true;\r
+                               case "mceTableCellProps":\r
+                                       if (tdElm == null)\r
+                                               return true;\r
+\r
+                                       if (user_interface) {\r
+                                               inst.windowManager.open({\r
+                                                       url : url + '/cell.htm',\r
+                                                       width : 400 + parseInt(inst.getLang('table.cellprops_delta_width', 0)),\r
+                                                       height : 295 + parseInt(inst.getLang('table.cellprops_delta_height', 0)),\r
+                                                       inline : 1\r
+                                               }, {\r
+                                                       plugin_url : url\r
+                                               });\r
+                                       }\r
 \r
-                       case "mceTableCellProps":\r
-                               if (tdElm == null)\r
                                        return true;\r
 \r
-                               if (user_interface) {\r
-                                       // Setup template\r
-                                       var template = new Array();\r
+                               case "mceInsertTable":\r
+                                       if (user_interface) {\r
+                                               inst.windowManager.open({\r
+                                                       url : url + '/table.htm',\r
+                                                       width : 400 + parseInt(inst.getLang('table.table_delta_width', 0)),\r
+                                                       height : 320 + parseInt(inst.getLang('table.table_delta_height', 0)),\r
+                                                       inline : 1\r
+                                               }, {\r
+                                                       plugin_url : url,\r
+                                                       action : value ? value.action : 0\r
+                                               });\r
+                                       }\r
 \r
-                                       template['file'] = '../../plugins/table/cell.htm';\r
-                                       template['width'] = 380;\r
-                                       template['height'] = 295;\r
+                                       return true;\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
+                               case "mceTableDelete":\r
+                                       var table = inst.dom.getParent(inst.selection.getNode(), "table");\r
+                                       if (table) {\r
+                                               table.parentNode.removeChild(table);\r
+                                               inst.execCommand('mceRepaint');\r
+                                       }\r
+                                       return true;\r
 \r
-                                       // Open window\r
-                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\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
-                               return true;\r
+                                                               inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
+                                                               inst.execCommand("mceTableDeleteRow");\r
+                                                               break;\r
 \r
-                       case "mceInsertTable":\r
-                               if (user_interface) {\r
-                                       // Setup template\r
-                                       var template = new Array();\r
+                                                       case "mceTableCopyRow":\r
+                                                               if (!trElm || !tdElm)\r
+                                                                       return true;\r
 \r
-                                       template['file'] = '../../plugins/table/table.htm';\r
-                                       template['width'] = 380;\r
-                                       template['height'] = 295;\r
+                                                               inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
+                                                               break;\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
+                                                       case "mceTablePasteRowBefore":\r
+                                                               if (!trElm || !tdElm)\r
+                                                                       return true;\r
 \r
-                                       // Open window\r
-                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : value});\r
-                               }\r
+                                                               var newTR = inst.tableRowClipboard.cloneNode(true);\r
 \r
-                               return true;\r
+                                                               var prevTR = prevElm(trElm, "TR");\r
+                                                               if (prevTR != null)\r
+                                                                       trimRow(tableElm, prevTR, prevTR.cells[0], newTR);\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
+                                                               trElm.parentNode.insertBefore(newTR, trElm);\r
+                                                               break;\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
+                                                       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
-                               // 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
+                                                               trimRow(tableElm, trElm, tdElm, newTR);\r
 \r
-                               if (tableElm && trElm) {\r
-                                       switch (command) {\r
-                                               case "mceTableCutRow":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                               if (nextTR == null)\r
+                                                                       trElm.parentNode.appendChild(newTR);\r
+                                                               else\r
+                                                                       nextTR.parentNode.insertBefore(newTR, nextTR);\r
 \r
-                                                       inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
-                                                       inst.execCommand("mceTableDeleteRow");\r
-                                                       break;\r
+                                                               break;\r
 \r
-                                               case "mceTableCopyRow":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                       case "mceTableInsertRowBefore":\r
+                                                               if (!trElm || !tdElm)\r
+                                                                       return true;\r
 \r
-                                                       inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
-                                                       break;\r
+                                                               var grid = getTableGrid(tableElm);\r
+                                                               var cpos = getCellPos(grid, tdElm);\r
+                                                               var newTR = doc.createElement("tr");\r
+                                                               var lastTDElm = null;\r
 \r
-                                               case "mceTablePasteRowBefore":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                               cpos.rowindex--;\r
+                                                               if (cpos.rowindex < 0)\r
+                                                                       cpos.rowindex = 0;\r
 \r
-                                                       var newTR = inst.tableRowClipboard.cloneNode(true);\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
-                                                       var prevTR = prevElm(trElm, "TR");\r
-                                                       if (prevTR != null)\r
-                                                               trimRow(tableElm, prevTR, prevTR.cells[0], newTR);\r
+                                                                               if (sd['rowspan'] == 1) {\r
+                                                                                       var newTD = doc.createElement("td");\r
 \r
-                                                       trElm.parentNode.insertBefore(newTR, trElm);\r
-                                                       break;\r
+                                                                                       if (!tinymce.isIE)\r
+                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\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
+                                                                                       newTD.colSpan = tdElm.colSpan;\r
 \r
-                                                       trimRow(tableElm, trElm, tdElm, newTR);\r
+                                                                                       newTR.appendChild(newTD);\r
+                                                                               } else\r
+                                                                                       tdElm.rowSpan = sd['rowspan'] + 1;\r
 \r
-                                                       if (nextTR == null)\r
-                                                               trElm.parentNode.appendChild(newTR);\r
-                                                       else\r
-                                                               nextTR.parentNode.insertBefore(newTR, nextTR);\r
+                                                                               lastTDElm = tdElm;\r
+                                                                       }\r
+                                                               }\r
 \r
+                                                               trElm.parentNode.insertBefore(newTR, trElm);\r
+                                                               select(0, 1);\r
                                                        break;\r
 \r
-                                               case "mceTableInsertRowBefore":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\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
+                                                               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
+                                                               // 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
-                                                       // Create cells\r
-                                                       for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
-                                                               if (tdElm != lastTDElm) {\r
-                                                                       var sd = getColRowSpan(tdElm);\r
+                                                                               if (sd['rowspan'] == 1) {\r
+                                                                                       var newTD = doc.createElement("td");\r
 \r
-                                                                       if (sd['rowspan'] == 1) {\r
-                                                                               var newTD = doc.createElement("td");\r
+                                                                                       if (!tinymce.isIE)\r
+                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
 \r
-                                                                               newTD.innerHTML = "&nbsp;";\r
-                                                                               newTD.colSpan = tdElm.colSpan;\r
+                                                                                       newTD.colSpan = tdElm.colSpan;\r
 \r
-                                                                               newTR.appendChild(newTD);\r
-                                                                       } else\r
-                                                                               tdElm.rowSpan = sd['rowspan'] + 1;\r
+                                                                                       newTR.appendChild(newTD);\r
+                                                                               } else\r
+                                                                                       tdElm.rowSpan = sd['rowspan'] + 1;\r
 \r
-                                                                       lastTDElm = tdElm;\r
+                                                                               lastTDElm = tdElm;\r
+                                                                       }\r
                                                                }\r
-                                                       }\r
 \r
-                                                       trElm.parentNode.insertBefore(newTR, trElm);\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 + 1, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
-                                               break;\r
+                                                               select(0, 1);\r
+                                                       break;\r
 \r
-                                               case "mceTableInsertRowAfter":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                       case "mceTableDeleteRow":\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
+                                                               var grid = getTableGrid(tableElm);\r
+                                                               var cpos = getCellPos(grid, tdElm);\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
+                                                               // Only one row, remove whole table\r
+                                                               if (grid.length == 1) {\r
+                                                                       inst.dom.remove(inst.dom.getParent(tableElm, "table"));\r
+                                                                       return true;\r
+                                                               }\r
 \r
-                                                                       if (sd['rowspan'] == 1) {\r
-                                                                               var newTD = doc.createElement("td");\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.innerHTML = "&nbsp;";\r
-                                                                               newTD.colSpan = tdElm.colSpan;\r
+                                                                               newTD.rowSpan = sd.rowspan - 1;\r
 \r
-                                                                               newTR.appendChild(newTD);\r
-                                                                       } else\r
-                                                                               tdElm.rowSpan = sd['rowspan'] + 1;\r
+                                                                               var nextTD = nextTR.cells[x];\r
 \r
-                                                                       lastTDElm = tdElm;\r
+                                                                               if (nextTD == null)\r
+                                                                                       nextTR.appendChild(newTD);\r
+                                                                               else\r
+                                                                                       nextTR.insertBefore(newTD, nextTD);\r
+                                                                       }\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
+                                                               // 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
-                                                       grid = getTableGrid(tableElm);\r
-                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
-                                               break;\r
+                                                                               if (sd.rowspan > 1) {\r
+                                                                                       tdElm.rowSpan = sd.rowspan - 1;\r
+                                                                               } else {\r
+                                                                                       trElm = tdElm.parentNode;\r
 \r
-                                               case "mceTableDeleteRow":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                                                       if (trElm.parentNode)\r
+                                                                                               trElm._delete = true;\r
+                                                                               }\r
 \r
-                                                       var grid = getTableGrid(tableElm);\r
-                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                                               lastTDElm = tdElm;\r
+                                                                       }\r
+                                                               }\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
+                                                               deleteMarked(tableElm);\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
+                                                               select(0, -1);\r
+                                                       break;\r
 \r
-                                                                       newTD.rowSpan = sd.rowspan - 1;\r
+                                                       case "mceTableInsertColBefore":\r
+                                                               if (!trElm || !tdElm)\r
+                                                                       return true;\r
 \r
-                                                                       var nextTD = nextTR.cells[x];\r
+                                                               var grid = getTableGrid(tableElm);\r
+                                                               var cpos = getCellPos(grid, tdElm);\r
+                                                               var lastTDElm = null;\r
 \r
-                                                                       if (nextTD == null)\r
-                                                                               nextTR.appendChild(newTD);\r
-                                                                       else\r
-                                                                               nextTR.insertBefore(newTD, nextTD);\r
-                                                               }\r
-                                                       }\r
+                                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                                       if (tdElm != lastTDElm) {\r
+                                                                               var sd = getColRowSpan(tdElm);\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
+                                                                               if (sd['colspan'] == 1) {\r
+                                                                                       var newTD = doc.createElement(tdElm.nodeName);\r
 \r
-                                                                       if (sd.rowspan > 1) {\r
-                                                                               tdElm.rowSpan = sd.rowspan - 1;\r
-                                                                       } else {\r
-                                                                               trElm = tdElm.parentNode;\r
+                                                                                       if (!tinymce.isIE)\r
+                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
 \r
-                                                                               if (trElm.parentNode)\r
-                                                                                       trElm._delete = true;\r
-                                                                       }\r
+                                                                                       newTD.rowSpan = tdElm.rowSpan;\r
 \r
-                                                                       lastTDElm = tdElm;\r
-                                                               }\r
-                                                       }\r
+                                                                                       tdElm.parentNode.insertBefore(newTD, tdElm);\r
+                                                                               } else\r
+                                                                                       tdElm.colSpan++;\r
 \r
-                                                       deleteMarked(tableElm);\r
+                                                                               lastTDElm = tdElm;\r
+                                                                       }\r
+                                                               }\r
 \r
-                                                       cpos.rowindex--;\r
-                                                       if (cpos.rowindex < 0)\r
-                                                               cpos.rowindex = 0;\r
+                                                               select();\r
+                                                       break;\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
+                                                       case "mceTableInsertColAfter":\r
+                                                               if (!trElm || !tdElm)\r
+                                                                       return true;\r
 \r
-                                               case "mceTableInsertColBefore":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                               var grid = getTableGrid(tableElm);\r
+                                                               var cpos = getCellPos(grid, tdElm);\r
+                                                               var lastTDElm = null;\r
 \r
-                                                       var grid = getTableGrid(tableElm);\r
-                                                       var cpos = getCellPos(grid, tdElm);\r
-                                                       var lastTDElm = null;\r
+                                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                                       if (tdElm != lastTDElm) {\r
+                                                                               var sd = getColRowSpan(tdElm);\r
 \r
-                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
-                                                               if (tdElm != lastTDElm) {\r
-                                                                       var sd = getColRowSpan(tdElm);\r
+                                                                               if (sd['colspan'] == 1) {\r
+                                                                                       var newTD = doc.createElement(tdElm.nodeName);\r
 \r
-                                                                       if (sd['colspan'] == 1) {\r
-                                                                               var newTD = doc.createElement(tdElm.nodeName);\r
+                                                                                       if (!tinymce.isIE)\r
+                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
 \r
-                                                                               newTD.innerHTML = "&nbsp;";\r
-                                                                               newTD.rowSpan = tdElm.rowSpan;\r
+                                                                                       newTD.rowSpan = tdElm.rowSpan;\r
 \r
-                                                                               tdElm.parentNode.insertBefore(newTD, tdElm);\r
-                                                                       } else\r
-                                                                               tdElm.colSpan++;\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
+                                                                               lastTDElm = tdElm;\r
+                                                                       }\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
+                                                               select(1);\r
+                                                       break;\r
 \r
-                                                       var grid = getTableGrid(tableElm);\r
-                                                       var cpos = getCellPos(grid, tdElm);\r
-                                                       var lastTDElm = null;\r
+                                                       case "mceTableDeleteCol":\r
+                                                               if (!trElm || !tdElm)\r
+                                                                       return true;\r
 \r
-                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
-                                                               if (tdElm != lastTDElm) {\r
-                                                                       var sd = getColRowSpan(tdElm);\r
+                                                               var grid = getTableGrid(tableElm);\r
+                                                               var cpos = getCellPos(grid, tdElm);\r
+                                                               var lastTDElm = null;\r
 \r
-                                                                       if (sd['colspan'] == 1) {\r
-                                                                               var newTD = doc.createElement(tdElm.nodeName);\r
+                                                               // Only one col, remove whole table\r
+                                                               if (grid.length > 1 && grid[0].length <= 1) {\r
+                                                                       inst.dom.remove(inst.dom.getParent(tableElm, "table"));\r
+                                                                       return true;\r
+                                                               }\r
 \r
-                                                                               newTD.innerHTML = "&nbsp;";\r
-                                                                               newTD.rowSpan = tdElm.rowSpan;\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
-                                                                               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
+                                                                               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
+                                                                               lastTDElm = tdElm;\r
+                                                                       }\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
+                                                               select(-1);\r
+                                                       break;\r
 \r
-                                               case "mceTableDeleteCol":\r
+                                               case "mceTableSplitCells":\r
                                                        if (!trElm || !tdElm)\r
                                                                return true;\r
 \r
-                                                       var grid = getTableGrid(tableElm);\r
-                                                       var cpos = getCellPos(grid, tdElm);\r
-                                                       var lastTDElm = null;\r
+                                                       var spandata = getColRowSpan(tdElm);\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
+                                                       var colspan = spandata["colspan"];\r
+                                                       var rowspan = spandata["rowspan"];\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
+                                                       // 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
-                                                                       if (sd['colspan'] > 1)\r
-                                                                               tdElm.colSpan = sd['colspan'] - 1;\r
-                                                                       else {\r
-                                                                               if (tdElm.parentNode)\r
-                                                                                       tdElm.parentNode.removeChild(tdElm);\r
-                                                                       }\r
+                                                                       if (!tinymce.isIE)\r
+                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\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
+                                                                       trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));\r
 \r
-                                       case "mceTableSplitCells":\r
-                                               if (!trElm || !tdElm)\r
-                                                       return true;\r
+                                                                       if (rowspan > 1)\r
+                                                                               addRows(newTD, trElm, rowspan);\r
+                                                               }\r
 \r
-                                               var spandata = getColRowSpan(tdElm);\r
+                                                               addRows(tdElm, trElm, rowspan);\r
+                                                       }\r
 \r
-                                               var colspan = spandata["colspan"];\r
-                                               var rowspan = spandata["rowspan"];\r
+                                                       // Apply visual aids\r
+                                                       tableElm = inst.dom.getParent(inst.selection.getNode(), "table");\r
+                                                       break;\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
+                                               case "mceTableMergeCells":\r
+                                                       var rows = [];\r
+                                                       var sel = inst.selection.getSel();\r
+                                                       var grid = getTableGrid(tableElm);\r
 \r
-                                                               newTD.innerHTML = "&nbsp;";\r
+                                                       if (tinymce.isIE || sel.rangeCount == 1) {\r
+                                                               if (user_interface) {\r
+                                                                       // Setup template\r
+                                                                       var sp = getColRowSpan(tdElm);\r
+\r
+                                                                       inst.windowManager.open({\r
+                                                                               url : url + '/merge_cells.htm',\r
+                                                                               width : 240 + parseInt(inst.getLang('table.merge_cells_delta_width', 0)),\r
+                                                                               height : 110 + parseInt(inst.getLang('table.merge_cells_delta_height', 0)),\r
+                                                                               inline : 1\r
+                                                                       }, {\r
+                                                                               action : "update",\r
+                                                                               numcols : sp.colspan,\r
+                                                                               numrows : sp.rowspan,\r
+                                                                               plugin_url : url\r
+                                                                       });\r
 \r
-                                                               trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));\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 (rowspan > 1)\r
-                                                                       addRows(newTD, trElm, rowspan);\r
-                                                       }\r
+                                                                       if (("" + numRows) == "NaN")\r
+                                                                               numRows = 1;\r
 \r
-                                                       addRows(tdElm, trElm, rowspan);\r
-                                               }\r
+                                                                       if (("" + numCols) == "NaN")\r
+                                                                               numCols = 1;\r
 \r
-                                               // Apply visual aids\r
-                                               tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
-                                               break;\r
+                                                                       // Get rows and cells\r
+                                                                       var tRows = tableElm.rows;\r
+                                                                       for (var y=cpos.rowindex; y<grid.length; y++) {\r
+                                                                               var rowCells = [];\r
 \r
-                                       case "mceTableMergeCells":\r
-                                               var rows = new Array();\r
-                                               var sel = inst.getSel();\r
-                                               var grid = getTableGrid(tableElm);\r
+                                                                               for (var x=cpos.cellindex; x<grid[y].length; x++) {\r
+                                                                                       var td = getCell(grid, y, x);\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
+                                                                                       if (td && !inArray(rows, td) && !inArray(rowCells, td)) {\r
+                                                                                               var cp = getCellPos(grid, td);\r
 \r
-                                                               template['file'] = '../../plugins/table/merge_cells.htm';\r
-                                                               template['width'] = 250;\r
-                                                               template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);\r
+                                                                                               // Within range\r
+                                                                                               if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)\r
+                                                                                                       rowCells[rowCells.length] = td;\r
+                                                                                       }\r
+                                                                               }\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
+                                                                               if (rowCells.length > 0)\r
+                                                                                       rows[rows.length] = rowCells;\r
 \r
-                                                               // Open window\r
-                                                               tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan});\r
+                                                                               var td = getCell(grid, cpos.rowindex, cpos.cellindex);\r
+                                                                               each(ed.dom.select('br', td), function(e, i) {\r
+                                                                                       if (i > 0 && ed.dom.getAttrib('mce_bogus'))\r
+                                                                                               ed.dom.remove(e);\r
+                                                                               });\r
+                                                                       }\r
 \r
-                                                               return true;\r
+                                                                       //return true;\r
+                                                               }\r
                                                        } else {\r
-                                                               var numRows = parseInt(value['numrows']);\r
-                                                               var numCols = parseInt(value['numcols']);\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
+                                                               var cells = [];\r
+                                                               var sel = inst.selection.getSel();\r
+                                                               var lastTR = null;\r
+                                                               var curRow = null;\r
+                                                               var x1 = -1, y1 = -1, x2, y2;\r
+\r
+                                                               // Only one cell selected, whats the point?\r
+                                                               if (sel.rangeCount < 2)\r
+                                                                       return true;\r
+\r
+                                                               // Get all selected cells\r
+                                                               for (var i=0; i<sel.rangeCount; i++) {\r
+                                                                       var rng = sel.getRangeAt(i);\r
+                                                                       var tdElm = rng.startContainer.childNodes[rng.startOffset];\r
 \r
-                                                               if (("" + numRows) == "NaN")\r
-                                                                       numRows = 1;\r
+                                                                       if (!tdElm)\r
+                                                                               break;\r
 \r
-                                                               if (("" + numCols) == "NaN")\r
-                                                                       numCols = 1;\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=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
+                                                               for (var y=0; y<tRows.length; y++) {\r
+                                                                       var rowCells = [];\r
 \r
-                                                                               if (td && !inArray(rows, td) && !inArray(rowCells, td)) {\r
-                                                                                       var cp = getCellPos(grid, td);\r
+                                                                       for (var x=0; x<tRows[y].cells.length; x++) {\r
+                                                                               var td = tRows[y].cells[x];\r
 \r
-                                                                                       // Within range\r
-                                                                                       if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)\r
+                                                                               for (var i=0; i<cells.length; i++) {\r
+                                                                                       if (td == cells[i]) {\r
                                                                                                rowCells[rowCells.length] = td;\r
+                                                                                       }\r
                                                                                }\r
                                                                        }\r
 \r
@@ -881,193 +915,156 @@ var TinyMCE_TablePlugin = {
                                                                                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
+                                                               // Find selected cells in grid and box\r
+                                                               var curRow = [];\r
+                                                               var lastTR = null;\r
+                                                               for (var y=0; y<grid.length; y++) {\r
+                                                                       for (var x=0; x<grid[y].length; x++) {\r
+                                                                               grid[y][x]._selected = false;\r
+\r
+                                                                               for (var i=0; i<cells.length; i++) {\r
+                                                                                       if (grid[y][x] == cells[i]) {\r
+                                                                                               // Get start pos\r
+                                                                                               if (x1 == -1) {\r
+                                                                                                       x1 = x;\r
+                                                                                                       y1 = y;\r
+                                                                                               }\r
+\r
+                                                                                               // Get end pos\r
+                                                                                               x2 = x;\r
+                                                                                               y2 = y;\r
+\r
+                                                                                               grid[y][x]._selected = true;\r
+                                                                                       }\r
                                                                                }\r
                                                                        }\r
                                                                }\r
 \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
+                                                               // 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
-                                                       // 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
+                                                       // Validate selection and get total rowspan and colspan\r
+                                                       var rowSpan = 1, colSpan = 1;\r
 \r
-                                               // Validate selection and get total rowspan and colspan\r
-                                               var rowSpan = 1, colSpan = 1;\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
-                                               // Validate horizontal and get total colspan\r
-                                               var lastRowSpan = -1;\r
-                                               for (var y=0; y<rows.length; y++) {\r
-                                                       var rowColSpan = 0;\r
+                                                               for (var x=0; x<rows[y].length; x++) {\r
+                                                                       var sd = getColRowSpan(rows[y][x]);\r
 \r
-                                                       for (var x=0; x<rows[y].length; x++) {\r
-                                                               var sd = getColRowSpan(rows[y][x]);\r
+                                                                       rowColSpan += sd['colspan'];\r
 \r
-                                                               rowColSpan += sd['colspan'];\r
+                                                                       if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {\r
+                                                                               alert("Invalid selection for merge.");\r
+                                                                               return true;\r
+                                                                       }\r
 \r
-                                                               if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {\r
-                                                                       alert("Invalid selection for merge.");\r
-                                                                       return true;\r
+                                                                       lastRowSpan = sd['rowspan'];\r
                                                                }\r
 \r
-                                                               lastRowSpan = sd['rowspan'];\r
-                                                       }\r
+                                                               if (rowColSpan > colSpan)\r
+                                                                       colSpan = rowColSpan;\r
 \r
-                                                       if (rowColSpan > colSpan)\r
-                                                               colSpan = rowColSpan;\r
+                                                               lastRowSpan = -1;\r
+                                                       }\r
 \r
-                                                       lastRowSpan = -1;\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
-                                               // 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
+                                                               for (var y=0; y<rows.length; y++) {\r
+                                                                       var sd = getColRowSpan(rows[y][x]);\r
 \r
-                                                       for (var y=0; y<rows.length; y++) {\r
-                                                               var sd = getColRowSpan(rows[y][x]);\r
+                                                                       colRowSpan += sd['rowspan'];\r
 \r
-                                                               colRowSpan += sd['rowspan'];\r
+                                                                       if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {\r
+                                                                               alert("Invalid selection for merge.");\r
+                                                                               return true;\r
+                                                                       }\r
 \r
-                                                               if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {\r
-                                                                       alert("Invalid selection for merge.");\r
-                                                                       return true;\r
+                                                                       lastColSpan = sd['colspan'];\r
                                                                }\r
 \r
-                                                               lastColSpan = sd['colspan'];\r
-                                                       }\r
+                                                               if (colRowSpan > rowSpan)\r
+                                                                       rowSpan = colRowSpan;\r
 \r
-                                                       if (colRowSpan > rowSpan)\r
-                                                               rowSpan = colRowSpan;\r
+                                                               lastColSpan = -1;\r
+                                                       }\r
 \r
-                                                       lastColSpan = -1;\r
-                                               }\r
+                                                       // Setup td\r
+                                                       tdElm = rows[0][0];\r
+                                                       tdElm.rowSpan = rowSpan;\r
+                                                       tdElm.colSpan = colSpan;\r
 \r
-                                               // Setup td\r
-                                               tdElm = rows[0][0];\r
-                                               tdElm.rowSpan = rowSpan;\r
-                                               tdElm.colSpan = colSpan;\r
+                                                       // Merge cells\r
+                                                       for (var y=0; y<rows.length; y++) {\r
+                                                               for (var x=0; x<rows[y].length; x++) {\r
+                                                                       var html = rows[y][x].innerHTML;\r
+                                                                       var chk = html.replace(/[ \t\r\n]/g, "");\r
 \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
+                                                                       if (chk != "<br/>" && chk != "<br>" && chk != '<br mce_bogus="1"/>' && (x+y > 0))\r
+                                                                               tdElm.innerHTML += html;\r
 \r
-                                                               if (chk != "<br/>" && chk != "<br>" && chk != "&nbsp;" && (x+y > 0))\r
-                                                                       tdElm.innerHTML += html;\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
-                                                               // 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
+                                                                               tr.removeChild(rows[y][x]);\r
+                                                                               rows[y][x]._deleted = true;\r
 \r
-                                                                       tr.removeChild(rows[y][x]);\r
-                                                                       rows[y][x]._deleted = true;\r
+                                                                               // Empty TR, remove it\r
+                                                                               if (!tr.hasChildNodes()) {\r
+                                                                                       tr.parentNode.removeChild(tr);\r
 \r
-                                                                       // Empty TR, remove it\r
-                                                                       if (!tr.hasChildNodes()) {\r
-                                                                               tr.parentNode.removeChild(tr);\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
-                                                                               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
+                                                                                               lastCell = cellElm;\r
+                                                                                       }\r
 \r
-                                                                                       lastCell = cellElm;\r
+                                                                                       if (tdElm.rowSpan > 1)\r
+                                                                                               tdElm.rowSpan--;\r
                                                                                }\r
-\r
-                                                                               if (tdElm.rowSpan > 1)\r
-                                                                                       tdElm.rowSpan--;\r
                                                                        }\r
                                                                }\r
                                                        }\r
+\r
+                                                       // Remove all but one bogus br\r
+                                                       each(ed.dom.select('br', tdElm), function(e, i) {\r
+                                                               if (i > 0 && ed.dom.getAttrib(e, 'mce_bogus'))\r
+                                                                       ed.dom.remove(e);\r
+                                                       });\r
+\r
+                                                       break;\r
                                                }\r
 \r
-                                               break;\r
+                                               tableElm = inst.dom.getParent(inst.selection.getNode(), "table");\r
+                                               inst.addVisual(tableElm);\r
+                                               inst.nodeChanged();\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
+                               return true;\r
+                       }\r
 \r
-                       return true;\r
+                       // Pass to next handler in chain\r
+                       return false;\r
                }\r
+       });\r
 \r
-               // Pass to next handler in chain\r
-               return false;\r
-       }\r
-};\r
-\r
-tinyMCE.addPlugin("table", TinyMCE_TablePlugin);\r
+       // Register plugin\r
+       tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/images/buttons.gif b/program/js/tiny_mce/plugins/table/images/buttons.gif
deleted file mode 100644 (file)
index 56a7396..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/buttons.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/table/images/table.gif b/program/js/tiny_mce/plugins/table/images/table.gif
deleted file mode 100644 (file)
index 2911830..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table.gif and /dev/null 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
deleted file mode 100644 (file)
index bee7ed6..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_cell_props.gif and /dev/null 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
deleted file mode 100644 (file)
index 2a00e6a..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_delete.gif and /dev/null 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
deleted file mode 100644 (file)
index 260aa04..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_delete_col.gif and /dev/null 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
deleted file mode 100644 (file)
index 2fb5f2b..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_delete_row.gif and /dev/null 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
deleted file mode 100644 (file)
index 8505808..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif and /dev/null 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
deleted file mode 100644 (file)
index b669d4f..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif and /dev/null 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
deleted file mode 100644 (file)
index b9c1446..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif and /dev/null 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
deleted file mode 100644 (file)
index 157d373..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif and /dev/null 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
deleted file mode 100644 (file)
index 6834e61..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif and /dev/null 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
deleted file mode 100644 (file)
index e5c7cc3..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_row_props.gif and /dev/null 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
deleted file mode 100644 (file)
index 8ccb1b5..0000000
Binary files a/program/js/tiny_mce/plugins/table/images/table_split_cells.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/table/js/cell.js b/program/js/tiny_mce/plugins/table/js/cell.js
new file mode 100644 (file)
index 0000000..7d7f977
--- /dev/null
@@ -0,0 +1,259 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var ed;\r
+\r
+function init() {\r
+       ed = tinyMCEPopup.editor;\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 = ed;\r
+       var tdElm = ed.dom.getParent(ed.selection.getNode(), "td,th");\r
+       var formObj = document.forms[0];\r
+       var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style"));\r
+\r
+       // Get table cell data\r
+       var celltype = tdElm.nodeName.toLowerCase();\r
+       var align = ed.dom.getAttrib(tdElm, 'align');\r
+       var valign = ed.dom.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 = ed.dom.getAttrib(tdElm, 'class');\r
+       var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = ed.dom.getAttrib(tdElm, 'id');\r
+       var lang = ed.dom.getAttrib(tdElm, 'lang');\r
+       var dir = ed.dom.getAttrib(tdElm, 'dir');\r
+       var scope = ed.dom.getAttrib(tdElm, 'scope');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_cell_styles');\r
+       TinyMCE_EditableSelects.init();\r
+\r
+       formObj.bordercolor.value = bordercolor;\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.backgroundimage.value = backgroundimage;\r
+       formObj.width.value = width;\r
+       formObj.height.value = height;\r
+       formObj.id.value = id;\r
+       formObj.lang.value = lang;\r
+       formObj.style.value = ed.dom.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className, true, true);\r
+       selectByValue(formObj, 'celltype', celltype);\r
+       selectByValue(formObj, 'dir', dir);\r
+       selectByValue(formObj, 'scope', scope);\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       updateColor('bordercolor_pick', 'bordercolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+}\r
+\r
+function updateAction() {\r
+       var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0];\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       el = ed.selection.getNode();\r
+       tdElm = ed.dom.getParent(el, "td,th");\r
+       trElm = ed.dom.getParent(el, "tr");\r
+       tableElm = ed.dom.getParent(el, "table");\r
+\r
+       ed.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 (ed.getParam("accessibility_warnings")) {\r
+                               if (celltype == "th" && scope == "")\r
+                                       var answer = confirm(ed.getLang('table_dlg.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
+       ed.addVisual();\r
+       ed.nodeChanged();\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 = ed;\r
+       var formObj = document.forms[0];\r
+       var curCellType = td.nodeName.toLowerCase();\r
+       var celltype = getSelectValue(formObj, 'celltype');\r
+       var doc = inst.getDoc();\r
+       var dom = ed.dom;\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', ed.dom.serializeStyle(ed.dom.parseStyle(formObj.style.value)));\r
+       td.setAttribute('scope', formObj.scope.value);\r
+       ed.dom.setAttrib(td, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       ed.dom.setAttrib(td, 'width', '');\r
+       ed.dom.setAttrib(td, 'height', '');\r
+       ed.dom.setAttrib(td, 'bgColor', '');\r
+       ed.dom.setAttrib(td, 'borderColor', '');\r
+       ed.dom.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
+                       ed.dom.setAttrib(newCell, td.attributes[a].name, ed.dom.getAttrib(td, td.attributes[a].name));\r
+\r
+               td.parentNode.replaceChild(newCell, td);\r
+               td = newCell;\r
+       }\r
+\r
+       dom.setAttrib(td, 'style', dom.serializeStyle(dom.parseStyle(td.style.cssText)));\r
+\r
+       return td;\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = ed.dom.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = ed.dom.serializeStyle(st);\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = ed.dom.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 = ed.dom.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = ed.dom.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+       st['border-color'] = formObj.bordercolor.value;\r
+\r
+       formObj.style.value = ed.dom.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = ed.dom.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       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
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/table/js/merge_cells.js b/program/js/tiny_mce/plugins/table/js/merge_cells.js
new file mode 100644 (file)
index 0000000..4fd026b
--- /dev/null
@@ -0,0 +1,29 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+function init() {\r
+       var f = document.forms[0], v;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       f.numcols.value = tinyMCEPopup.getWindowArg('numcols', 1);\r
+       f.numrows.value = tinyMCEPopup.getWindowArg('numcols', 1);\r
+}\r
+\r
+function mergeCells() {\r
+       var args = [], f = document.forms[0];\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       if (!AutoValidator.validate(f)) {\r
+               alert(tinyMCEPopup.getLang('invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       args["numcols"] = f.numcols.value;\r
+       args["numrows"] = f.numrows.value;\r
+\r
+       tinyMCEPopup.execCommand("mceTableMergeCells", false, args);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/table/js/row.js b/program/js/tiny_mce/plugins/table/js/row.js
new file mode 100644 (file)
index 0000000..d25f635
--- /dev/null
@@ -0,0 +1,212 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+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 = tinyMCEPopup.editor;\r
+       var dom = inst.dom;\r
+       var trElm = dom.getParent(inst.selection.getNode(), "tr");\r
+       var formObj = document.forms[0];\r
+       var st = dom.parseStyle(dom.getAttrib(trElm, "style"));\r
+\r
+       // Get table row data\r
+       var rowtype = trElm.parentNode.nodeName.toLowerCase();\r
+       var align = dom.getAttrib(trElm, 'align');\r
+       var valign = dom.getAttrib(trElm, 'valign');\r
+       var height = trimSize(getStyle(trElm, 'height', 'height'));\r
+       var className = dom.getAttrib(trElm, 'class');\r
+       var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));\r
+       var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = dom.getAttrib(trElm, 'id');\r
+       var lang = dom.getAttrib(trElm, 'lang');\r
+       var dir = dom.getAttrib(trElm, 'dir');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_row_styles');\r
+       TinyMCE_EditableSelects.init();\r
+\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.backgroundimage.value = backgroundimage;\r
+       formObj.height.value = height;\r
+       formObj.id.value = id;\r
+       formObj.lang.value = lang;\r
+       formObj.style.value = dom.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className, true, true);\r
+       selectByValue(formObj, 'rowtype', rowtype);\r
+       selectByValue(formObj, 'dir', dir);\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+}\r
+\r
+function updateAction() {\r
+       var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0];\r
+       var action = getSelectValue(formObj, 'action');\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       trElm = dom.getParent(inst.selection.getNode(), "tr");\r
+       tableElm = dom.getParent(inst.selection.getNode(), "table");\r
+\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
+       inst.addVisual();\r
+       inst.nodeChanged();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function updateRow(tr_elm, skip_id, skip_parent) {\r
+       var inst = tinyMCEPopup.editor;\r
+       var formObj = document.forms[0];\r
+       var dom = inst.dom;\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', dom.serializeStyle(dom.parseStyle(formObj.style.value)));\r
+       dom.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 = dom.getParent(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
+                               if (theTable.firstChild.nodeName == 'CAPTION')\r
+                                       inst.dom.insertAfter(newParent, theTable.firstChild);\r
+                               else\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
+       dom.setAttrib(tr_elm, 'style', dom.serializeStyle(dom.parseStyle(tr_elm.style.cssText)));\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
+       var st = dom.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = dom.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
+       var st = dom.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       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], dom = tinyMCEPopup.editor.dom;\r
+       var st = dom.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 = dom.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
+       var st = dom.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       formObj.style.value = dom.serializeStyle(st);\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/table/js/table.js b/program/js/tiny_mce/plugins/table/js/table.js
new file mode 100644 (file)
index 0000000..768c26e
--- /dev/null
@@ -0,0 +1,410 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var action, orgTableWidth, orgTableHeight, dom = tinyMCEPopup.editor.dom;\r
+\r
+function insertTable() {\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCEPopup.editor, dom = inst.dom;\r
+       var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption, frame, rules;\r
+       var html = '', capEl, elm;\r
+       var cellLimit, rowLimit, colLimit;\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               alert(inst.getLang('invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       elm = dom.getParent(inst.selection.getNode(), 'table');\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
+       frame = formObj.elements['frame'].options[formObj.elements['frame'].selectedIndex].value;\r
+       rules = formObj.elements['rules'].options[formObj.elements['rules'].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 = tinyMCEPopup.getParam('table_cell_limit', false);\r
+       rowLimit = tinyMCEPopup.getParam('table_row_limit', false);\r
+       colLimit = tinyMCEPopup.getParam('table_col_limit', false);\r
+\r
+       // Validate table size\r
+       if (colLimit && cols > colLimit) {\r
+               alert(inst.getLang('table_col_limit', '', true, {cols : colLimit}));\r
+               return false;\r
+       } else if (rowLimit && rows > rowLimit) {\r
+               alert(inst.getLang('table_row_limit', '', true, {rows : rowLimit}));\r
+               return false;\r
+       } else if (cellLimit && cols * rows > cellLimit) {\r
+               alert(inst.getLang('table_cell_limit', '', true, {cells : cellLimit}));\r
+               return false;\r
+       }\r
+\r
+       // Update table\r
+       if (action == "update") {\r
+               inst.execCommand('mceBeginUndoLevel');\r
+\r
+               dom.setAttrib(elm, 'cellPadding', cellpadding, true);\r
+               dom.setAttrib(elm, 'cellSpacing', cellspacing, true);\r
+               dom.setAttrib(elm, 'border', border);\r
+               dom.setAttrib(elm, 'align', align);\r
+               dom.setAttrib(elm, 'frame', frame);\r
+               dom.setAttrib(elm, 'rules', rules);\r
+               dom.setAttrib(elm, 'class', className);\r
+               dom.setAttrib(elm, 'style', style);\r
+               dom.setAttrib(elm, 'id', id);\r
+               dom.setAttrib(elm, 'summary', summary);\r
+               dom.setAttrib(elm, 'dir', dir);\r
+               dom.setAttrib(elm, 'lang', lang);\r
+\r
+               capEl = inst.dom.select('caption', elm)[0];\r
+\r
+               if (capEl && !caption)\r
+                       capEl.parentNode.removeChild(capEl);\r
+\r
+               if (!capEl && caption) {\r
+                       capEl = elm.ownerDocument.createElement('caption');\r
+\r
+                       if (!tinymce.isIE)\r
+                               capEl.innerHTML = '<br mce_bogus="1"/>';\r
+\r
+                       elm.insertBefore(capEl, elm.firstChild);\r
+               }\r
+\r
+               if (width && /(pt|em|cm)$/.test(width)) {\r
+                       dom.setStyle(elm, 'width', width);\r
+                       dom.setAttrib(elm, 'width', '');\r
+               } else {\r
+                       dom.setAttrib(elm, 'width', width, true);\r
+                       dom.setStyle(elm, 'width', '');\r
+               }\r
+\r
+               // Remove these since they are not valid XHTML\r
+               dom.setAttrib(elm, 'borderColor', '');\r
+               dom.setAttrib(elm, 'bgColor', '');\r
+               dom.setAttrib(elm, 'background', '');\r
+\r
+               if (height) {\r
+                       dom.setStyle(elm, 'height', height);\r
+                       dom.setAttrib(elm, 'height', '');\r
+               }\r
+\r
+               if (background != '')\r
+                       elm.style.backgroundImage = "url('" + background + "')";\r
+               else\r
+                       elm.style.backgroundImage = '';\r
+\r
+/*             if (tinyMCEPopup.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
+               inst.addVisual();\r
+\r
+               // Fix for stange MSIE align bug\r
+               //elm.outerHTML = elm.outerHTML;\r
+\r
+               inst.nodeChanged();\r
+               inst.execCommand('mceEndUndoLevel');\r
+\r
+               // Repaint if dimensions changed\r
+               if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)\r
+                       inst.execCommand('mceRepaint');\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
+\r
+       if (width && /(pt|em|cm)$/.test(width)) {\r
+               if (style)\r
+                       style += '; ';\r
+\r
+               style += 'width: ' + width;\r
+       } else\r
+               html += makeAttrib('width', width);\r
+\r
+/*     if (height) {\r
+               if (style)\r
+                       style += '; ';\r
+\r
+               style += 'height: ' + height;\r
+       }*/\r
+\r
+       //html += makeAttrib('height', height);\r
+       //html += makeAttrib('bordercolor', bordercolor);\r
+       //html += makeAttrib('bgcolor', bgcolor);\r
+       html += makeAttrib('align', align);\r
+       html += makeAttrib('frame', frame);\r
+       html += makeAttrib('rules', rules);\r
+       html += makeAttrib('class', className);\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
+               if (!tinymce.isIE)\r
+                       html += '<caption><br mce_bogus="1"/></caption>';\r
+               else\r
+                       html += '<caption></caption>';\r
+       }\r
+\r
+       for (var y=0; y<rows; y++) {\r
+               html += "<tr>";\r
+\r
+               for (var x=0; x<cols; x++) {\r
+                       if (!tinymce.isIE)\r
+                               html += '<td><br mce_bogus="1"/></td>';\r
+                       else\r
+                               html += '<td></td>';\r
+               }\r
+\r
+               html += "</tr>";\r
+       }\r
+\r
+       html += "</table>";\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+       inst.execCommand('mceInsertContent', false, html);\r
+       inst.addVisual();\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 = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', '');\r
+       var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";\r
+       var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules, frame;\r
+       var inst = tinyMCEPopup.editor, dom = inst.dom;\r
+       var formObj = document.forms[0];\r
+       var elm = dom.getParent(inst.selection.getNode(), "table");\r
+\r
+       action = tinyMCEPopup.getWindowArg('action');\r
+\r
+       if (!action)\r
+               action = elm ? "update" : "insert";\r
+\r
+       if (elm && action != "insert") {\r
+               var rowsAr = elm.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 = dom.parseStyle(dom.getAttrib(elm, "style"));\r
+               border = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
+               cellpadding = dom.getAttrib(elm, 'cellpadding', "");\r
+               cellspacing = dom.getAttrib(elm, '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 = dom.getAttrib(elm, 'align', align);\r
+               frame = dom.getAttrib(elm, 'frame');\r
+               rules = dom.getAttrib(elm, 'rules');\r
+               className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, ''));\r
+               id = dom.getAttrib(elm, 'id');\r
+               summary = dom.getAttrib(elm, 'summary');\r
+               style = dom.serializeStyle(st);\r
+               dir = dom.getAttrib(elm, 'dir');\r
+               lang = dom.getAttrib(elm, 'lang');\r
+               background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+               formObj.caption.checked = elm.getElementsByTagName('caption').length > 0;\r
+\r
+               orgTableWidth = width;\r
+               orgTableHeight = height;\r
+\r
+               action = "update";\r
+               formObj.insert.value = inst.getLang('update');\r
+       }\r
+\r
+       addClassesToList('class', "table_styles");\r
+       TinyMCE_EditableSelects.init();\r
+\r
+       // Update form\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'frame', frame);\r
+       selectByValue(formObj, 'rules', rules);\r
+       selectByValue(formObj, 'class', className, true, true);\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
+\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 = dom.parseStyle(formObj.style.value);\r
+\r
+/*     var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = tinyMCEPopup.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 = dom.serializeStyle(st);\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = dom.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = dom.serializeStyle(st);\r
+}\r
+\r
+function changedBorder() {\r
+       var formObj = document.forms[0];\r
+       var st = dom.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 = dom.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = dom.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 = dom.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = dom.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       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
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/table/jscripts/cell.js b/program/js/tiny_mce/plugins/table/jscripts/cell.js
deleted file mode 100644 (file)
index 436eaad..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-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
deleted file mode 100644 (file)
index 06cbb27..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644 (file)
index 395ddf0..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-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
deleted file mode 100644 (file)
index 4a0ee3b..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-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
deleted file mode 100644 (file)
index e2fbba2..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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/langs/en_dlg.js b/program/js/tiny_mce/plugins/table/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..000332a
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('en.table_dlg',{\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
+rowtype:"Row in table part",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Left",\r
+align_right:"Right",\r
+align_middle:"Center",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
index 10896bf9e2094bc622a930d07504871c4acda56d..9d34a886b08449c961ff636a7ed3ede8f214f1e5 100644 (file)
@@ -1,24 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#table_dlg.merge_cells_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body style="margin: 8px" style="display: none">\r
+<form onsubmit="mergeCells();return false;" action="#">\r
        <fieldset>\r
-               <legend>{$lang_table_merge_cells_title}</legend>\r
+               <legend>{#table_dlg.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
+                               <td>{#table_dlg.cols}:</td>\r
+                               <td align="right"><input type="text" name="numcols" value="" class="number min1 mceFocus" style="width: 30px" /></td>\r
                          </tr>\r
                          <tr>\r
-                               <td>{$lang_table_rows}:</td>\r
+                               <td>{#table_dlg.rows}:</td>\r
                                <td align="right"><input type="text" name="numrows" value="" class="number min1" style="width: 30px" /></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="mergeCells();" />\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
                </div>\r
 \r
                <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </div>\r
 </form>\r
diff --git a/program/js/tiny_mce/plugins/table/readme.txt b/program/js/tiny_mce/plugins/table/readme.txt
deleted file mode 100644 (file)
index 4fdb78a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Check the TinyMCE documentation for details on this plugin.\r
index 64f2afcb5e87bf30debb24dbaa3f47735af8ab69..fe75bf607207c4b47ea5bf826b31db942207e0af 100644 (file)
@@ -1,74 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#table_dlg.row_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body id="tablerow" 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
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.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
+                                       <legend>{#table_dlg.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><label for="rowtype">{#table_dlg.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 id="rowtype" name="rowtype" class="mceFocus">\r
+                                                                       <option value="thead">{#table_dlg.thead}</option>\r
+                                                                       <option value="tbody">{#table_dlg.tbody}</option>\r
+                                                                       <option value="tfoot">{#table_dlg.tfoot}</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td><label for="align">{#table_dlg.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
+                                                                       <option value="">{#not_set}</option>\r
+                                                                       <option value="center">{#table_dlg.align_middle}</option>\r
+                                                                       <option value="left">{#table_dlg.align_left}</option>\r
+                                                                       <option value="right">{#table_dlg.align_right}</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td><label for="valign">{#table_dlg.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
+                                                                       <option value="">{#not_set}</option>\r
+                                                                       <option value="top">{#table_dlg.align_top}</option>\r
+                                                                       <option value="middle">{#table_dlg.align_middle}</option>\r
+                                                                       <option value="bottom">{#table_dlg.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><label for="class">{#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 id="class" name="class" class="mceEditableSelect">\r
+                                                                       <option value="" selected="selected">{#not_set}</option>\r
                                                                </select>\r
                                                        </td>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td><label for="height">{#table_dlg.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
 \r
                        <div id="advanced_panel" class="panel">\r
                                <fieldset>\r
-                                       <legend>{$lang_table_advanced_props}</legend>\r
+                                       <legend>{#table_dlg.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 class="column1"><label for="id">{#table_dlg.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><label for="style">{#table_dlg.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 class="column1"><label for="dir">{#table_dlg.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
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="ltr">{#table_dlg.ltr}</option> \r
+                                                                               <option value="rtl">{#table_dlg.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 class="column1"><label for="lang">{#table_dlg.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 class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\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
+                                       <option value="row">{#table_dlg.row_row}</option>\r
+                                       <option value="odd">{#table_dlg.row_odd}</option>\r
+                                       <option value="even">{#table_dlg.row_even}</option>\r
+                                       <option value="all">{#table_dlg.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><input type="submit" id="insert" name="insert" value="{#update}" /></div>\r
                        </div>\r
 \r
                        <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                        </div>\r
                </div>\r
        </form>\r
index f4841873324e1ccfcc9a7538920bcaddaedf4f21..7d5b908f491b686410202c4d3a22313cbb578de8 100644 (file)
@@ -1,67 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#table_dlg.title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body id="table" 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
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.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
+                                       <legend>{#table_dlg.general_props}</legend>\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><label id="colslabel" for="cols">{#table_dlg.cols}</label></td>\r
+                                                               <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" class="required number min1 mceFocus" /></td>\r
+                                                               <td><label id="rowslabel" for="rows">{#table_dlg.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><label id="cellpaddinglabel" for="cellpadding">{#table_dlg.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><label id="cellspacinglabel" for="cellspacing">{#table_dlg.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><label id="alignlabel" for="align">{#table_dlg.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
+                                                                       <option value="">{#not_set}</option>\r
+                                                                       <option value="center">{#table_dlg.align_middle}</option>\r
+                                                                       <option value="left">{#table_dlg.align_left}</option>\r
+                                                                       <option value="right">{#table_dlg.align_right}</option>\r
                                                                  </select></td>\r
-                                                               <td><label id="borderlabel" for="border">{$lang_table_border}</label></td>\r
+                                                               <td><label id="borderlabel" for="border">{#table_dlg.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><label id="widthlabel" for="width">{#table_dlg.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><label id="heightlabel" for="height">{#table_dlg.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><label id="classlabel" for="class">{#class_name}</label></td>\r
                                                                <td colspan="3">\r
-                                                                <select id="class" name="class">\r
-                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                <select id="class" name="class" class="mceEditableSelect">\r
+                                                                       <option value="" selected>{#not_set}</option>\r
                                                                 </select></td>\r
                                                          </tr>\r
                                                          <tr>\r
-                                                               <td class="column1"><label for="caption">{$lang_table_caption}</label></td> \r
+                                                               <td class="column1"><label for="caption">{#table_dlg.caption}</label></td> \r
                                                                <td><input id="caption" name="caption" type="checkbox" class="checkbox" value="true" /></td> \r
                                                          </tr>\r
                                                        </table>\r
 \r
                        <div id="advanced_panel" class="panel">\r
                                <fieldset>\r
-                                       <legend>{$lang_table_advanced_props}</legend>\r
+                                       <legend>{#table_dlg.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 class="column1"><label for="id">{#table_dlg.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 class="column1"><label for="summary">{#table_dlg.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><label for="style">{#table_dlg.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 class="column1"><label id="langlabel" for="lang">{#table_dlg.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 class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td class="column1"><label for="frame">{#table_dlg.frame}</label></td> \r
+                                                       <td>\r
+                                                               <select id="frame" name="frame" class="advfield"> \r
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="none">{#table_dlg.frame_none}</option>\r
+                                                                               <option value="groups">{#table_dlg.frame_groups}</option>\r
+                                                                               <option value="rows">{#table_dlg.frame_rows}</option>\r
+                                                                               <option value="cols">{#table_dlg.frame_cols}</option>\r
+                                                                               <option value="all">{#table_dlg.frame_all}</option>\r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="rules">{#table_dlg.rules}</label></td> \r
+                                                       <td>\r
+                                                               <select id="rules" name="rules" class="advfield"> \r
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="void">{#table_dlg.rules_void}</option>\r
+                                                                               <option value="above">{#table_dlg.rules_above}</option> \r
+                                                                               <option value="below">{#table_dlg.rules_below}</option> \r
+                                                                               <option value="hsides">{#table_dlg.rules_hsides}</option> \r
+                                                                               <option value="lhs">{#table_dlg.rules_lhs}</option> \r
+                                                                               <option value="rhs">{#table_dlg.rules_rhs}</option> \r
+                                                                               <option value="vsides">{#table_dlg.rules_vsides}</option> \r
+                                                                               <option value="box">{#table_dlg.rules_box}</option> \r
+                                                                               <option value="border">{#table_dlg.rules_border}</option> \r
+                                                                       </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" class="advfield"> \r
+                                                                               <option value="">{#not_set}</option> \r
+                                                                               <option value="ltr">{#table_dlg.ltr}</option> \r
+                                                                               <option value="rtl">{#table_dlg.rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> \r
                                                        <td>\r
                                                                <table border="0" cellpadding="0" cellspacing="0">\r
                                                                        <tr>\r
 \r
                <div class="mceActionPanel">\r
                        <div style="float: left">\r
-                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertTable();" />\r
+                               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
                        </div>\r
 \r
                        <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                        </div>\r
                </div>\r
        </form>\r
index a358754090bebe349ace04554261df04e67aae5b..e1e4238a3b5f42bcd9f9eb2fc575bcce7d4fbdd1 100644 (file)
@@ -1 +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
+(function(){tinymce.create('tinymce.plugins.VisualChars',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceVisualChars',t._toggleVisualChars,t);ed.addButton('visualchars',{title:'visualchars.desc',cmd:'mceVisualChars'});ed.onBeforeGetContent.add(function(ed,o){if(t.state){t.state=true;t._toggleVisualChars();}});},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};},_toggleVisualChars:function(){var t=this,ed=t.editor,nl,i,h,d=ed.getDoc(),b=ed.getBody(),nv,s=ed.selection,bo;t.state=!t.state;ed.controlManager.setActive('visualchars',t.state);if(t.state){nl=[];tinymce.walk(b,function(n){if(n.nodeType==3&&n.nodeValue&&n.nodeValue.indexOf('\u00a0')!=-1)nl.push(n);},'childNodes');for(i=0;i<nl.length;i++){nv=nl[i].nodeValue;nv=nv.replace(/(\u00a0+)/g,'<span class="mceItemHidden mceVisualNbsp">$1</span>');nv=nv.replace(/\u00a0/g,'\u00b7');ed.dom.setOuterHTML(nl[i],nv,d);}}else{nl=tinymce.grep(ed.dom.select('span',b),function(n){return ed.dom.hasClass(n,'mceVisualNbsp');});for(i=0;i<nl.length;i++)ed.dom.setOuterHTML(nl[i],nl[i].innerHTML.replace(/(&middot;|\u00b7)/g,'&nbsp;'),d);}}});tinymce.PluginManager.add('visualchars',tinymce.plugins.VisualChars);})();
\ No newline at end of file
index fb7236de23dc1caeefe8460aef17278bdb84b47a..02ec4e6982bb99339a659e64fa6db671430defa7 100644 (file)
@@ -1,89 +1,73 @@
 /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\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
+ * @copyright Copyright © 2004-2008, 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
+(function() {\r
+       tinymce.create('tinymce.plugins.VisualChars', {\r
+               init : function(ed, url) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+\r
+                       // Register commands\r
+                       ed.addCommand('mceVisualChars', t._toggleVisualChars, t);\r
+\r
+                       // Register buttons\r
+                       ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'});\r
+\r
+                       ed.onBeforeGetContent.add(function(ed, o) {\r
+                               if (t.state) {\r
+                                       t.state = true;\r
+                                       t._toggleVisualChars();\r
+                               }\r
+                       });\r
+               },\r
+\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
+               // Private methods\r
+\r
+               _toggleVisualChars : function() {\r
+                       var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo;\r
+\r
+                       t.state = !t.state;\r
+                       ed.controlManager.setActive('visualchars', t.state);\r
+\r
+                       if (t.state) {\r
+                               nl = [];\r
+                               tinymce.walk(b, function(n) {\r
+                                       if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1)\r
+                                               nl.push(n);\r
+                               }, 'childNodes');\r
+\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       nv = nl[i].nodeValue;\r
+                                       nv = nv.replace(/(\u00a0+)/g, '<span class="mceItemHidden mceVisualNbsp">$1</span>');\r
+                                       nv = nv.replace(/\u00a0/g, '\u00b7');\r
+                                       ed.dom.setOuterHTML(nl[i], nv, d);\r
+                               }\r
+                       } else {\r
+                               nl = tinymce.grep(ed.dom.select('span', b), function(n) {\r
+                                       return ed.dom.hasClass(n, 'mceVisualNbsp');\r
+                               });\r
+\r
+                               for (i=0; i<nl.length; i++)\r
+                                       ed.dom.setOuterHTML(nl[i], nl[i].innerHTML.replace(/(&middot;|\u00b7)/g, '&nbsp;'), 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
 \r
-               //s.moveToBookmark(bo);\r
-       }\r
-};\r
-\r
-tinyMCE.addPlugin("visualchars", TinyMCE_VisualCharsPlugin);\r
+       // Register plugin\r
+       tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/visualchars/images/visualchars.gif b/program/js/tiny_mce/plugins/visualchars/images/visualchars.gif
deleted file mode 100644 (file)
index 3b4293e..0000000
Binary files a/program/js/tiny_mce/plugins/visualchars/images/visualchars.gif and /dev/null differ
diff --git a/program/js/tiny_mce/plugins/visualchars/langs/en.js b/program/js/tiny_mce/plugins/visualchars/langs/en.js
deleted file mode 100644 (file)
index a82a4ee..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// EN lang variables\r
-\r
-tinyMCE.addToLang('visualchars',{\r
-desc : 'Visual control characters on/off.'\r
-});\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/abbr.htm b/program/js/tiny_mce/plugins/xhtmlxtras/abbr.htm
new file mode 100644 (file)
index 0000000..5800284
--- /dev/null
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_abbr_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/abbr.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body style="display: none">\r
+<form onsubmit="insertAbbr();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{#not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAbbr();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/acronym.htm b/program/js/tiny_mce/plugins/xhtmlxtras/acronym.htm
new file mode 100644 (file)
index 0000000..54e4c9d
--- /dev/null
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_acronym_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/acronym.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body style="display: none">\r
+<form onsubmit="insertAcronym();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{#not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAcronym();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/attributes.htm b/program/js/tiny_mce/plugins/xhtmlxtras/attributes.htm
new file mode 100644 (file)
index 0000000..cfbb409
--- /dev/null
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.attribs_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="js/attributes.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/attributes.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body style="display: none">\r
+<form onsubmit="insertAction();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_attrib_tab}</a></span></li>\r
+                       <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_events_tab}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.attribute_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="mceFocus" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td><label id="classlabel" for="classlist">{#class_name}</label></td>\r
+                                               <td>\r
+                                                       <select id="classlist" name="classlist" class="mceEditableSelect">\r
+                                                               <option value="" selected>{#not_set}</option>\r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" />\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                                       <td><label id="tabindexlabel" for="tabindex">{#xhtmlxtras_dlg.attribute_label_tabindex}</label></td>\r
+                                                       <td><input type="text" id="tabindex" name="tabindex" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="accesskeylabel" for="accesskey">{#xhtmlxtras_dlg.attribute_label_accesskey}</label></td>\r
+                                                       <td><input type="text" id="accesskey" name="accesskey" value="" /></td>\r
+                                               </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.attribute_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/cite.htm b/program/js/tiny_mce/plugins/xhtmlxtras/cite.htm
new file mode 100644 (file)
index 0000000..7d9eaba
--- /dev/null
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_cite_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/cite.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body style="display: none">\r
+<form onsubmit="insertCite();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{#not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeCite();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/program/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css
new file mode 100644 (file)
index 0000000..9a6a235
--- /dev/null
@@ -0,0 +1,11 @@
+.panel_wrapper div.current {\r
+       height: 290px;\r
+}\r
+\r
+#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey {\r
+       width: 200px;\r
+}\r
+\r
+#events_panel input {\r
+       width: 200px;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/css/popup.css b/program/js/tiny_mce/plugins/xhtmlxtras/css/popup.css
new file mode 100644 (file)
index 0000000..e67114d
--- /dev/null
@@ -0,0 +1,9 @@
+input.field, select.field {width:200px;}\r
+input.picker {width:179px; margin-left: 5px;}\r
+input.disabled {border-color:#F2F2F2;}\r
+img.picker {vertical-align:text-bottom; cursor:pointer;}\r
+h1 {padding: 0 0 5px 0;}\r
+.panel_wrapper div.current {height:160px;}\r
+#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;}\r
+a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;}\r
+#datetime {width:180px;}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css b/program/js/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css
new file mode 100644 (file)
index 0000000..6838d90
--- /dev/null
@@ -0,0 +1,24 @@
+ins {\r
+       border-bottom: 1px solid green;\r
+       text-decoration: none;\r
+       color: green;\r
+}\r
+\r
+del {\r
+       color: Red;\r
+       text-decoration: line-through;\r
+}\r
+\r
+cite {\r
+       border-bottom: 1px dashed blue;\r
+}\r
+\r
+acronym {\r
+       border-bottom: 1px dotted #CCC;\r
+       cursor: help;\r
+}\r
+\r
+abbr, html\:abbr {\r
+       border-bottom: 1px dashed #CCC;\r
+       cursor: help;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/del.htm b/program/js/tiny_mce/plugins/xhtmlxtras/del.htm
new file mode 100644 (file)
index 0000000..d03c456
--- /dev/null
@@ -0,0 +1,170 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_del_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/del.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="xhtmlxtrasins" style="display: none">\r
+<form onsubmit="insertDel();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td>\r
+                                               <td>\r
+                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                               <tr> \r
+                                                                       <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> \r
+                                                                       <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" alt="{#xhtmlxtras_dlg.insert_date}" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td>\r
+                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{#not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeDel();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
new file mode 100644 (file)
index 0000000..6a3270d
--- /dev/null
@@ -0,0 +1 @@
+(function(){tinymce.create('tinymce.plugins.XHTMLXtrasPlugin',{init:function(ed,url){ed.addCommand('mceCite',function(){ed.windowManager.open({file:url+'/cite.htm',width:350+parseInt(ed.getLang('xhtmlxtras.cite_delta_width',0)),height:250+parseInt(ed.getLang('xhtmlxtras.cite_delta_height',0)),inline:1},{plugin_url:url});});ed.addCommand('mceAcronym',function(){ed.windowManager.open({file:url+'/acronym.htm',width:350+parseInt(ed.getLang('xhtmlxtras.acronym_delta_width',0)),height:250+parseInt(ed.getLang('xhtmlxtras.acronym_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceAbbr',function(){ed.windowManager.open({file:url+'/abbr.htm',width:350+parseInt(ed.getLang('xhtmlxtras.abbr_delta_width',0)),height:250+parseInt(ed.getLang('xhtmlxtras.abbr_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceDel',function(){ed.windowManager.open({file:url+'/del.htm',width:340+parseInt(ed.getLang('xhtmlxtras.del_delta_width',0)),height:310+parseInt(ed.getLang('xhtmlxtras.del_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceIns',function(){ed.windowManager.open({file:url+'/ins.htm',width:340+parseInt(ed.getLang('xhtmlxtras.ins_delta_width',0)),height:310+parseInt(ed.getLang('xhtmlxtras.ins_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceAttributes',function(){ed.windowManager.open({file:url+'/attributes.htm',width:380,height:370,inline:1},{plugin_url:url});});ed.addButton('cite',{title:'xhtmlxtras.cite_desc',cmd:'mceCite'});ed.addButton('acronym',{title:'xhtmlxtras.acronym_desc',cmd:'mceAcronym'});ed.addButton('abbr',{title:'xhtmlxtras.abbr_desc',cmd:'mceAbbr'});ed.addButton('del',{title:'xhtmlxtras.del_desc',cmd:'mceDel'});ed.addButton('ins',{title:'xhtmlxtras.ins_desc',cmd:'mceIns'});ed.addButton('attribs',{title:'xhtmlxtras.attribs_desc',cmd:'mceAttributes'});if(tinymce.isIE){function fix(ed,o){if(o.set){o.content=o.content.replace(/<abbr([^>]+)>/gi,'<html:abbr $1>');o.content=o.content.replace(/<\/abbr>/gi,'</html:abbr>');}};ed.onBeforeSetContent.add(fix);ed.onPostProcess.add(fix);}ed.onNodeChange.add(function(ed,cm,n,co){n=ed.dom.getParent(n,'CITE,ACRONYM,ABBR,DEL,INS');cm.setDisabled('cite',co);cm.setDisabled('acronym',co);cm.setDisabled('abbr',co);cm.setDisabled('del',co);cm.setDisabled('ins',co);cm.setDisabled('attribs',n&&n.nodeName=='BODY');if(n){cm.setDisabled(n.nodeName.toLowerCase(),0);cm.setActive(n.nodeName.toLowerCase(),1);}else{cm.setActive('cite',0);cm.setActive('acronym',0);cm.setActive('abbr',0);cm.setActive('del',0);cm.setActive('ins',0);}});},getInfo:function(){return{longname:'XHTML Xtras Plugin',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('xhtmlxtras',tinymce.plugins.XHTMLXtrasPlugin);})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..143ed92
--- /dev/null
@@ -0,0 +1,134 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', {\r
+               init : function(ed, url) {\r
+                       // Register commands\r
+                       ed.addCommand('mceCite', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/cite.htm',\r
+                                       width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)),\r
+                                       height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceAcronym', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/acronym.htm',\r
+                                       width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),\r
+                                       height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceAbbr', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/abbr.htm',\r
+                                       width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),\r
+                                       height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceDel', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/del.htm',\r
+                                       width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),\r
+                                       height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceIns', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/ins.htm',\r
+                                       width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),\r
+                                       height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       ed.addCommand('mceAttributes', function() {\r
+                               ed.windowManager.open({\r
+                                       file : url + '/attributes.htm',\r
+                                       width : 380,\r
+                                       height : 370,\r
+                                       inline : 1\r
+                               }, {\r
+                                       plugin_url : url\r
+                               });\r
+                       });\r
+\r
+                       // Register buttons\r
+                       ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'});\r
+                       ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'});\r
+                       ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'});\r
+                       ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'});\r
+                       ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'});\r
+                       ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'});\r
+\r
+                       if (tinymce.isIE) {\r
+                               function fix(ed, o) {\r
+                                       if (o.set) {\r
+                                               o.content = o.content.replace(/<abbr([^>]+)>/gi, '<html:abbr $1>');\r
+                                               o.content = o.content.replace(/<\/abbr>/gi, '</html:abbr>');\r
+                                       }\r
+                               };\r
+\r
+                               ed.onBeforeSetContent.add(fix);\r
+                               ed.onPostProcess.add(fix);\r
+                       }\r
+\r
+                       ed.onNodeChange.add(function(ed, cm, n, co) {\r
+                               n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS');\r
+\r
+                               cm.setDisabled('cite', co);\r
+                               cm.setDisabled('acronym', co);\r
+                               cm.setDisabled('abbr', co);\r
+                               cm.setDisabled('del', co);\r
+                               cm.setDisabled('ins', co);\r
+                               cm.setDisabled('attribs', n && n.nodeName == 'BODY');\r
+\r
+                               if (n) {\r
+                                       cm.setDisabled(n.nodeName.toLowerCase(), 0);\r
+                                       cm.setActive(n.nodeName.toLowerCase(), 1);\r
+                               } else {\r
+                                       cm.setActive('cite', 0);\r
+                                       cm.setActive('acronym', 0);\r
+                                       cm.setActive('abbr', 0);\r
+                                       cm.setActive('del', 0);\r
+                                       cm.setActive('ins', 0);\r
+                               }\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'XHTML Xtras Plugin',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/ins.htm b/program/js/tiny_mce/plugins/xhtmlxtras/ins.htm
new file mode 100644 (file)
index 0000000..c0f056f
--- /dev/null
@@ -0,0 +1,170 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#xhtmlxtras_dlg.title_ins_element}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script type="text/javascript" src="js/element_common.js"></script>\r
+       <script type="text/javascript" src="js/ins.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="xhtmlxtrasins" style="display: none">\r
+<form onsubmit="insertIns();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> \r
+                                               <td>\r
+                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                               <tr> \r
+                                                                       <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> \r
+                                                                       <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" alt="{#xhtmlxtras_dlg.insert_date}" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> \r
+                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{#not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{#not_set}</option> \r
+                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeIns();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js
new file mode 100644 (file)
index 0000000..e84b6a8
--- /dev/null
@@ -0,0 +1,25 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function init() {\r
+       SXE.initElementDialog('abbr');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertAbbr() {\r
+       SXE.insertElement(tinymce.isIE ? 'html:abbr' : 'abbr');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeAbbr() {\r
+       SXE.removeElement('abbr');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js
new file mode 100644 (file)
index 0000000..933d122
--- /dev/null
@@ -0,0 +1,25 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function init() {\r
+       SXE.initElementDialog('acronym');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertAcronym() {\r
+       SXE.insertElement('acronym');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeAcronym() {\r
+       SXE.removeElement('acronym');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js
new file mode 100644 (file)
index 0000000..23c7fa4
--- /dev/null
@@ -0,0 +1,123 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       var inst = tinyMCEPopup.editor;\r
+       var dom = inst.dom;\r
+       var elm = inst.selection.getNode();\r
+       var f = document.forms[0];\r
+       var onclick = dom.getAttrib(elm, 'onclick');\r
+\r
+       setFormValue('title', dom.getAttrib(elm, 'title'));\r
+       setFormValue('id', dom.getAttrib(elm, 'id'));\r
+       setFormValue('style', dom.getAttrib(elm, "style"));\r
+       setFormValue('dir', dom.getAttrib(elm, 'dir'));\r
+       setFormValue('lang', dom.getAttrib(elm, 'lang'));\r
+       setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));\r
+       setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));\r
+       setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));\r
+       setFormValue('onblur', dom.getAttrib(elm, 'onblur'));\r
+       setFormValue('onclick', onclick);\r
+       setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));\r
+       setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));\r
+       setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));\r
+       setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));\r
+       setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));\r
+       setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));\r
+       setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));\r
+       setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));\r
+       setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));\r
+       className = dom.getAttrib(elm, 'class');\r
+\r
+       addClassesToList('classlist', 'advlink_styles');\r
+       selectByValue(f, 'classlist', className, true);\r
+\r
+       TinyMCE_EditableSelects.init();\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       if(value && document.forms[0].elements[name]){\r
+               document.forms[0].elements[name].value = value;\r
+       }\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCEPopup.editor;\r
+       var elm = inst.selection.getNode();\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");  \r
+       setAllAttribs(elm);\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+       var inst = tinyMCEPopup.editor;\r
+       var dom = inst.dom;\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value != "") {\r
+               dom.setAttrib(elm, attrib.toLowerCase(), value);\r
+\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib.substring(0, 2) == 'on')\r
+                       value = 'return true;' + value;\r
+\r
+               if (attrib == "class")\r
+                       attrib = "className";\r
+\r
+               elm[attrib]=value;\r
+       } else\r
+               elm.removeAttribute(attrib);\r
+}\r
+\r
+function setAllAttribs(elm) {\r
+       var f = document.forms[0];\r
+\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'class', getSelectValue(f, 'classlist'));\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       setAttrib(elm, 'tabindex');\r
+       setAttrib(elm, 'accesskey');\r
+       setAttrib(elm, 'onfocus');\r
+       setAttrib(elm, 'onblur');\r
+       setAttrib(elm, 'onclick');\r
+       setAttrib(elm, 'ondblclick');\r
+       setAttrib(elm, 'onmousedown');\r
+       setAttrib(elm, 'onmouseup');\r
+       setAttrib(elm, 'onmouseover');\r
+       setAttrib(elm, 'onmousemove');\r
+       setAttrib(elm, 'onmouseout');\r
+       setAttrib(elm, 'onkeypress');\r
+       setAttrib(elm, 'onkeydown');\r
+       setAttrib(elm, 'onkeyup');\r
+\r
+       // Refresh in old MSIE\r
+//     if (tinyMCE.isMSIE5)\r
+//             elm.outerHTML = elm.outerHTML;\r
+}\r
+\r
+function insertAttribute() {\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
+tinyMCEPopup.requireLangPack();\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/cite.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/cite.js
new file mode 100644 (file)
index 0000000..c36f7fd
--- /dev/null
@@ -0,0 +1,25 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function init() {\r
+       SXE.initElementDialog('cite');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertCite() {\r
+       SXE.insertElement('cite');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeCite() {\r
+       SXE.removeElement('cite');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/del.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/del.js
new file mode 100644 (file)
index 0000000..005a619
--- /dev/null
@@ -0,0 +1,50 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function init() {\r
+       SXE.initElementDialog('del');\r
+       if (SXE.currentAction == "update") {\r
+               setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));\r
+               setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function setElementAttribs(elm) {\r
+       setAllCommonAttribs(elm);\r
+       setAttrib(elm, 'datetime');\r
+       setAttrib(elm, 'cite');\r
+}\r
+\r
+function insertDel() {\r
+       var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL');\r
+\r
+       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getContent();\r
+               if(s.length > 0) {\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, '<del id="#sxe_temp_del#">' + s + '</del>');\r
+                       var elementArray = tinymce.grep(SXE.inst.dom.select('del'), function(n) {return n.id == '#sxe_temp_del#';});\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+                               setElementAttribs(elm);\r
+                       }\r
+               }\r
+       } else {\r
+               setElementAttribs(elm);\r
+       }\r
+       tinyMCEPopup.editor.nodeChanged();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeDel() {\r
+       SXE.removeElement('del');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js
new file mode 100644 (file)
index 0000000..724d9d1
--- /dev/null
@@ -0,0 +1,221 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+tinyMCEPopup.requireLangPack();\r
+\r
+function initCommonAttributes(elm) {\r
+       var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
+\r
+       // Setup form data for common element attributes\r
+       setFormValue('title', dom.getAttrib(elm, 'title'));\r
+       setFormValue('id', dom.getAttrib(elm, 'id'));\r
+       selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true);\r
+       setFormValue('style', dom.getAttrib(elm, 'style'));\r
+       selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir'));\r
+       setFormValue('lang', dom.getAttrib(elm, 'lang'));\r
+       setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));\r
+       setFormValue('onblur', dom.getAttrib(elm, 'onblur'));\r
+       setFormValue('onclick', dom.getAttrib(elm, 'onclick'));\r
+       setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));\r
+       setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));\r
+       setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));\r
+       setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));\r
+       setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));\r
+       setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));\r
+       setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));\r
+       setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));\r
+       setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;\r
+}\r
+\r
+function insertDateTime(id) {\r
+       document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");\r
+}\r
+\r
+function getDateTime(d, fmt) {\r
+       fmt = fmt.replace("%D", "%m/%d/%y");\r
+       fmt = fmt.replace("%r", "%I:%M:%S %p");\r
+       fmt = fmt.replace("%Y", "" + d.getFullYear());\r
+       fmt = fmt.replace("%y", "" + d.getYear());\r
+       fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
+       fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
+       fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
+       fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
+       fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
+       fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
+       fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
+       fmt = fmt.replace("%%", "%");\r
+\r
+       return fmt;\r
+}\r
+\r
+function addZeros(value, len) {\r
+       var i;\r
+\r
+       value = "" + value;\r
+\r
+       if (value.length < len) {\r
+               for (i=0; i<(len-value.length); i++)\r
+                       value = "0" + value;\r
+       }\r
+\r
+       return value;\r
+}\r
+\r
+function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
+       if (!form_obj || !form_obj.elements[field_name])\r
+               return;\r
+\r
+       var sel = form_obj.elements[field_name];\r
+\r
+       var found = false;\r
+       for (var i=0; i<sel.options.length; i++) {\r
+               var option = sel.options[i];\r
+\r
+               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
+                       option.selected = true;\r
+                       found = true;\r
+               } else\r
+                       option.selected = false;\r
+       }\r
+\r
+       if (!found && add_custom && value != '') {\r
+               var option = new Option('Value: ' + value, value);\r
+               option.selected = true;\r
+               sel.options[sel.options.length] = option;\r
+       }\r
+\r
+       return found;\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+       tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value);\r
+}\r
+\r
+function setAllCommonAttribs(elm) {\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'class');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       /*setAttrib(elm, 'onfocus');\r
+       setAttrib(elm, 'onblur');\r
+       setAttrib(elm, 'onclick');\r
+       setAttrib(elm, 'ondblclick');\r
+       setAttrib(elm, 'onmousedown');\r
+       setAttrib(elm, 'onmouseup');\r
+       setAttrib(elm, 'onmouseover');\r
+       setAttrib(elm, 'onmousemove');\r
+       setAttrib(elm, 'onmouseout');\r
+       setAttrib(elm, 'onkeypress');\r
+       setAttrib(elm, 'onkeydown');\r
+       setAttrib(elm, 'onkeyup');*/\r
+}\r
+\r
+SXE = {\r
+       currentAction : "insert",\r
+       inst : tinyMCEPopup.editor,\r
+       updateElement : null\r
+}\r
+\r
+SXE.focusElement = SXE.inst.selection.getNode();\r
+\r
+SXE.initElementDialog = function(element_name) {\r
+       addClassesToList('class', 'xhtmlxtras_styles');\r
+       TinyMCE_EditableSelects.init();\r
+\r
+       element_name = element_name.toLowerCase();\r
+       var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
+       if (elm != null && elm.nodeName == element_name.toUpperCase()) {\r
+               SXE.currentAction = "update";\r
+       }\r
+\r
+       if (SXE.currentAction == "update") {\r
+               initCommonAttributes(elm);\r
+               SXE.updateElement = elm;\r
+       }\r
+\r
+       document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); \r
+}\r
+\r
+SXE.insertElement = function(element_name) {\r
+       var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName;\r
+\r
+       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getContent();\r
+               if(s.length > 0) {\r
+                       tagName = element_name;\r
+\r
+                       if (tinymce.isIE && element_name.indexOf('html:') == 0)\r
+                               element_name = element_name.substring(5).toLowerCase();\r
+\r
+                       h = '<' + tagName + ' id="#sxe_temp_' + element_name + '#">' + s + '</' + tagName + '>';\r
+\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, h);\r
+\r
+                       var elementArray = tinymce.grep(SXE.inst.dom.select(element_name), function(n) {return n.id == '#sxe_temp_' + element_name + '#';});\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+\r
+                               elm.id = '';\r
+                               elm.setAttribute('id', '');\r
+                               elm.removeAttribute('id');\r
+\r
+                               setAllCommonAttribs(elm);\r
+                       }\r
+               }\r
+       } else {\r
+               setAllCommonAttribs(elm);\r
+       }\r
+       SXE.inst.nodeChanged();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+}\r
+\r
+SXE.removeElement = function(element_name){\r
+       element_name = element_name.toLowerCase();\r
+       elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
+       if(elm && elm.nodeName == element_name.toUpperCase()){\r
+               tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+               tinyMCE.execCommand('mceRemoveNode', false, elm);\r
+               SXE.inst.nodeChanged();\r
+               tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+       }\r
+}\r
+\r
+SXE.showRemoveButton = function() {\r
+               document.getElementById("remove").style.display = 'block';\r
+}\r
+\r
+SXE.containsClass = function(elm,cl) {\r
+       return (elm.className.indexOf(cl) > -1) ? true : false;\r
+}\r
+\r
+SXE.removeClass = function(elm,cl) {\r
+       if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {\r
+               return true;\r
+       }\r
+       var classNames = elm.className.split(" ");\r
+       var newClassNames = "";\r
+       for (var x = 0, cnl = classNames.length; x < cnl; x++) {\r
+               if (classNames[x] != cl) {\r
+                       newClassNames += (classNames[x] + " ");\r
+               }\r
+       }\r
+       elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end\r
+}\r
+\r
+SXE.addClass = function(elm,cl) {\r
+       if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;\r
+       return true;\r
+}
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/ins.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/ins.js
new file mode 100644 (file)
index 0000000..b03ca1b
--- /dev/null
@@ -0,0 +1,49 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function init() {\r
+       SXE.initElementDialog('ins');\r
+       if (SXE.currentAction == "update") {\r
+               setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));\r
+               setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function setElementAttribs(elm) {\r
+       setAllCommonAttribs(elm);\r
+       setAttrib(elm, 'datetime');\r
+       setAttrib(elm, 'cite');\r
+}\r
+\r
+function insertIns() {\r
+       var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS');\r
+       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getContent();\r
+               if(s.length > 0) {\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, '<ins id="#sxe_temp_ins#">' + s + '</ins>');\r
+                       var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';});\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+                               setElementAttribs(elm);\r
+                       }\r
+               }\r
+       } else {\r
+               setElementAttribs(elm);\r
+       }\r
+       tinyMCEPopup.editor.nodeChanged();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeIns() {\r
+       SXE.removeElement('ins');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js b/program/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..45b6b26
--- /dev/null
@@ -0,0 +1,32 @@
+tinyMCE.addI18n('en.xhtmlxtras_dlg',{\r
+attribute_label_title:"Title",\r
+attribute_label_id:"ID",\r
+attribute_label_class:"Class",\r
+attribute_label_style:"Style",\r
+attribute_label_cite:"Cite",\r
+attribute_label_datetime:"Date/Time",\r
+attribute_label_langdir:"Text Direction",\r
+attribute_option_ltr:"Left to right",\r
+attribute_option_rtl:"Right to left",\r
+attribute_label_langcode:"Language",\r
+attribute_label_tabindex:"TabIndex",\r
+attribute_label_accesskey:"AccessKey",\r
+attribute_events_tab:"Events",\r
+attribute_attrib_tab:"Attributes",\r
+general_tab:"General",\r
+attrib_tab:"Attributes",\r
+events_tab:"Events",\r
+fieldset_general_tab:"General Settings",\r
+fieldset_attrib_tab:"Element Attributes",\r
+fieldset_events_tab:"Element Events",\r
+title_ins_element:"Insertion Element",\r
+title_del_element:"Deletion Element",\r
+title_acronym_element:"Acronym Element",\r
+title_abbr_element:"Abbreviation Element",\r
+title_cite_element:"Citation Element",\r
+remove:"Remove",\r
+insert_date:"Insert current date/time",\r
+option_ltr:"Left to right",\r
+option_rtl:"Right to left",\r
+attribs_title:"Insert/Edit Attributes"\r
+});
\ No newline at end of file
index 6918488a23fc099a958f83e8b957b63bb6778bbe..4ef2a29c5d536d73a025fad8c854a52b5f8c549d 100644 (file)
@@ -1,35 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#advanced_dlg.about_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="js/about.js"></script>\r
 </head>\r
-<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<body id="about" 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
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.about_general}</a></span></li>\r
+                               <li id="help_tab" style="display:none"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{#advanced_dlg.about_help}</a></span></li>\r
+                               <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{#advanced_dlg.about_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
+                               <h3>{#advanced_dlg.about_title}</h3>\r
+                               <p>Version: <span id="version"></span> (<span id="date"></span>)</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>Copyright &copy; 2003-2008, <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 id="buttoncontainer">\r
+                                       <a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a>\r
+                                       <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
+                                       <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
+                               </div>\r
                        </div>\r
 \r
                        <div id="plugins_panel" class="panel">\r
                                <div id="pluginscontainer">\r
-                                       <h3>{$lang_loaded_plugins}</h3>\r
+                                       <h3>{#advanced_dlg.about_loaded}</h3>\r
 \r
                                        <div id="plugintablecontainer">\r
                                        </div>\r
@@ -45,7 +49,7 @@
 \r
                <div class="mceActionPanel">\r
                        <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />\r
+                               <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" />\r
                        </div>\r
                </div>\r
 </body>\r
index 53d7969f058ef951f4d15411cb81a8e326299c38..9e4c0b91ae7393f780a02d7073c403260fe8e743 100644 (file)
@@ -1,33 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#advanced_dlg.anchor_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body style="display: none">\r
+<form onsubmit="AnchorDialog.update();return false;" action="#">\r
        <table border="0" cellpadding="4" cellspacing="0">\r
                <tr>\r
-                       <td colspan="2" class="title">{$lang_insert_anchor_title}</td>\r
+                       <td colspan="2" class="title">{#advanced_dlg.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
+                       <td nowrap="nowrap">{#advanced_dlg.anchor_name}:</td>\r
+                       <td><input name="anchorName" type="text" class="mceFocus" 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
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
                </div>\r
 \r
                <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </div>\r
-\r
 </form>\r
 </body>\r
 </html>\r
index 9aed1d4b5cbc75eede2e1b43d94ec27819943d6e..e4c7344848ffe297c147d37d2f481c8402e15c88 100644 (file)
@@ -1,27 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$lang_theme_charmap_title}</title>\r
+       <title>{#advanced_dlg.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
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/charmap.js"></script>\r
        <base target="_self" />\r
 </head>\r
-<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<body id="charmap" 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
+        <td colspan="2" class="title">{#advanced_dlg.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 id="charmapView" rowspan="2" align="left" valign="top">\r
+                       <!-- Chars will be rendered here -->\r
         </td>\r
         <td width="100" align="center" valign="top">\r
-            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">\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
+                    <td 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
+                    <td id="codeN">&nbsp;</td>\r
                 </tr>\r
             </table>\r
         </td>\r
index 668d744a3409b40009138577063db50bbf22bed7..a8f297c6038adb555386335aff4956e2cb6a4b8d 100644 (file)
@@ -1,27 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#advanced_dlg.colorpicker_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="js/color_picker.js"></script>\r
        <base target="_self" />\r
 </head>\r
-<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<body id="colorpicker" style="display: none">\r
+<form onsubmit="insertAction();return false" action="#">\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
+                       <li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_picker_tab}</a></span></li>\r
+                       <li id="rgb_tab"><span><a href="javascript:;" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li>\r
+                       <li id="named_tab"><span><a  href="javascript:;" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_named_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
+                               <legend>{#advanced_dlg.colorpicker_picker_title}</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
+                                       <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" />\r
 \r
                                        <div id="light">\r
                                                <!-- Will be filled with divs -->\r
@@ -34,7 +35,7 @@
 \r
                <div id="rgb_panel" class="panel">\r
                        <fieldset>\r
-                               <legend>{$lang_web_colors}</legend>\r
+                               <legend>{#advanced_dlg.colorpicker_palette_title}</legend>\r
                                <div id="webcolors">\r
                                        <!-- Gets filled with web safe colors-->\r
                                </div>\r
@@ -45,7 +46,7 @@
 \r
                <div id="named_panel" class="panel">\r
                        <fieldset>\r
-                               <legend>{$lang_named_colors}</legend>\r
+                               <legend>{#advanced_dlg.colorpicker_named_title}</legend>\r
                                <div id="namedcolors">\r
                                        <!-- Gets filled with named colors-->\r
                                </div>\r
@@ -53,7 +54,7 @@
                                <br style="clear: both" />\r
 \r
                                <div id="colornamecontainer">\r
-                                       {$lang_color_name} <span id="colorname"></span>\r
+                                       {#advanced_dlg.colorpicker_name} <span id="colorname"></span>\r
                                </div>\r
                        </fieldset>\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
+                       <input type="submit" id="insert" name="insert" value="{#apply}" />\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
+                       <label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text mceFocus" />\r
                </div>\r
        </div>\r
+</form>\r
 </body>\r
 </html>\r
diff --git a/program/js/tiny_mce/themes/advanced/css/editor_content.css b/program/js/tiny_mce/themes/advanced/css/editor_content.css
deleted file mode 100644 (file)
index 182e791..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* 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/program/js/tiny_mce/themes/advanced/css/editor_popup.css b/program/js/tiny_mce/themes/advanced/css/editor_popup.css
deleted file mode 100644 (file)
index f8d3550..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-/* 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/program/js/tiny_mce/themes/advanced/docs/en/about.htm b/program/js/tiny_mce/themes/advanced/docs/en/about.htm
deleted file mode 100644 (file)
index a6957a6..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<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
deleted file mode 100644 (file)
index 518b285..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-<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
deleted file mode 100644 (file)
index f4070a3..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<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
deleted file mode 100644 (file)
index 5b5f528..0000000
Binary files a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif and /dev/null 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
deleted file mode 100644 (file)
index cdc617e..0000000
Binary files a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif and /dev/null 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
deleted file mode 100644 (file)
index 7bad758..0000000
Binary files a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif and /dev/null 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
deleted file mode 100644 (file)
index 6a032c5..0000000
Binary files a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif and /dev/null 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
deleted file mode 100644 (file)
index 9810a93..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<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
deleted file mode 100644 (file)
index 332cbc6..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<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
deleted file mode 100644 (file)
index 1529648..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<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
deleted file mode 100644 (file)
index 4f64450..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<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
deleted file mode 100644 (file)
index f352a05..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<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
deleted file mode 100644 (file)
index ebc0538..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-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
index 7697f19453022fc0a919a74a9c947ecf0a552710..ccc2a549b2f1434f2da334d497e80141ded26601 100644 (file)
@@ -1 +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,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';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.entityDecode(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
+(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,each=tinymce.each,Cookie=tinymce.util.Cookie,lastExtID,explode=tinymce.explode;tinymce.ThemeManager.requireLangPack('advanced');tinymce.create('tinymce.themes.AdvancedTheme',{controls:{bold:['bold_desc','Bold'],italic:['italic_desc','Italic'],underline:['underline_desc','Underline'],strikethrough:['striketrough_desc','Strikethrough'],justifyleft:['justifyleft_desc','JustifyLeft'],justifycenter:['justifycenter_desc','JustifyCenter'],justifyright:['justifyright_desc','JustifyRight'],justifyfull:['justifyfull_desc','JustifyFull'],bullist:['bullist_desc','InsertUnorderedList'],numlist:['numlist_desc','InsertOrderedList'],outdent:['outdent_desc','Outdent'],indent:['indent_desc','Indent'],cut:['cut_desc','Cut'],copy:['copy_desc','Copy'],paste:['paste_desc','Paste'],undo:['undo_desc','Undo'],redo:['redo_desc','Redo'],link:['link_desc','mceLink'],unlink:['unlink_desc','unlink'],image:['image_desc','mceImage'],cleanup:['cleanup_desc','mceCleanup'],help:['help_desc','mceHelp'],code:['code_desc','mceCodeEditor'],hr:['hr_desc','InsertHorizontalRule'],removeformat:['removeformat_desc','RemoveFormat'],sub:['sub_desc','subscript'],sup:['sup_desc','superscript'],forecolor:['forecolor_desc','ForeColor'],forecolorpicker:['forecolor_desc','mceForeColor'],backcolor:['backcolor_desc','HiliteColor'],backcolorpicker:['backcolor_desc','mceBackColor'],charmap:['charmap_desc','mceCharMap'],visualaid:['visualaid_desc','mceToggleVisualAid'],anchor:['anchor_desc','mceInsertAnchor'],newdocument:['newdocument_desc','mceNewDocument'],blockquote:['blockquote_desc','mceBlockQuote']},stateControls:['bold','italic','underline','strikethrough','bullist','numlist','justifyleft','justifycenter','justifyright','justifyfull','sub','sup','blockquote'],init:function(ed,url){var t=this,s,v;t.editor=ed;t.url=url;t.onResolveName=new tinymce.util.Dispatcher(this);t.settings=s=extend({theme_advanced_path:true,theme_advanced_toolbar_location:'bottom',theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1},ed.settings);if((v=s.theme_advanced_path_location)&&v!='none')s.theme_advanced_statusbar_location=s.theme_advanced_path_location;if(s.theme_advanced_statusbar_location=='none')s.theme_advanced_statusbar_location=0;ed.onInit.add(function(){ed.onNodeChange.add(t._nodeChanged,t);if(ed.settings.content_css!==false)ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/"+ed.settings.skin+"/content.css"));});ed.onSetProgressState.add(function(ed,b,ti){var co,id=ed.id,tb;if(b){t.progressTimer=setTimeout(function(){co=ed.getContainer();co=co.insertBefore(DOM.create('DIV',{style:'position:relative'}),co.firstChild);tb=DOM.get(ed.id+'_tbl');DOM.add(co,'div',{id:id+'_blocker','class':'mceBlocker',style:{width:tb.clientWidth+2,height:tb.clientHeight+2}});DOM.add(co,'div',{id:id+'_progress','class':'mceProgress',style:{left:tb.clientWidth/ 2, top : tb.clientHeight /2}});},ti||0);}else{DOM.remove(id+'_blocker');DOM.remove(id+'_progress');clearTimeout(t.progressTimer);}});DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui.css"));if(s.skin_variant)DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui_"+s.skin_variant+".css"));},createControl:function(n,cf){var cd,c;if(c=cf.createControl(n))return c;switch(n){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu();}if((cd=this.controls[n]))return cf.createButton(n,{title:"advanced."+cd[0],cmd:cd[1],ui:cd[2],value:cd[3]});},execCommand:function(cmd,ui,val){var f=this['_'+cmd];if(f){f.call(this,ui,val);return true;}return false;},_importClasses:function(){var ed=this.editor,c=ed.controlManager.get('styleselect');if(c.getLength()==0){each(ed.dom.getClasses(),function(o){c.add(o['class'],o['class']);});}},_createStyleSelect:function(n){var t=this,ed=t.editor,cf=ed.controlManager,c=cf.createListBox('styleselect',{title:'advanced.style_select',onselect:function(v){if(c.selectedValue===v){ed.execCommand('mceSetStyleInfo',0,{command:'removeformat'});c.select();return false;}else ed.execCommand('mceSetCSSClass',0,v);}});if(c){each(ed.getParam('theme_advanced_styles','','hash'),function(v,k){if(v)c.add(t.editor.translate(k),v);});c.onPostRender.add(function(ed,n){Event.add(n,'focus',t._importClasses,t);Event.add(n,'mousedown',t._importClasses,t);});}return c;},_createFontSelect:function(){var c,t=this,ed=t.editor;c=ed.controlManager.createListBox('fontselect',{title:'advanced.fontdefault',cmd:'FontName'});if(c){each(ed.getParam('theme_advanced_fonts',t.settings.theme_advanced_fonts,'hash'),function(v,k){c.add(ed.translate(k),v,{style:v.indexOf('dings')==-1?'font-family:'+v:''});});}return c;},_createFontSizeSelect:function(){var c,t=this,lo=["1 (8 pt)","2 (10 pt)","3 (12 pt)","4 (14 pt)","5 (18 pt)","6 (24 pt)","7 (36 pt)"],fz=[8,10,12,14,18,24,36];c=t.editor.controlManager.createListBox('fontsizeselect',{title:'advanced.font_size',cmd:'FontSize'});if(c){each(explode(t.settings.theme_advanced_font_sizes),function(v){c.add(lo[parseInt(v)-1],v,{'style':'font-size:'+fz[v-1]+'pt','class':'mceFontSize'+v});});}return c;},_createBlockFormats:function(){var c,fmts={p:'advanced.paragraph',address:'advanced.address',pre:'advanced.pre',h1:'advanced.h1',h2:'advanced.h2',h3:'advanced.h3',h4:'advanced.h4',h5:'advanced.h5',h6:'advanced.h6',div:'advanced.div',blockquote:'advanced.blockquote',code:'advanced.code',dt:'advanced.dt',dd:'advanced.dd',samp:'advanced.samp'},t=this;c=t.editor.controlManager.createListBox('formatselect',{title:'advanced.block',cmd:'FormatBlock'});if(c){each(t.editor.getParam('theme_advanced_blockformats',t.settings.theme_advanced_blockformats,'hash'),function(v,k){c.add(t.editor.translate(k!=v?k:fmts[v]),v,{'class':'mce_formatPreview mce_'+v});});}return c;},_createForeColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_text_colors)o.colors=v;o.title='advanced.forecolor_desc';o.cmd='ForeColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('forecolor',o);return c;},_createBackColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_background_colors)o.colors=v;o.title='advanced.backcolor_desc';o.cmd='HiliteColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('backcolor',o);return c;},renderUI:function(o){var n,ic,tb,t=this,ed=t.editor,s=t.settings,sc,p,nl;n=p=DOM.create('span',{id:ed.id+'_parent','class':'mceEditor '+ed.settings.skin+'Skin'+(s.skin_variant?' '+ed.settings.skin+'Skin'+t._ufirst(s.skin_variant):'')});if(!DOM.boxModel)n=DOM.add(n,'div',{'class':'mceOldBoxModel'});n=sc=DOM.add(n,'table',{id:ed.id+'_tbl','class':'mceLayout',cellSpacing:0,cellPadding:0});n=tb=DOM.add(n,'tbody');switch((s.theme_advanced_layout_manager||'').toLowerCase()){case"rowlayout":ic=t._rowLayout(s,tb,o);break;case"customlayout":ic=ed.execCallback("theme_advanced_custom_layout",s,tb,o,p);break;default:ic=t._simpleLayout(s,tb,o,p);}n=o.targetNode;nl=DOM.stdMode?sc.getElementsByTagName('tr'):sc.rows;DOM.addClass(nl[0],'mceFirst');DOM.addClass(nl[nl.length-1],'mceLast');each(DOM.select('tr',tb),function(n){DOM.addClass(n.firstChild,'mceFirst');DOM.addClass(n.childNodes[n.childNodes.length-1],'mceLast');});if(DOM.get(s.theme_advanced_toolbar_container))DOM.get(s.theme_advanced_toolbar_container).appendChild(p);else DOM.insertAfter(p,n);Event.add(ed.id+'_path_row','click',function(e){e=e.target;if(e.nodeName=='A'){t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/,'$1'));return Event.cancel(e);}});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))Event.add(DOM.add(p,'a',{href:'#'},'<!-- IE -->'),'focus',function(){tinyMCE.get(ed.id).focus();});if(s.theme_advanced_toolbar_location=='external')o.deltaHeight=0;t.deltaHeight=o.deltaHeight;o.targetNode=null;return{iframeContainer:ic,editorContainer:ed.id+'_parent',sizeContainer:sc,deltaHeight:o.deltaHeight};},getInfo:function(){return{longname:'Advanced theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}},resizeBy:function(dw,dh){var e=DOM.get(this.editor.id+'_tbl');this.resizeTo(e.clientWidth+dw,e.clientHeight+dh);},resizeTo:function(w,h){var ed=this.editor,s=ed.settings,e=DOM.get(ed.id+'_tbl'),ifr=DOM.get(ed.id+'_ifr'),dh;w=Math.max(s.theme_advanced_resizing_min_width||100,w);h=Math.max(s.theme_advanced_resizing_min_height||100,h);w=Math.min(s.theme_advanced_resizing_max_width||0xFFFF,w);h=Math.min(s.theme_advanced_resizing_max_height||0xFFFF,h);dh=e.clientHeight-ifr.clientHeight;DOM.setStyle(ifr,'height',h-dh);DOM.setStyles(e,{width:w,height:h});},destroy:function(){var id=this.editor.id;Event.clear(id+'_resize');Event.clear(id+'_path_row');Event.clear(id+'_external_close');},_simpleLayout:function(s,tb,o,p){var t=this,ed=t.editor,lo=s.theme_advanced_toolbar_location,sl=s.theme_advanced_statusbar_location,n,ic,etb,c;if(lo=='top')t._addToolbars(tb,o);if(lo=='external'){n=c=DOM.create('div',{style:'position:relative'});n=DOM.add(n,'div',{id:ed.id+'_external','class':'mceExternalToolbar'});DOM.add(n,'a',{id:ed.id+'_external_close',href:'javascript:;','class':'mceExternalClose'});n=DOM.add(n,'table',{id:ed.id+'_tblext',cellSpacing:0,cellPadding:0});etb=DOM.add(n,'tbody');if(p.firstChild.className=='mceOldBoxModel')p.firstChild.appendChild(c);else p.insertBefore(c,p.firstChild);t._addToolbars(etb,o);ed.onMouseUp.add(function(){var e=DOM.get(ed.id+'_external');DOM.show(e);DOM.hide(lastExtID);var f=Event.add(ed.id+'_external_close','click',function(){DOM.hide(ed.id+'_external');Event.remove(ed.id+'_external_close','click',f);});DOM.show(e);DOM.setStyle(e,'top',0-DOM.getRect(ed.id+'_tblext').h-1);DOM.hide(e);DOM.show(e);e.style.filter='';lastExtID=ed.id+'_external';e=null;});}if(sl=='top')t._addStatusBar(tb,o);if(!s.theme_advanced_toolbar_container){n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});}if(lo=='bottom')t._addToolbars(tb,o);if(sl=='bottom')t._addStatusBar(tb,o);return ic;},_rowLayout:function(s,tb,o){var t=this,ed=t.editor,dc,da,cf=ed.controlManager,n,ic,to,a;dc=s.theme_advanced_containers_default_class||'';da=s.theme_advanced_containers_default_align||'center';each(explode(s.theme_advanced_containers||''),function(c,i){var v=s['theme_advanced_container_'+c]||'';switch(c.toLowerCase()){case'mceeditor':n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});break;case'mceelementpath':t._addStatusBar(tb,o);break;default:a=s['theme_advanced_container_'+c+'_align'].toLowerCase();a='mce'+t._ufirst(a);n=DOM.add(DOM.add(tb,'tr'),'td',{'class':'mceToolbar '+(s['theme_advanced_container_'+c+'_class']||dc)+' '+a||da});to=cf.createToolbar("toolbar"+i);t._addControls(v,to);DOM.setHTML(n,to.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}});return ic;},_addControls:function(v,tb){var t=this,s=t.settings,di,cf=t.editor.controlManager;if(s.theme_advanced_disable&&!t._disabled){di={};each(explode(s.theme_advanced_disable),function(v){di[v]=1;});t._disabled=di;}else di=t._disabled;each(explode(v),function(n){var c;if(di&&di[n])return;if(n=='tablecontrols'){each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(n){n=t.createControl(n,cf);if(n)tb.add(n);});return;}c=t.createControl(n,cf);if(c)tb.add(c);});},_addToolbars:function(c,o){var t=this,i,tb,ed=t.editor,s=t.settings,v,cf=ed.controlManager,di,n,h=[],a;a=s.theme_advanced_toolbar_align.toLowerCase();a='mce'+t._ufirst(a);n=DOM.add(DOM.add(c,'tr'),'td',{'class':'mceToolbar '+a});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))h.push(DOM.createHTML('a',{href:'#',onfocus:'tinyMCE.get(\''+ed.id+'\').focus();'},'<!-- IE -->'));h.push(DOM.createHTML('a',{href:'#',accesskey:'q',title:ed.getLang("advanced.toolbar_focus")},'<!-- IE -->'));for(i=1;(v=s['theme_advanced_buttons'+i]);i++){tb=cf.createToolbar("toolbar"+i,{'class':'mceToolbarRow'+i});if(s['theme_advanced_buttons'+i+'_add'])v+=','+s['theme_advanced_buttons'+i+'_add'];if(s['theme_advanced_buttons'+i+'_add_before'])v=s['theme_advanced_buttons'+i+'_add_before']+','+v;t._addControls(v,tb);h.push(tb.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}h.push(DOM.createHTML('a',{href:'#',accesskey:'z',title:ed.getLang("advanced.toolbar_focus"),onfocus:'tinyMCE.getInstanceById(\''+ed.id+'\').focus();'},'<!-- IE -->'));DOM.setHTML(n,h.join(''));},_addStatusBar:function(tb,o){var n,t=this,ed=t.editor,s=t.settings,r,mf,me,td;n=DOM.add(tb,'tr');n=td=DOM.add(n,'td',{'class':'mceStatusbar'});n=DOM.add(n,'div',{id:ed.id+'_path_row'},s.theme_advanced_path?ed.translate('advanced.path')+': ':'&nbsp;');DOM.add(n,'a',{href:'#',accesskey:'x'});if(s.theme_advanced_resizing&&!tinymce.isOldWebKit){DOM.add(td,'a',{id:ed.id+'_resize',href:'javascript:;',onclick:"return false;",'class':'mceResize'});if(s.theme_advanced_resizing_use_cookie){ed.onPostRender.add(function(){var o=Cookie.getHash("TinyMCE_"+ed.id+"_size"),c=DOM.get(ed.id+'_tbl');if(!o)return;if(s.theme_advanced_resize_horizontal)c.style.width=Math.max(10,o.cw)+'px';c.style.height=Math.max(10,o.ch)+'px';DOM.get(ed.id+'_ifr').style.height=Math.max(10,parseInt(o.ch)+t.deltaHeight)+'px';});}ed.onPostRender.add(function(){Event.add(ed.id+'_resize','mousedown',function(e){var c,p,w,h,n,pa;c=DOM.get(ed.id+'_tbl');w=c.clientWidth;h=c.clientHeight;miw=s.theme_advanced_resizing_min_width||100;mih=s.theme_advanced_resizing_min_height||100;maw=s.theme_advanced_resizing_max_width||0xFFFF;mah=s.theme_advanced_resizing_max_height||0xFFFF;p=DOM.add(DOM.get(ed.id+'_parent'),'div',{'class':'mcePlaceHolder'});DOM.setStyles(p,{width:w,height:h});DOM.hide(c);DOM.show(p);r={x:e.screenX,y:e.screenY,w:w,h:h,dx:null,dy:null};mf=Event.add(DOM.doc,'mousemove',function(e){var w,h;r.dx=e.screenX-r.x;r.dy=e.screenY-r.y;w=Math.max(miw,r.w+r.dx);h=Math.max(mih,r.h+r.dy);w=Math.min(maw,w);h=Math.min(mah,h);if(s.theme_advanced_resize_horizontal)p.style.width=w+'px';p.style.height=h+'px';return Event.cancel(e);});me=Event.add(DOM.doc,'mouseup',function(e){var ifr;Event.remove(DOM.doc,'mousemove',mf);Event.remove(DOM.doc,'mouseup',me);c.style.display='';DOM.remove(p);if(r.dx===null)return;ifr=DOM.get(ed.id+'_ifr');if(s.theme_advanced_resize_horizontal)c.style.width=Math.max(10,r.w+r.dx)+'px';c.style.height=Math.max(10,r.h+r.dy)+'px';ifr.style.height=Math.max(10,ifr.clientHeight+r.dy)+'px';if(s.theme_advanced_resizing_use_cookie){Cookie.setHash("TinyMCE_"+ed.id+"_size",{cw:r.w+r.dx,ch:r.h+r.dy});}});return Event.cancel(e);});});}o.deltaHeight-=21;n=tb=null;},_nodeChanged:function(ed,cm,n,co){var t=this,p,de=0,v,c,s=t.settings;tinymce.each(t.stateControls,function(c){cm.setActive(c,ed.queryCommandState(t.controls[c][1]));});cm.setActive('visualaid',ed.hasVisual);cm.setDisabled('undo',!ed.undoManager.hasUndo()&&!ed.typing);cm.setDisabled('redo',!ed.undoManager.hasRedo());cm.setDisabled('outdent',!ed.queryCommandState('Outdent'));p=DOM.getParent(n,'A');if(c=cm.get('link')){if(!p||!p.name){c.setDisabled(!p&&co);c.setActive(!!p);}}if(c=cm.get('unlink')){c.setDisabled(!p&&co);c.setActive(!!p&&!p.name);}if(c=cm.get('anchor')){c.setActive(!!p&&p.name);if(tinymce.isWebKit){p=DOM.getParent(n,'IMG');c.setActive(!!p&&DOM.getAttrib(p,'mce_name')=='a');}}p=DOM.getParent(n,'IMG');if(c=cm.get('image'))c.setActive(!!p&&n.className.indexOf('mceItem')==-1);if(c=cm.get('styleselect')){if(n.className){t._importClasses();c.select(n.className);}else c.select();}if(c=cm.get('formatselect')){p=DOM.getParent(n,DOM.isBlock);if(p)c.select(p.nodeName.toLowerCase());}if(c=cm.get('fontselect'))c.select(ed.queryCommandValue('FontName'));if(c=cm.get('fontsizeselect'))c.select(ed.queryCommandValue('FontSize'));if(s.theme_advanced_path&&s.theme_advanced_statusbar_location){p=DOM.get(ed.id+'_path')||DOM.add(ed.id+'_path_row','span',{id:ed.id+'_path'});DOM.setHTML(p,'');ed.dom.getParent(n,function(n){var na=n.nodeName.toLowerCase(),u,pi,ti='';if(n.nodeType!=1||(DOM.hasClass(n,'mceItemHidden')||DOM.hasClass(n,'mceItemRemoved')))return;if(v=DOM.getAttrib(n,'mce_name'))na=v;if(tinymce.isIE&&n.scopeName!=='HTML')na=n.scopeName+':'+na;na=na.replace(/mce\:/g,'');switch(na){case'b':na='strong';break;case'i':na='em';break;case'img':if(v=DOM.getAttrib(n,'src'))ti+='src: '+v+' ';break;case'a':if(v=DOM.getAttrib(n,'name')){ti+='name: '+v+' ';na+='#'+v;}if(v=DOM.getAttrib(n,'href'))ti+='href: '+v+' ';break;case'font':if(s.convert_fonts_to_spans)na='span';if(v=DOM.getAttrib(n,'face'))ti+='font: '+v+' ';if(v=DOM.getAttrib(n,'size'))ti+='size: '+v+' ';if(v=DOM.getAttrib(n,'color'))ti+='color: '+v+' ';break;case'span':if(v=DOM.getAttrib(n,'style'))ti+='style: '+v+' ';break;}if(v=DOM.getAttrib(n,'id'))ti+='id: '+v+' ';if(v=n.className){v=v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g,'');if(v&&v.indexOf('mceItem')==-1){ti+='class: '+v+' ';if(DOM.isBlock(n)||na=='img'||na=='span')na+='.'+v;}}na=na.replace(/(html:)/g,'');na={name:na,node:n,title:ti};t.onResolveName.dispatch(t,na);ti=na.title;na=na.name;pi=DOM.create('a',{'href':"javascript:;",onmousedown:"return false;",title:ti,'class':'mcePath_'+(de++)},na);if(p.hasChildNodes()){p.insertBefore(DOM.doc.createTextNode(' \u00bb '),p.firstChild);p.insertBefore(pi,p.firstChild);}else p.appendChild(pi);},ed.getBody());}},_sel:function(v){this.editor.execCommand('mceSelectNodeDepth',false,v);},_mceInsertAnchor:function(ui,v){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/anchor.htm',width:320+parseInt(ed.getLang('advanced.anchor_delta_width',0)),height:90+parseInt(ed.getLang('advanced.anchor_delta_height',0)),inline:true},{theme_url:this.url});},_mceCharMap:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/charmap.htm',width:550+parseInt(ed.getLang('advanced.charmap_delta_width',0)),height:250+parseInt(ed.getLang('advanced.charmap_delta_height',0)),inline:true},{theme_url:this.url});},_mceHelp:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/about.htm',width:480,height:380,inline:true},{theme_url:this.url});},_mceColorPicker:function(u,v){var ed=this.editor;v=v||{};ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/color_picker.htm',width:375+parseInt(ed.getLang('advanced.colorpicker_delta_width',0)),height:250+parseInt(ed.getLang('advanced.colorpicker_delta_height',0)),close_previous:false,inline:true},{input_color:v.color,func:v.func,theme_url:this.url});},_mceCodeEditor:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/source_editor.htm',width:parseInt(ed.getParam("theme_advanced_source_editor_width",720)),height:parseInt(ed.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url});},_mceImage:function(ui,val){var ed=this.editor;if(ed.dom.getAttrib(ed.selection.getNode(),'class').indexOf('mceItem')!=-1)return;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/image.htm',width:355+parseInt(ed.getLang('advanced.image_delta_width',0)),height:275+parseInt(ed.getLang('advanced.image_delta_height',0)),inline:true},{theme_url:this.url});},_mceLink:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/link.htm',width:310+parseInt(ed.getLang('advanced.link_delta_width',0)),height:200+parseInt(ed.getLang('advanced.link_delta_height',0)),inline:true},{theme_url:this.url});},_mceNewDocument:function(){var ed=this.editor;ed.windowManager.confirm('advanced.newdocument',function(s){if(s)ed.execCommand('mceSetContent',false,'');});},_mceForeColor:function(){var t=this;this._mceColorPicker(0,{func:function(co){t.editor.execCommand('ForeColor',false,co);}});},_mceBackColor:function(){var t=this;this._mceColorPicker(0,{func:function(co){t.editor.execCommand('HiliteColor',false,co);}});},_ufirst:function(s){return s.substring(0,1).toUpperCase()+s.substring(1);}});tinymce.ThemeManager.add('advanced',tinymce.themes.AdvancedTheme);}());
\ No newline at end of file
index 06544d749b0eaa523c671cda5e0f3bbb411e9769..381ba6ba72e05a1b836b2f80889077e05a148edb 100644 (file)
-/**
- * $Id: editor_template_src.js 296 2007-08-21 10:36:35Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/* Import theme specific language pack */
-tinyMCE.importThemeLanguagePack('advanced');
-
-var TinyMCE_AdvancedTheme = {
-       // Private theme fields
-       _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 : [
-               // Control id, button img, button title, command, user_interface, value
-               ['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',
-
-       /**
-        * Returns HTML code for the specificed control.
-        */
-       getControlHTML : function(button_name) {
-               var i, x, but;
-
-               // Lookup button in button list
-               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));
-               }
-
-               // Custom controlls other than buttons
-               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>';
-
-                               // Build format select
-                               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,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';
-                               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 "";
-       },
-
-       /**
-        * Theme specific execcommand handling.
-        */
-       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;
-
-                               // Is anchor not a link
-                               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');
-
-                                       // Try old onclick to if copy/pasted content
-                                       if (onclick == "")
-                                               onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
-
-                                       onclick = tinyMCE.cleanupEventStr(onclick);
-
-                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
-
-                                       // Use mce_href if defined
-                                       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;
-
-                               // Language specific width and height addons
-                               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) {
-                                       // Is it a internal MCE visual aid image, then skip this one.
-                                       if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)
-                                               return true;
-
-                                       src = tinyMCE.getAttrib(img, 'src');
-                                       alt = tinyMCE.getAttrib(img, 'alt');
-
-                                       // Try polling out the title
-                                       if (alt == "")
-                                               alt = tinyMCE.getAttrib(img, 'title');
-
-                                       // Fix width/height attributes if the styles is specified
-                                       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');
-
-                                       // Is realy specified?
-                                       if (tinyMCE.isMSIE) {
-                                               width = img.attributes['width'].specified ? width : "";
-                                               height = img.attributes['height'].specified ? height : "";
-                                       }
-
-                                       //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));
-                                       //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));
-
-                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
-
-                                       // Use mce_src if defined
-                                       mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');
-                                       if (mceRealSrc != "") {
-                                               src = mceRealSrc;
-
-                                               if (tinyMCE.getParam('convert_urls'))
-                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
-                                       }
-
-                                       //if (onmouseover != "")
-                                       //      onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");
-
-                                       //if (onmouseout != "")
-                                       //      onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");
-
-                                       action = "update";
-                               }
-
-                               var template = new Array();
-
-                               template['file'] = 'image.htm?src={$src}';
-                               template['width'] = 355;
-                               template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);
-
-                               // Language specific width and height addons
-                               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);
-
-                               // Create color layer
-                               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);
-
-                               // Create color layer
-                               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.entityDecode(tinyMCE.getLang('lang_newdocument'))))
-                                       tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');
-
-                               return true;
-               }
-
-               return false;
-       },
-
-       /**
-        * Editor instance template function.
-        */
-       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");
-
-               // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!
-               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" : //the default TinyMCE Layout (for backwards compatibility)...
-                               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"); // Compatiblity
-                               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"
-                               };
-
-                               // Add accessibility control
-                               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>';
-
-                               // Render rows
-                               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;
-                                       }
-                               }
-
-                               // Add accessibility control
-                               toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';
-
-                               // Setup template html
-                               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>';
-
-                               // External toolbar changes
-                               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);
-                                       // bod.style.marginTop = elm.offsetHeight + "px";
-
-                                       deltaHeight = 0;
-                                       tinyMCE.getInstanceById(editorId).toolbarElement = elm;
-
-                                       //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"];
-                               } 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>';
-                               //"SimpleLayout"
-                       break;
-
-                       case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.
-                               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");
-
-                               //Render Containers:
-                               for (var i = 0; i < containers.length; i++)
-                               {
-                                       if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...
-                                               template['html'] += '<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';
-                                       else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:
-                                       {
-                                               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 { // Render normal Container
-                                               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>';
-                               //RowLayout
-                       break;
-
-                       case "CustomLayout" : //User defined layout callback...
-                               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);
-
-               // Set to default values
-               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();
-               }
-       },
-
-       /**
-        * Node change handler.
-        */
-       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;
-               };
-
-               // No node provided
-               if (node == null)
-                       return;
-
-               // Update path
-               var pathElm = document.getElementById(editor_id + "_path");
-               var inst = tinyMCE.getInstanceById(editor_id);
-               var doc = inst.getDoc();
-               TinyMCE_AdvancedTheme._hideMenus(editor_id);
-
-               if (pathElm) {
-                       // Get node path
-                       var parentNode = node;
-                       var path = new Array();
-                       
-                       while (parentNode != null) {
-                               if (parentNode.nodeName.toUpperCase() == "BODY") {
-                                       break;
-                               }
-
-                               // Only append element nodes to path
-                               if (parentNode.nodeType == 1 && tinyMCE.getAttrib(parentNode, "class").indexOf('mceItemHidden') == -1) {
-                                       path[path.length] = parentNode;
-                               }
-
-                               parentNode = parentNode.parentNode;
-                       }
-
-                       // Setup HTML
-                       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;';
-               }
-
-               // Reset old states
-               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');
-
-               // Get link
-               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');
-               }
-
-               // Handle visual aid
-               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');
-               }
-
-               // Within li, blockquote
-               if (tinyMCE.getParentElement(node, "li,blockquote"))
-                       tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal');
-
-               // Has redo levels
-               if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))
-                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal');
-
-               // Has undo levels
-               if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))
-                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal');
-
-               // Select class in select box
-               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;
-               }
-
-               // Select formatblock
-               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, "");
-               }
-
-               // Select fontselect
-               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, "");
-                       }
-               }
-
-               // Select fontsize
-               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");
-                       }
-               }
-
-               // Handle align attributes
-               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);
-
-               // Div justification
-               var div = tinyMCE.getParentElement(node, "div");
-               if (div && div.style.textAlign == "center")
-                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');
-
-               // Do special text
-               if (!setup_content) {
-                       // , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"
-                       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');
-               }
-
-               // Handle elements
-               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);
-       },
-
-       // Private theme internal functions
-
-       // This function auto imports CSS classes into the class selection droplist
-       _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]);
-                       }
-
-                       // Only do this once
-                       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";
-
-               // Is it to small, make it bigger again
-               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";
-                       }
-               }
-
-               // Remove pesky table controls
-               inst.useCSS = false;
-       },
-
-       /**
-        * Handles resizing events.
-        */
-       _resizeEventHandler : function(e) {
-               var resizer = TinyMCE_AdvancedTheme._resizer;
-
-               // Do nothing
-               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);
-
-                               // Expire in a month
-                               if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
-                                       var expires = new Date();
-                                       expires.setTime(expires.getTime() + 3600000 * 24 * 30);
-
-                                       // Set the cookies
-                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);
-                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);
-                               }
-                               break;
-               }
-       },
-
-       /**
-        * Starts/stops the editor resizing.
-        */
-       _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) {
-                       // Place box over editor area
-                       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;
-
-                       // Hide editor and show resize box
-                       editorArea.style.display = "none";
-                       resizeBox.style.display = "block";
-
-                       // Add event handlers, only once
-                       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), // Force absolute
-                       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);
-
-// Add default buttons maps for advanced theme and all internal plugins
-tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
+/**\r
+ * $Id: editor_template_src.js 766 2008-04-03 20:37:06Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode;\r
+\r
+       // Tell it to load theme specific language pack(s)\r
+       tinymce.ThemeManager.requireLangPack('advanced');\r
+\r
+       tinymce.create('tinymce.themes.AdvancedTheme', {\r
+               // Control name lookup, format: title, command\r
+               controls : {\r
+                       bold : ['bold_desc', 'Bold'],\r
+                       italic : ['italic_desc', 'Italic'],\r
+                       underline : ['underline_desc', 'Underline'],\r
+                       strikethrough : ['striketrough_desc', 'Strikethrough'],\r
+                       justifyleft : ['justifyleft_desc', 'JustifyLeft'],\r
+                       justifycenter : ['justifycenter_desc', 'JustifyCenter'],\r
+                       justifyright : ['justifyright_desc', 'JustifyRight'],\r
+                       justifyfull : ['justifyfull_desc', 'JustifyFull'],\r
+                       bullist : ['bullist_desc', 'InsertUnorderedList'],\r
+                       numlist : ['numlist_desc', 'InsertOrderedList'],\r
+                       outdent : ['outdent_desc', 'Outdent'],\r
+                       indent : ['indent_desc', 'Indent'],\r
+                       cut : ['cut_desc', 'Cut'],\r
+                       copy : ['copy_desc', 'Copy'],\r
+                       paste : ['paste_desc', 'Paste'],\r
+                       undo : ['undo_desc', 'Undo'],\r
+                       redo : ['redo_desc', 'Redo'],\r
+                       link : ['link_desc', 'mceLink'],\r
+                       unlink : ['unlink_desc', 'unlink'],\r
+                       image : ['image_desc', 'mceImage'],\r
+                       cleanup : ['cleanup_desc', 'mceCleanup'],\r
+                       help : ['help_desc', 'mceHelp'],\r
+                       code : ['code_desc', 'mceCodeEditor'],\r
+                       hr : ['hr_desc', 'InsertHorizontalRule'],\r
+                       removeformat : ['removeformat_desc', 'RemoveFormat'],\r
+                       sub : ['sub_desc', 'subscript'],\r
+                       sup : ['sup_desc', 'superscript'],\r
+                       forecolor : ['forecolor_desc', 'ForeColor'],\r
+                       forecolorpicker : ['forecolor_desc', 'mceForeColor'],\r
+                       backcolor : ['backcolor_desc', 'HiliteColor'],\r
+                       backcolorpicker : ['backcolor_desc', 'mceBackColor'],\r
+                       charmap : ['charmap_desc', 'mceCharMap'],\r
+                       visualaid : ['visualaid_desc', 'mceToggleVisualAid'],\r
+                       anchor : ['anchor_desc', 'mceInsertAnchor'],\r
+                       newdocument : ['newdocument_desc', 'mceNewDocument'],\r
+                       blockquote : ['blockquote_desc', 'mceBlockQuote']\r
+               },\r
+\r
+               stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'],\r
+\r
+               init : function(ed, url) {\r
+                       var t = this, s, v;\r
+       \r
+                       t.editor = ed;\r
+                       t.url = url;\r
+                       t.onResolveName = new tinymce.util.Dispatcher(this);\r
+\r
+                       // Default settings\r
+                       t.settings = s = extend({\r
+                               theme_advanced_path : true,\r
+                               theme_advanced_toolbar_location : 'bottom',\r
+                               theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",\r
+                               theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",\r
+                               theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap",\r
+                               theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6",\r
+                               theme_advanced_toolbar_align : "center",\r
+                               theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",\r
+                               theme_advanced_font_sizes : "1,2,3,4,5,6,7",\r
+                               theme_advanced_more_colors : 1,\r
+                               theme_advanced_row_height : 23,\r
+                               theme_advanced_resize_horizontal : 1,\r
+                               theme_advanced_resizing_use_cookie : 1\r
+                       }, ed.settings);\r
+\r
+                       if ((v = s.theme_advanced_path_location) && v != 'none')\r
+                               s.theme_advanced_statusbar_location = s.theme_advanced_path_location;\r
+\r
+                       if (s.theme_advanced_statusbar_location == 'none')\r
+                               s.theme_advanced_statusbar_location = 0;\r
+\r
+                       // Init editor\r
+                       ed.onInit.add(function() {\r
+                               ed.onNodeChange.add(t._nodeChanged, t);\r
+\r
+                               if (ed.settings.content_css !== false)\r
+                                       ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css"));\r
+                       });\r
+\r
+                       ed.onSetProgressState.add(function(ed, b, ti) {\r
+                               var co, id = ed.id, tb;\r
+\r
+                               if (b) {\r
+                                       t.progressTimer = setTimeout(function() {\r
+                                               co = ed.getContainer();\r
+                                               co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild);\r
+                                               tb = DOM.get(ed.id + '_tbl');\r
+\r
+                                               DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}});\r
+                                               DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}});\r
+                                       }, ti || 0);\r
+                               } else {\r
+                                       DOM.remove(id + '_blocker');\r
+                                       DOM.remove(id + '_progress');\r
+                                       clearTimeout(t.progressTimer);\r
+                               }\r
+                       });\r
+\r
+                       DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css || "themes/advanced/skins/" + ed.settings.skin + "/ui.css"));\r
+\r
+                       if (s.skin_variant)\r
+                               DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css || "themes/advanced/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"));\r
+               },\r
+\r
+               createControl : function(n, cf) {\r
+                       var cd, c;\r
+\r
+                       if (c = cf.createControl(n))\r
+                               return c;\r
+\r
+                       switch (n) {\r
+                               case "styleselect":\r
+                                       return this._createStyleSelect();\r
+\r
+                               case "formatselect":\r
+                                       return this._createBlockFormats();\r
+\r
+                               case "fontselect":\r
+                                       return this._createFontSelect();\r
+\r
+                               case "fontsizeselect":\r
+                                       return this._createFontSizeSelect();\r
+\r
+                               case "forecolor":\r
+                                       return this._createForeColorMenu();\r
+\r
+                               case "backcolor":\r
+                                       return this._createBackColorMenu();\r
+                       }\r
+\r
+                       if ((cd = this.controls[n]))\r
+                               return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]});\r
+               },\r
+\r
+               execCommand : function(cmd, ui, val) {\r
+                       var f = this['_' + cmd];\r
+\r
+                       if (f) {\r
+                               f.call(this, ui, val);\r
+                               return true;\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+\r
+               _importClasses : function() {\r
+                       var ed = this.editor, c = ed.controlManager.get('styleselect');\r
+\r
+                       if (c.getLength() == 0) {\r
+                               each(ed.dom.getClasses(), function(o) {\r
+                                       c.add(o['class'], o['class']);\r
+                               });\r
+                       }\r
+               },\r
+\r
+               _createStyleSelect : function(n) {\r
+                       var t = this, ed = t.editor, cf = ed.controlManager, c = cf.createListBox('styleselect', {\r
+                               title : 'advanced.style_select',\r
+                               onselect : function(v) {\r
+                                       if (c.selectedValue === v) {\r
+                                               ed.execCommand('mceSetStyleInfo', 0, {command : 'removeformat'});\r
+                                               c.select();\r
+                                               return false;\r
+                                       } else\r
+                                               ed.execCommand('mceSetCSSClass', 0, v);\r
+                               }\r
+                       });\r
+\r
+                       if (c) {\r
+                               each(ed.getParam('theme_advanced_styles', '', 'hash'), function(v, k) {\r
+                                       if (v)\r
+                                               c.add(t.editor.translate(k), v);\r
+                               });\r
+\r
+                               c.onPostRender.add(function(ed, n) {\r
+                                       Event.add(n, 'focus', t._importClasses, t);\r
+                                       Event.add(n, 'mousedown', t._importClasses, t);\r
+                               });\r
+                       }\r
+\r
+                       return c;\r
+               },\r
+\r
+               _createFontSelect : function() {\r
+                       var c, t = this, ed = t.editor;\r
+\r
+                       c = ed.controlManager.createListBox('fontselect', {title : 'advanced.fontdefault', cmd : 'FontName'});\r
+                       if (c) {\r
+                               each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) {\r
+                                       c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''});\r
+                               });\r
+                       }\r
+\r
+                       return c;\r
+               },\r
+\r
+               _createFontSizeSelect : function() {\r
+                       var c, t = this, lo = [\r
+                               "1 (8 pt)",\r
+                               "2 (10 pt)",\r
+                               "3 (12 pt)",\r
+                               "4 (14 pt)",\r
+                               "5 (18 pt)",\r
+                               "6 (24 pt)",\r
+                               "7 (36 pt)"\r
+                       ], fz = [8, 10, 12, 14, 18, 24, 36];\r
+\r
+                       c = t.editor.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', cmd : 'FontSize'});\r
+                       if (c) {\r
+                               each(explode(t.settings.theme_advanced_font_sizes), function(v) {\r
+                                       c.add(lo[parseInt(v) - 1], v, {'style' : 'font-size:' + fz[v - 1] + 'pt', 'class' : 'mceFontSize' + v});\r
+                               });\r
+                       }\r
+\r
+                       return c;\r
+               },\r
+\r
+               _createBlockFormats : function() {\r
+                       var c, fmts = {\r
+                               p : 'advanced.paragraph',\r
+                               address : 'advanced.address',\r
+                               pre : 'advanced.pre',\r
+                               h1 : 'advanced.h1',\r
+                               h2 : 'advanced.h2',\r
+                               h3 : 'advanced.h3',\r
+                               h4 : 'advanced.h4',\r
+                               h5 : 'advanced.h5',\r
+                               h6 : 'advanced.h6',\r
+                               div : 'advanced.div',\r
+                               blockquote : 'advanced.blockquote',\r
+                               code : 'advanced.code',\r
+                               dt : 'advanced.dt',\r
+                               dd : 'advanced.dd',\r
+                               samp : 'advanced.samp'\r
+                       }, t = this;\r
+\r
+                       c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'});\r
+                       if (c) {\r
+                               each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {\r
+                                       c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v});\r
+                               });\r
+                       }\r
+\r
+                       return c;\r
+               },\r
+\r
+               _createForeColorMenu : function() {\r
+                       var c, t = this, s = t.settings, o = {}, v;\r
+\r
+                       if (s.theme_advanced_more_colors) {\r
+                               o.more_colors_func = function() {\r
+                                       t._mceColorPicker(0, {\r
+                                               color : c.value,\r
+                                               func : function(co) {\r
+                                                       c.setColor(co);\r
+                                               }\r
+                                       });\r
+                               };\r
+                       }\r
+\r
+                       if (v = s.theme_advanced_text_colors)\r
+                               o.colors = v;\r
+\r
+                       o.title = 'advanced.forecolor_desc';\r
+                       o.cmd = 'ForeColor';\r
+                       o.scope = this;\r
+\r
+                       c = t.editor.controlManager.createColorSplitButton('forecolor', o);\r
+\r
+                       return c;\r
+               },\r
+\r
+               _createBackColorMenu : function() {\r
+                       var c, t = this, s = t.settings, o = {}, v;\r
+\r
+                       if (s.theme_advanced_more_colors) {\r
+                               o.more_colors_func = function() {\r
+                                       t._mceColorPicker(0, {\r
+                                               color : c.value,\r
+                                               func : function(co) {\r
+                                                       c.setColor(co);\r
+                                               }\r
+                                       });\r
+                               };\r
+                       }\r
+\r
+                       if (v = s.theme_advanced_background_colors)\r
+                               o.colors = v;\r
+\r
+                       o.title = 'advanced.backcolor_desc';\r
+                       o.cmd = 'HiliteColor';\r
+                       o.scope = this;\r
+\r
+                       c = t.editor.controlManager.createColorSplitButton('backcolor', o);\r
+\r
+                       return c;\r
+               },\r
+\r
+               renderUI : function(o) {\r
+                       var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl;\r
+\r
+                       n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});\r
+\r
+                       if (!DOM.boxModel)\r
+                               n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});\r
+\r
+                       n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});\r
+                       n = tb = DOM.add(n, 'tbody');\r
+\r
+                       switch ((s.theme_advanced_layout_manager || '').toLowerCase()) {\r
+                               case "rowlayout":\r
+                                       ic = t._rowLayout(s, tb, o);\r
+                                       break;\r
+\r
+                               case "customlayout":\r
+                                       ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p);\r
+                                       break;\r
+\r
+                               default:\r
+                                       ic = t._simpleLayout(s, tb, o, p);\r
+                       }\r
+\r
+                       n = o.targetNode;\r
+\r
+                       // Add classes to first and last TRs\r
+                       nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8\r
+                       DOM.addClass(nl[0], 'mceFirst');\r
+                       DOM.addClass(nl[nl.length - 1], 'mceLast');\r
+\r
+                       // Add classes to first and last TDs\r
+                       each(DOM.select('tr', tb), function(n) {\r
+                               DOM.addClass(n.firstChild, 'mceFirst');\r
+                               DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast');\r
+                       });\r
+\r
+                       if (DOM.get(s.theme_advanced_toolbar_container))\r
+                               DOM.get(s.theme_advanced_toolbar_container).appendChild(p);\r
+                       else\r
+                               DOM.insertAfter(p, n);\r
+\r
+                       Event.add(ed.id + '_path_row', 'click', function(e) {\r
+                               e = e.target;\r
+\r
+                               if (e.nodeName == 'A') {\r
+                                       t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1'));\r
+\r
+                                       return Event.cancel(e);\r
+                               }\r
+                       });\r
+/*\r
+                       if (DOM.get(ed.id + '_path_row')) {\r
+                               Event.add(ed.id + '_tbl', 'mouseover', function(e) {\r
+                                       var re;\r
+       \r
+                                       e = e.target;\r
+\r
+                                       if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) {\r
+                                               re = DOM.get(ed.id + '_path_row');\r
+                                               t.lastPath = re.innerHTML;\r
+                                               DOM.setHTML(re, e.parentNode.title);\r
+                                       }\r
+                               });\r
+\r
+                               Event.add(ed.id + '_tbl', 'mouseout', function(e) {\r
+                                       if (t.lastPath) {\r
+                                               DOM.setHTML(ed.id + '_path_row', t.lastPath);\r
+                                               t.lastPath = 0;\r
+                                       }\r
+                               });\r
+                       }\r
+*/\r
+\r
+                       if (!ed.getParam('accessibility_focus') || ed.getParam('tab_focus'))\r
+                               Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'), 'focus', function() {tinyMCE.get(ed.id).focus();});\r
+\r
+                       if (s.theme_advanced_toolbar_location == 'external')\r
+                               o.deltaHeight = 0;\r
+\r
+                       t.deltaHeight = o.deltaHeight;\r
+                       o.targetNode = null;\r
+\r
+                       return {\r
+                               iframeContainer : ic,\r
+                               editorContainer : ed.id + '_parent',\r
+                               sizeContainer : sc,\r
+                               deltaHeight : o.deltaHeight\r
+                       };\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Advanced theme',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       }\r
+               },\r
+\r
+               resizeBy : function(dw, dh) {\r
+                       var e = DOM.get(this.editor.id + '_tbl');\r
+\r
+                       this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);\r
+               },\r
+\r
+               resizeTo : function(w, h) {\r
+                       var ed = this.editor, s = ed.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'), dh;\r
+\r
+                       // Boundery fix box\r
+                       w = Math.max(s.theme_advanced_resizing_min_width || 100, w);\r
+                       h = Math.max(s.theme_advanced_resizing_min_height || 100, h);\r
+                       w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w);\r
+                       h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h);\r
+\r
+                       // Calc difference between iframe and container\r
+                       dh = e.clientHeight - ifr.clientHeight;\r
+\r
+                       // Resize iframe and container\r
+                       DOM.setStyle(ifr, 'height', h - dh);\r
+                       DOM.setStyles(e, {width : w, height : h});\r
+               },\r
+\r
+               destroy : function() {\r
+                       var id = this.editor.id;\r
+\r
+                       Event.clear(id + '_resize');\r
+                       Event.clear(id + '_path_row');\r
+                       Event.clear(id + '_external_close');\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _simpleLayout : function(s, tb, o, p) {\r
+                       var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c;\r
+\r
+                       // Create toolbar container at top\r
+                       if (lo == 'top')\r
+                               t._addToolbars(tb, o);\r
+\r
+                       // Create external toolbar\r
+                       if (lo == 'external') {\r
+                               n = c = DOM.create('div', {style : 'position:relative'});\r
+                               n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'});\r
+                               DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'});\r
+                               n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0});\r
+                               etb = DOM.add(n, 'tbody');\r
+\r
+                               if (p.firstChild.className == 'mceOldBoxModel')\r
+                                       p.firstChild.appendChild(c);\r
+                               else\r
+                                       p.insertBefore(c, p.firstChild);\r
+\r
+                               t._addToolbars(etb, o);\r
+\r
+                               ed.onMouseUp.add(function() {\r
+                                       var e = DOM.get(ed.id + '_external');\r
+                                       DOM.show(e);\r
+\r
+                                       DOM.hide(lastExtID);\r
+\r
+                                       var f = Event.add(ed.id + '_external_close', 'click', function() {\r
+                                               DOM.hide(ed.id + '_external');\r
+                                               Event.remove(ed.id + '_external_close', 'click', f);\r
+                                       });\r
+\r
+                                       DOM.show(e);\r
+                                       DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1);\r
+\r
+                                       // Fixes IE rendering bug\r
+                                       DOM.hide(e);\r
+                                       DOM.show(e);\r
+                                       e.style.filter = '';\r
+\r
+                                       lastExtID = ed.id + '_external';\r
+\r
+                                       e = null;\r
+                               });\r
+                       }\r
+\r
+                       if (sl == 'top')\r
+                               t._addStatusBar(tb, o);\r
+\r
+                       // Create iframe container\r
+                       if (!s.theme_advanced_toolbar_container) {\r
+                               n = DOM.add(tb, 'tr');\r
+                               n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});\r
+                       }\r
+\r
+                       // Create toolbar container at bottom\r
+                       if (lo == 'bottom')\r
+                               t._addToolbars(tb, o);\r
+\r
+                       if (sl == 'bottom')\r
+                               t._addStatusBar(tb, o);\r
+\r
+                       return ic;\r
+               },\r
+\r
+               _rowLayout : function(s, tb, o) {\r
+                       var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a;\r
+\r
+                       dc = s.theme_advanced_containers_default_class || '';\r
+                       da = s.theme_advanced_containers_default_align || 'center';\r
+\r
+                       each(explode(s.theme_advanced_containers || ''), function(c, i) {\r
+                               var v = s['theme_advanced_container_' + c] || '';\r
+\r
+                               switch (c.toLowerCase()) {\r
+                                       case 'mceeditor':\r
+                                               n = DOM.add(tb, 'tr');\r
+                                               n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});\r
+                                               break;\r
+\r
+                                       case 'mceelementpath':\r
+                                               t._addStatusBar(tb, o);\r
+                                               break;\r
+\r
+                                       default:\r
+                                               a = s['theme_advanced_container_' + c + '_align'].toLowerCase();\r
+                                               a = 'mce' + t._ufirst(a);\r
+\r
+                                               n = DOM.add(DOM.add(tb, 'tr'), 'td', {\r
+                                                       'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da\r
+                                               });\r
+\r
+                                               to = cf.createToolbar("toolbar" + i);\r
+                                               t._addControls(v, to);\r
+                                               DOM.setHTML(n, to.renderHTML());\r
+                                               o.deltaHeight -= s.theme_advanced_row_height;\r
+                               }\r
+                       });\r
+\r
+                       return ic;\r
+               },\r
+\r
+               _addControls : function(v, tb) {\r
+                       var t = this, s = t.settings, di, cf = t.editor.controlManager;\r
+\r
+                       if (s.theme_advanced_disable && !t._disabled) {\r
+                               di = {};\r
+\r
+                               each(explode(s.theme_advanced_disable), function(v) {\r
+                                       di[v] = 1;\r
+                               });\r
+\r
+                               t._disabled = di;\r
+                       } else\r
+                               di = t._disabled;\r
+\r
+                       each(explode(v), function(n) {\r
+                               var c;\r
+\r
+                               if (di && di[n])\r
+                                       return;\r
+\r
+                               // Compatiblity with 2.x\r
+                               if (n == 'tablecontrols') {\r
+                                       each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) {\r
+                                               n = t.createControl(n, cf);\r
+\r
+                                               if (n)\r
+                                                       tb.add(n);\r
+                                       });\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               c = t.createControl(n, cf);\r
+\r
+                               if (c)\r
+                                       tb.add(c);\r
+                       });\r
+               },\r
+\r
+               _addToolbars : function(c, o) {\r
+                       var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a;\r
+\r
+                       a = s.theme_advanced_toolbar_align.toLowerCase();\r
+                       a = 'mce' + t._ufirst(a);\r
+\r
+                       n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a});\r
+\r
+                       if (!ed.getParam('accessibility_focus') || ed.getParam('tab_focus'))\r
+                               h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));\r
+\r
+                       h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->'));\r
+\r
+                       // Create toolbar and add the controls\r
+                       for (i=1; (v = s['theme_advanced_buttons' + i]); i++) {\r
+                               tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i});\r
+\r
+                               if (s['theme_advanced_buttons' + i + '_add'])\r
+                                       v += ',' + s['theme_advanced_buttons' + i + '_add'];\r
+\r
+                               if (s['theme_advanced_buttons' + i + '_add_before'])\r
+                                       v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v;\r
+\r
+                               t._addControls(v, tb);\r
+\r
+                               //n.appendChild(n = tb.render());\r
+                               h.push(tb.renderHTML());\r
+\r
+                               o.deltaHeight -= s.theme_advanced_row_height;\r
+                       }\r
+\r
+                       h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));\r
+                       DOM.setHTML(n, h.join(''));\r
+               },\r
+\r
+               _addStatusBar : function(tb, o) {\r
+                       var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;\r
+\r
+                       n = DOM.add(tb, 'tr');\r
+                       n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});\r
+                       n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : '&nbsp;');\r
+                       DOM.add(n, 'a', {href : '#', accesskey : 'x'});\r
+\r
+                       if (s.theme_advanced_resizing && !tinymce.isOldWebKit) {\r
+                               DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'});\r
+\r
+                               if (s.theme_advanced_resizing_use_cookie) {\r
+                                       ed.onPostRender.add(function() {\r
+                                               var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl');\r
+\r
+                                               if (!o)\r
+                                                       return;\r
+\r
+                                               if (s.theme_advanced_resize_horizontal)\r
+                                                       c.style.width = Math.max(10, o.cw) + 'px';\r
+\r
+                                               c.style.height = Math.max(10, o.ch) + 'px';\r
+                                               DOM.get(ed.id + '_ifr').style.height = Math.max(10, parseInt(o.ch) + t.deltaHeight) + 'px';\r
+                                       });\r
+                               }\r
+\r
+                               ed.onPostRender.add(function() {\r
+                                       Event.add(ed.id + '_resize', 'mousedown', function(e) {\r
+                                               var c, p, w, h, n, pa;\r
+\r
+                                               // Measure container\r
+                                               c = DOM.get(ed.id + '_tbl');\r
+                                               w = c.clientWidth;\r
+                                               h = c.clientHeight;\r
+\r
+                                               miw = s.theme_advanced_resizing_min_width || 100;\r
+                                               mih = s.theme_advanced_resizing_min_height || 100;\r
+                                               maw = s.theme_advanced_resizing_max_width || 0xFFFF;\r
+                                               mah = s.theme_advanced_resizing_max_height || 0xFFFF;\r
+\r
+                                               // Setup placeholder\r
+                                               p = DOM.add(DOM.get(ed.id + '_parent'), 'div', {'class' : 'mcePlaceHolder'});\r
+                                               DOM.setStyles(p, {width : w, height : h});\r
+\r
+                                               // Replace with placeholder\r
+                                               DOM.hide(c);\r
+                                               DOM.show(p);\r
+\r
+                                               // Create internal resize obj\r
+                                               r = {\r
+                                                       x : e.screenX,\r
+                                                       y : e.screenY,\r
+                                                       w : w,\r
+                                                       h : h,\r
+                                                       dx : null,\r
+                                                       dy : null\r
+                                               };\r
+\r
+                                               // Start listening\r
+                                               mf = Event.add(DOM.doc, 'mousemove', function(e) {\r
+                                                       var w, h;\r
+\r
+                                                       // Calc delta values\r
+                                                       r.dx = e.screenX - r.x;\r
+                                                       r.dy = e.screenY - r.y;\r
+\r
+                                                       // Boundery fix box\r
+                                                       w = Math.max(miw, r.w + r.dx);\r
+                                                       h = Math.max(mih, r.h + r.dy);\r
+                                                       w = Math.min(maw, w);\r
+                                                       h = Math.min(mah, h);\r
+\r
+                                                       // Resize placeholder\r
+                                                       if (s.theme_advanced_resize_horizontal)\r
+                                                               p.style.width = w + 'px';\r
+\r
+                                                       p.style.height = h + 'px';\r
+\r
+                                                       return Event.cancel(e);\r
+                                               });\r
+\r
+                                               me = Event.add(DOM.doc, 'mouseup', function(e) {\r
+                                                       var ifr;\r
+\r
+                                                       // Stop listening\r
+                                                       Event.remove(DOM.doc, 'mousemove', mf);\r
+                                                       Event.remove(DOM.doc, 'mouseup', me);\r
+\r
+                                                       c.style.display = '';\r
+                                                       DOM.remove(p);\r
+\r
+                                                       if (r.dx === null)\r
+                                                               return;\r
+\r
+                                                       ifr = DOM.get(ed.id + '_ifr');\r
+\r
+                                                       if (s.theme_advanced_resize_horizontal)\r
+                                                               c.style.width = Math.max(10, r.w + r.dx) + 'px';\r
+\r
+                                                       c.style.height = Math.max(10, r.h + r.dy) + 'px';\r
+                                                       ifr.style.height = Math.max(10, ifr.clientHeight + r.dy) + 'px';\r
+\r
+                                                       if (s.theme_advanced_resizing_use_cookie) {\r
+                                                               Cookie.setHash("TinyMCE_" + ed.id + "_size", {\r
+                                                                       cw : r.w + r.dx,\r
+                                                                       ch : r.h + r.dy\r
+                                                               });\r
+                                                       }\r
+                                               });\r
+\r
+                                               return Event.cancel(e);\r
+                                       });\r
+                               });\r
+                       }\r
+\r
+                       o.deltaHeight -= 21;\r
+                       n = tb = null;\r
+               },\r
+\r
+               _nodeChanged : function(ed, cm, n, co) {\r
+                       var t = this, p, de = 0, v, c, s = t.settings;\r
+\r
+                       tinymce.each(t.stateControls, function(c) {\r
+                               cm.setActive(c, ed.queryCommandState(t.controls[c][1]));\r
+                       });\r
+\r
+                       cm.setActive('visualaid', ed.hasVisual);\r
+                       cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);\r
+                       cm.setDisabled('redo', !ed.undoManager.hasRedo());\r
+                       cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));\r
+\r
+                       p = DOM.getParent(n, 'A');\r
+                       if (c = cm.get('link')) {\r
+                               if (!p || !p.name) {\r
+                                       c.setDisabled(!p && co);\r
+                                       c.setActive(!!p);\r
+                               }\r
+                       }\r
+\r
+                       if (c = cm.get('unlink')) {\r
+                               c.setDisabled(!p && co);\r
+                               c.setActive(!!p && !p.name);\r
+                       }\r
+\r
+                       if (c = cm.get('anchor')) {\r
+                               c.setActive(!!p && p.name);\r
+\r
+                               if (tinymce.isWebKit) {\r
+                                       p = DOM.getParent(n, 'IMG');\r
+                                       c.setActive(!!p && DOM.getAttrib(p, 'mce_name') == 'a');\r
+                               }\r
+                       }\r
+\r
+                       p = DOM.getParent(n, 'IMG');\r
+                       if (c = cm.get('image'))\r
+                               c.setActive(!!p && n.className.indexOf('mceItem') == -1);\r
+\r
+                       if (c = cm.get('styleselect')) {\r
+                               if (n.className) {\r
+                                       t._importClasses();\r
+                                       c.select(n.className);\r
+                               } else\r
+                                       c.select();\r
+                       }\r
+\r
+                       if (c = cm.get('formatselect')) {\r
+                               p = DOM.getParent(n, DOM.isBlock);\r
+\r
+                               if (p)\r
+                                       c.select(p.nodeName.toLowerCase());\r
+                       }\r
+\r
+                       if (c = cm.get('fontselect'))\r
+                               c.select(ed.queryCommandValue('FontName'));\r
+\r
+                       if (c = cm.get('fontsizeselect'))\r
+                               c.select(ed.queryCommandValue('FontSize'));\r
+\r
+                       if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {\r
+                               p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});\r
+                               DOM.setHTML(p, '');\r
+\r
+                               ed.dom.getParent(n, function(n) {\r
+                                       var na = n.nodeName.toLowerCase(), u, pi, ti = '';\r
+\r
+                                       // Ignore non element and hidden elements\r
+                                       if (n.nodeType != 1 || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))\r
+                                               return;\r
+\r
+                                       // Fake name\r
+                                       if (v = DOM.getAttrib(n, 'mce_name'))\r
+                                               na = v;\r
+       \r
+                                       // Handle prefix\r
+                                       if (tinymce.isIE && n.scopeName !== 'HTML')\r
+                                               na = n.scopeName + ':' + na;\r
+\r
+                                       // Remove internal prefix\r
+                                       na = na.replace(/mce\:/g, '');\r
+\r
+                                       // Handle node name\r
+                                       switch (na) {\r
+                                               case 'b':\r
+                                                       na = 'strong';\r
+                                                       break;\r
+\r
+                                               case 'i':\r
+                                                       na = 'em';\r
+                                                       break;\r
+\r
+                                               case 'img':\r
+                                                       if (v = DOM.getAttrib(n, 'src'))\r
+                                                               ti += 'src: ' + v + ' ';\r
+\r
+                                                       break;\r
+\r
+                                               case 'a':\r
+                                                       if (v = DOM.getAttrib(n, 'name')) {\r
+                                                               ti += 'name: ' + v + ' ';\r
+                                                               na += '#' + v;\r
+                                                       }\r
+\r
+                                                       if (v = DOM.getAttrib(n, 'href'))\r
+                                                               ti += 'href: ' + v + ' ';\r
+\r
+                                                       break;\r
+\r
+                                               case 'font':\r
+                                                       if (s.convert_fonts_to_spans)\r
+                                                               na = 'span';\r
+\r
+                                                       if (v = DOM.getAttrib(n, 'face'))\r
+                                                               ti += 'font: ' + v + ' ';\r
+\r
+                                                       if (v = DOM.getAttrib(n, 'size'))\r
+                                                               ti += 'size: ' + v + ' ';\r
+\r
+                                                       if (v = DOM.getAttrib(n, 'color'))\r
+                                                               ti += 'color: ' + v + ' ';\r
+\r
+                                                       break;\r
+\r
+                                               case 'span':\r
+                                                       if (v = DOM.getAttrib(n, 'style'))\r
+                                                               ti += 'style: ' + v + ' ';\r
+\r
+                                                       break;\r
+                                       }\r
+\r
+                                       if (v = DOM.getAttrib(n, 'id'))\r
+                                               ti += 'id: ' + v + ' ';\r
+\r
+                                       if (v = n.className) {\r
+                                               v = v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g, '');\r
+\r
+                                               if (v && v.indexOf('mceItem') == -1) {\r
+                                                       ti += 'class: ' + v + ' ';\r
+\r
+                                                       if (DOM.isBlock(n) || na == 'img' || na == 'span')\r
+                                                               na += '.' + v;\r
+                                               }\r
+                                       }\r
+\r
+                                       na = na.replace(/(html:)/g, '');\r
+                                       na = {name : na, node : n, title : ti};\r
+                                       t.onResolveName.dispatch(t, na);\r
+                                       ti = na.title;\r
+                                       na = na.name;\r
+\r
+                                       //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');";\r
+                                       pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);\r
+\r
+                                       if (p.hasChildNodes()) {\r
+                                               p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild);\r
+                                               p.insertBefore(pi, p.firstChild);\r
+                                       } else\r
+                                               p.appendChild(pi);\r
+                               }, ed.getBody());\r
+                       }\r
+               },\r
+\r
+               // Commands gets called by execCommand\r
+\r
+               _sel : function(v) {\r
+                       this.editor.execCommand('mceSelectNodeDepth', false, v);\r
+               },\r
+\r
+               _mceInsertAnchor : function(ui, v) {\r
+                       var ed = this.editor;\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/anchor.htm',\r
+                               width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)),\r
+                               height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)),\r
+                               inline : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceCharMap : function() {\r
+                       var ed = this.editor;\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/charmap.htm',\r
+                               width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)),\r
+                               height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),\r
+                               inline : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceHelp : function() {\r
+                       var ed = this.editor;\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/about.htm',\r
+                               width : 480,\r
+                               height : 380,\r
+                               inline : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceColorPicker : function(u, v) {\r
+                       var ed = this.editor;\r
+\r
+                       v = v || {};\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/color_picker.htm',\r
+                               width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)),\r
+                               height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)),\r
+                               close_previous : false,\r
+                               inline : true\r
+                       }, {\r
+                               input_color : v.color,\r
+                               func : v.func,\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceCodeEditor : function(ui, val) {\r
+                       var ed = this.editor;\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/source_editor.htm',\r
+                               width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)),\r
+                               height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)),\r
+                               inline : true,\r
+                               resizable : true,\r
+                               maximizable : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceImage : function(ui, val) {\r
+                       var ed = this.editor;\r
+\r
+                       // Internal image object like a flash placeholder\r
+                       if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1)\r
+                               return;\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/image.htm',\r
+                               width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)),\r
+                               height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)),\r
+                               inline : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceLink : function(ui, val) {\r
+                       var ed = this.editor;\r
+\r
+                       ed.windowManager.open({\r
+                               url : tinymce.baseURL + '/themes/advanced/link.htm',\r
+                               width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)),\r
+                               height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)),\r
+                               inline : true\r
+                       }, {\r
+                               theme_url : this.url\r
+                       });\r
+               },\r
+\r
+               _mceNewDocument : function() {\r
+                       var ed = this.editor;\r
+\r
+                       ed.windowManager.confirm('advanced.newdocument', function(s) {\r
+                               if (s)\r
+                                       ed.execCommand('mceSetContent', false, '');\r
+                       });\r
+               },\r
+\r
+               _mceForeColor : function() {\r
+                       var t = this;\r
+\r
+                       this._mceColorPicker(0, {\r
+                               func : function(co) {\r
+                                       t.editor.execCommand('ForeColor', false, co);\r
+                               }\r
+                       });\r
+               },\r
+\r
+               _mceBackColor : function() {\r
+                       var t = this;\r
+\r
+                       this._mceColorPicker(0, {\r
+                               func : function(co) {\r
+                                       t.editor.execCommand('HiliteColor', false, co);\r
+                               }\r
+                       });\r
+               },\r
+\r
+               _ufirst : function(s) {\r
+                       return s.substring(0, 1).toUpperCase() + s.substring(1);\r
+               }\r
+       });\r
+\r
+       tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);\r
+}());
\ No newline at end of file
index cceea955e40b66df26f9daa520ebabdc8602caad..6c366469c3ec341814cf376c9cc96aebd7d92caa 100644 (file)
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-       <title>{$lang_insert_image_title}</title>
-       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
-       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>
-       <script language="javascript" type="text/javascript" src="jscripts/image.js"></script>
-       <base target="_self" />
-</head>
-<body id="image" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
-<form onsubmit="insertImage();return false;" action="#">
-       <div class="tabs">
-               <ul>
-                       <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>
-               </ul>
-       </div>
-
-       <div class="panel_wrapper">
-               <div id="general_panel" class="panel current">
-     <table border="0" cellpadding="4" cellspacing="0">
-          <tr>
-            <td nowrap="nowrap"><label for="src">{$lang_insert_image_src}</label></td>
-            <td><table border="0" cellspacing="0" cellpadding="0">
-                <tr>
-                  <td><input id="src" name="src" type="text" value="" style="width: 200px" onchange="getImageData();" /></td>
-                  <td id="srcbrowsercontainer">&nbsp;</td>
-                </tr>
-              </table></td>
-          </tr>
-                 <!-- Image list -->
-                 <script language="javascript">
-                       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
-                               var html = "";
-
-                               html += '<tr><td><label for="image_list">{$lang_image_list}</label></td>';
-                               html += '<td><select id="image_list" name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';
-                               html += '<option value="">---</option>';
-
-                               for (var i=0; i<tinyMCEImageList.length; i++)
-                                       html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';
-
-                               html += '</select></td></tr>';
-
-                               document.write(html);
-                       }
-                 </script>
-                 <!-- /Image list -->
-          <tr>
-            <td nowrap="nowrap"><label for="alt">{$lang_insert_image_alt}</label></td>
-            <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td>
-          </tr>
-          <tr>
-            <td nowrap="nowrap"><label for="align">{$lang_insert_image_align}</label></td>
-            <td><select id="align" name="align">
-                <option value="">{$lang_insert_image_align_default}</option>
-                <option value="baseline">{$lang_insert_image_align_baseline}</option>
-                <option value="top">{$lang_insert_image_align_top}</option>
-                <option value="middle">{$lang_insert_image_align_middle}</option>
-                <option value="bottom">{$lang_insert_image_align_bottom}</option>
-                <option value="texttop">{$lang_insert_image_align_texttop}</option>
-                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>
-                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>
-                <option value="left">{$lang_insert_image_align_left}</option>
-                <option value="right">{$lang_insert_image_align_right}</option>
-              </select></td>
-          </tr>
-          <tr>
-            <td nowrap="nowrap"><label for="width">{$lang_insert_image_dimensions}</label></td>
-            <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" />
-              x
-              <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td>
-          </tr>
-          <tr>
-            <td nowrap="nowrap"><label for="border">{$lang_insert_image_border}</label></td>
-            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" /></td>
-          </tr>
-          <tr>
-            <td nowrap="nowrap"><label for="vspace">{$lang_insert_image_vspace}</label></td>
-            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" /></td>
-          </tr>
-          <tr>
-            <td nowrap="nowrap"><label for="hspace">{$lang_insert_image_hspace}</label></td>
-            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" /></td>
-          </tr>
-        </table>
-               </div>
-       </div>
-
-       <div class="mceActionPanel">
-               <div style="float: left">
-                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();" />
-               </div>
-
-               <div style="float: right">
-                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
-               </div>
-       </div>
-</form>
-</body>
-</html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{#advanced_dlg.image_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="js/image.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="image" style="display: none">\r
+<form onsubmit="ImageDialog.update();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;">{#advanced_dlg.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">{#advanced_dlg.image_src}</label></td>\r
+            <td><table border="0" cellspacing="0" cellpadding="0">\r
+                <tr>\r
+                  <td><input id="src" name="src" type="text" class="mceFocus" value="" style="width: 200px" onchange="ImageDialog.getImageData();" /></td>\r
+                  <td id="srcbrowsercontainer">&nbsp;</td>\r
+                </tr>\r
+              </table></td>\r
+          </tr>\r
+                 <tr>\r
+                       <td><label for="image_list">{#advanced_dlg.image_list}</label></td>\r
+                       <td><select id="image_list" name="image_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;"></select></td>\r
+                 </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="alt">{#advanced_dlg.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">{#advanced_dlg.image_align}</label></td>\r
+            <td><select id="align" name="align" onchange="ImageDialog.updateStyle();">\r
+                <option value="">{#not_set}</option>\r
+                <option value="baseline">{#advanced_dlg.image_align_baseline}</option>\r
+                <option value="top">{#advanced_dlg.image_align_top}</option>\r
+                <option value="middle">{#advanced_dlg.image_align_middle}</option>\r
+                <option value="bottom">{#advanced_dlg.image_align_bottom}</option>\r
+                <option value="text-top">{#advanced_dlg.image_align_texttop}</option>\r
+                <option value="text-bottom">{#advanced_dlg.image_align_textbottom}</option>\r
+                <option value="left">{#advanced_dlg.image_align_left}</option>\r
+                <option value="right">{#advanced_dlg.image_align_right}</option>\r
+              </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="width">{#advanced_dlg.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">{#advanced_dlg.image_border}</label></td>\r
+            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="vspace">{#advanced_dlg.image_vspace}</label></td>\r
+            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="hspace">{#advanced_dlg.image_hspace}</label></td>\r
+            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>\r
+          </tr>\r
+        </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </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
deleted file mode 100644 (file)
index 34ab715..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/anchor.gif and /dev/null 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
deleted file mode 100644 (file)
index 2eafd79..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/backcolor.gif b/program/js/tiny_mce/themes/advanced/images/backcolor.gif
deleted file mode 100644 (file)
index d03e206..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/backcolor.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold.gif b/program/js/tiny_mce/themes/advanced/images/bold.gif
deleted file mode 100644 (file)
index d6a9cc2..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bold.gif and /dev/null 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
deleted file mode 100644 (file)
index 9b129de..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif and /dev/null 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
deleted file mode 100644 (file)
index ea341e6..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bold_es.gif and /dev/null 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
deleted file mode 100644 (file)
index 2816454..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bold_fr.gif and /dev/null 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
deleted file mode 100644 (file)
index e000d46..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bold_ru.gif and /dev/null 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
deleted file mode 100644 (file)
index 8208543..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bold_tw.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/browse.gif b/program/js/tiny_mce/themes/advanced/images/browse.gif
deleted file mode 100644 (file)
index c786d0b..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/browse.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bullist.gif b/program/js/tiny_mce/themes/advanced/images/bullist.gif
deleted file mode 100644 (file)
index 6e19467..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/bullist.gif and /dev/null 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
deleted file mode 100644 (file)
index c3d8fa2..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/button_menu.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/buttons.gif b/program/js/tiny_mce/themes/advanced/images/buttons.gif
deleted file mode 100644 (file)
index 5ad99a7..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/buttons.gif and /dev/null 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
deleted file mode 100644 (file)
index 4b4aeef..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/charmap.gif b/program/js/tiny_mce/themes/advanced/images/charmap.gif
deleted file mode 100644 (file)
index 3cdc4ac..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/charmap.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cleanup.gif b/program/js/tiny_mce/themes/advanced/images/cleanup.gif
deleted file mode 100644 (file)
index 16491f6..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/cleanup.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/close.gif b/program/js/tiny_mce/themes/advanced/images/close.gif
deleted file mode 100644 (file)
index 679ca2a..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/close.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/code.gif b/program/js/tiny_mce/themes/advanced/images/code.gif
deleted file mode 100644 (file)
index c5d5a67..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/code.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/color.gif b/program/js/tiny_mce/themes/advanced/images/color.gif
deleted file mode 100644 (file)
index 1ecd574..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/color.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/colors.jpg b/program/js/tiny_mce/themes/advanced/images/colors.jpg
deleted file mode 100644 (file)
index b4c542d..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/colors.jpg and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/copy.gif b/program/js/tiny_mce/themes/advanced/images/copy.gif
deleted file mode 100644 (file)
index dc14686..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/copy.gif and /dev/null 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
deleted file mode 100644 (file)
index 4cbccda..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/custom_1.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cut.gif b/program/js/tiny_mce/themes/advanced/images/cut.gif
deleted file mode 100644 (file)
index 4e9a70b..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/cut.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/forecolor.gif b/program/js/tiny_mce/themes/advanced/images/forecolor.gif
deleted file mode 100644 (file)
index 8b70361..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/forecolor.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/help.gif b/program/js/tiny_mce/themes/advanced/images/help.gif
deleted file mode 100644 (file)
index 51a1ee4..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/help.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/hr.gif b/program/js/tiny_mce/themes/advanced/images/hr.gif
deleted file mode 100644 (file)
index 1a1ba2a..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/hr.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/image.gif b/program/js/tiny_mce/themes/advanced/images/image.gif
deleted file mode 100644 (file)
index 4b88edd..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/image.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/indent.gif b/program/js/tiny_mce/themes/advanced/images/indent.gif
deleted file mode 100644 (file)
index acd315b..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/indent.gif and /dev/null 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
deleted file mode 100644 (file)
index 69c131c..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic.gif b/program/js/tiny_mce/themes/advanced/images/italic.gif
deleted file mode 100644 (file)
index 8bb330b..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/italic.gif and /dev/null 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
deleted file mode 100644 (file)
index feb0309..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif and /dev/null 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
deleted file mode 100644 (file)
index 4572cdb..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/italic_es.gif and /dev/null 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
deleted file mode 100644 (file)
index a2bb69a..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/italic_ru.gif and /dev/null 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
deleted file mode 100644 (file)
index 4f6eeaa..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/italic_tw.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifycenter.gif b/program/js/tiny_mce/themes/advanced/images/justifycenter.gif
deleted file mode 100644 (file)
index 42d609a..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/justifycenter.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyfull.gif b/program/js/tiny_mce/themes/advanced/images/justifyfull.gif
deleted file mode 100644 (file)
index c8504f6..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/justifyfull.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyleft.gif b/program/js/tiny_mce/themes/advanced/images/justifyleft.gif
deleted file mode 100644 (file)
index e8f7e42..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/justifyleft.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyright.gif b/program/js/tiny_mce/themes/advanced/images/justifyright.gif
deleted file mode 100644 (file)
index e4cea97..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/justifyright.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/link.gif b/program/js/tiny_mce/themes/advanced/images/link.gif
deleted file mode 100644 (file)
index 1accf42..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/link.gif and /dev/null 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
deleted file mode 100644 (file)
index 50d6afd..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/menu_check.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/newdocument.gif b/program/js/tiny_mce/themes/advanced/images/newdocument.gif
deleted file mode 100644 (file)
index a9d2938..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/newdocument.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/numlist.gif b/program/js/tiny_mce/themes/advanced/images/numlist.gif
deleted file mode 100644 (file)
index a268352..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/numlist.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/opacity.png b/program/js/tiny_mce/themes/advanced/images/opacity.png
deleted file mode 100644 (file)
index b4217cb..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/opacity.png and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/outdent.gif b/program/js/tiny_mce/themes/advanced/images/outdent.gif
deleted file mode 100644 (file)
index 23f6aa4..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/outdent.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/paste.gif b/program/js/tiny_mce/themes/advanced/images/paste.gif
deleted file mode 100644 (file)
index 1b45000..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/paste.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/redo.gif b/program/js/tiny_mce/themes/advanced/images/redo.gif
deleted file mode 100644 (file)
index 3af9069..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/redo.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/removeformat.gif b/program/js/tiny_mce/themes/advanced/images/removeformat.gif
deleted file mode 100644 (file)
index 0fa3cb7..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/removeformat.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/separator.gif b/program/js/tiny_mce/themes/advanced/images/separator.gif
deleted file mode 100644 (file)
index 4f39b80..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/separator.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/spacer.gif b/program/js/tiny_mce/themes/advanced/images/spacer.gif
deleted file mode 100644 (file)
index 3884865..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/spacer.gif and /dev/null 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
deleted file mode 100644 (file)
index af89d80..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/strikethrough.gif b/program/js/tiny_mce/themes/advanced/images/strikethrough.gif
deleted file mode 100644 (file)
index 3264635..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/strikethrough.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/sub.gif b/program/js/tiny_mce/themes/advanced/images/sub.gif
deleted file mode 100644 (file)
index 4d7ce30..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/sub.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/sup.gif b/program/js/tiny_mce/themes/advanced/images/sup.gif
deleted file mode 100644 (file)
index a7145e0..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/sup.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline.gif b/program/js/tiny_mce/themes/advanced/images/underline.gif
deleted file mode 100644 (file)
index 1dfeb5f..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/underline.gif and /dev/null 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
deleted file mode 100644 (file)
index 551d914..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/underline_es.gif and /dev/null 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
deleted file mode 100644 (file)
index 551d914..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/underline_fr.gif and /dev/null 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
deleted file mode 100644 (file)
index b78e2a4..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/underline_ru.gif and /dev/null 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
deleted file mode 100644 (file)
index b715390..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/underline_tw.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/undo.gif b/program/js/tiny_mce/themes/advanced/images/undo.gif
deleted file mode 100644 (file)
index 520796d..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/undo.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/unlink.gif b/program/js/tiny_mce/themes/advanced/images/unlink.gif
deleted file mode 100644 (file)
index 5c8a33d..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/unlink.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/images/visualaid.gif b/program/js/tiny_mce/themes/advanced/images/visualaid.gif
deleted file mode 100644 (file)
index 63caf18..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/visualaid.gif and /dev/null 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
deleted file mode 100644 (file)
index 897a01f..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif and /dev/null 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
deleted file mode 100644 (file)
index aee442b..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif and /dev/null 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
deleted file mode 100644 (file)
index 9dc8abe..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif and /dev/null 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
deleted file mode 100644 (file)
index 616a889..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif and /dev/null 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
deleted file mode 100644 (file)
index c303f66..0000000
Binary files a/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif and /dev/null differ
diff --git a/program/js/tiny_mce/themes/advanced/img/colorpicker.jpg b/program/js/tiny_mce/themes/advanced/img/colorpicker.jpg
new file mode 100644 (file)
index 0000000..b4c542d
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/img/colorpicker.jpg differ
diff --git a/program/js/tiny_mce/themes/advanced/img/icons.gif b/program/js/tiny_mce/themes/advanced/img/icons.gif
new file mode 100644 (file)
index 0000000..ccac36f
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/img/icons.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/js/about.js b/program/js/tiny_mce/themes/advanced/js/about.js
new file mode 100644 (file)
index 0000000..9081e1d
--- /dev/null
@@ -0,0 +1,72 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+function init() {\r
+       var ed, tcont;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       ed = tinyMCEPopup.editor;\r
+\r
+       // Give FF some time\r
+       window.setTimeout('insertHelpIFrame();', 10);\r
+\r
+       tcont = document.getElementById('plugintablecontainer');\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>' + ed.getLang('advanced_dlg.about_plugin') + '</td>';\r
+       html += '<td>' + ed.getLang('advanced_dlg.about_author') + '</td>';\r
+       html += '<td>' + ed.getLang('advanced_dlg.about_version') + '</td>';\r
+       html += '</tr>';\r
+       html += '</thead>';\r
+       html += '<tbody>';\r
+\r
+       tinymce.each(ed.plugins, function(p, n) {\r
+               var info;\r
+\r
+               if (!p.getInfo)\r
+                       return;\r
+\r
+               html += '<tr>';\r
+\r
+               info = p.getInfo();\r
+\r
+               if (info.infourl != null && info.infourl != '')\r
+                       html += '<td width="50%" title="' + n + '"><a href="' + info.infourl + '" target="_blank">' + info.longname + '</a></td>';\r
+               else\r
+                       html += '<td width="50%" title="' + n + '">' + info.longname + '</td>';\r
+\r
+               if (info.authorurl != null && info.authorurl != '')\r
+                       html += '<td width="35%"><a href="' + info.authorurl + '" target="_blank">' + 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
+               document.getElementById('plugins_tab').style.display = '';\r
+\r
+       });\r
+\r
+       html += '</tbody>';\r
+       html += '</table>';\r
+\r
+       tcont.innerHTML = html;\r
+\r
+       tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion;\r
+       tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate;\r
+}\r
+\r
+function insertHelpIFrame() {\r
+       var html;\r
+\r
+       if (tinyMCEPopup.getParam('docs_url')) {\r
+               html = '<iframe width="100%" height="300" src="' + tinyMCEPopup.editor.baseURI.toAbsolute(tinyMCEPopup.getParam('docs_url')) + '"></iframe>';\r
+               document.getElementById('iframecontainer').innerHTML = html;\r
+               document.getElementById('help_tab').style.display = 'block';\r
+       }\r
+}\r
+\r
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/themes/advanced/js/anchor.js b/program/js/tiny_mce/themes/advanced/js/anchor.js
new file mode 100644 (file)
index 0000000..b5efd1e
--- /dev/null
@@ -0,0 +1,37 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var AnchorDialog = {\r
+       init : function(ed) {\r
+               var action, elm, f = document.forms[0];\r
+\r
+               this.editor = ed;\r
+               elm = ed.dom.getParent(ed.selection.getNode(), 'A,IMG');\r
+               v = ed.dom.getAttrib(elm, 'name');\r
+\r
+               if (v) {\r
+                       this.action = 'update';\r
+                       f.anchorName.value = v;\r
+               }\r
+\r
+               f.insert.value = ed.getLang(elm ? 'update' : 'insert');\r
+       },\r
+\r
+       update : function() {\r
+               var ed = this.editor;\r
+               \r
+               tinyMCEPopup.restoreSelection();\r
+\r
+               if (this.action != 'update')\r
+                       ed.selection.collapse(1);\r
+\r
+               // Webkit acts weird if empty inline element is inserted so we need to use a image instead\r
+               if (tinymce.isWebKit)\r
+                       ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('img', {mce_name : 'a', name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}));\r
+               else\r
+                       ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}, ''));\r
+\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
+\r
+tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog);\r
diff --git a/program/js/tiny_mce/themes/advanced/js/charmap.js b/program/js/tiny_mce/themes/advanced/js/charmap.js
new file mode 100644 (file)
index 0000000..8467ef6
--- /dev/null
@@ -0,0 +1,325 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var 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
+tinyMCEPopup.onInit.add(function() {\r
+       tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML());\r
+});\r
+\r
+function renderCharMapHTML() {\r
+       var charsPerRow = 20, tdWidth=20, tdHeight=20, i;\r
+       var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';\r
+       var cols=-1;\r
+\r
+       for (i=0; i<charmap.length; i++) {\r
+               if (charmap[i][2]==true) {\r
+                       cols++;\r
+                       html += ''\r
+                               + '<td class="charmap">'\r
+                               + '<a onmouseover="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" 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:void(0)" onclick="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
+\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
+\r
+       html += '</tr></table>';\r
+\r
+       return 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.editor.focus();\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/js/color_picker.js b/program/js/tiny_mce/themes/advanced/js/color_picker.js
new file mode 100644 (file)
index 0000000..da833dc
--- /dev/null
@@ -0,0 +1,245 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;\r
+\r
+var colors = [\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(tinyMCEPopup.getWindowArg('input_color'));\r
+\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, f = tinyMCEPopup.getWindowArg('func');\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       if (f)\r
+               f(color);\r
+\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.toLowerCase();\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] + '" width="10" height="10">'\r
+                       + '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');" style="display:block;width:10px;height:10px;overflow:hidden;">'\r
+                       + '</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('colors').width / 6;\r
+       partDetail = detail / 2;\r
+       imHeight = document.getElementById('colors').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
+tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/themes/advanced/js/image.js b/program/js/tiny_mce/themes/advanced/js/image.js
new file mode 100644 (file)
index 0000000..038ace7
--- /dev/null
@@ -0,0 +1,245 @@
+var ImageDialog = {\r
+       preInit : function() {\r
+               var url;\r
+\r
+               tinyMCEPopup.requireLangPack();\r
+\r
+               if (url = tinyMCEPopup.getParam("external_image_list_url"))\r
+                       document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');\r
+       },\r
+\r
+       init : function() {\r
+               var f = document.forms[0], ed = tinyMCEPopup.editor;\r
+\r
+               // Setup browse button\r
+               document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');\r
+               if (isVisible('srcbrowser'))\r
+                       document.getElementById('src').style.width = '180px';\r
+\r
+               e = ed.selection.getNode();\r
+\r
+               this.fillFileList('image_list', 'tinyMCEImageList');\r
+\r
+               if (e.nodeName == 'IMG') {\r
+                       f.src.value = ed.dom.getAttrib(e, 'src');\r
+                       f.alt.value = ed.dom.getAttrib(e, 'alt');\r
+                       f.border.value = this.getAttrib(e, 'border');\r
+                       f.vspace.value = this.getAttrib(e, 'vspace');\r
+                       f.hspace.value = this.getAttrib(e, 'hspace');\r
+                       f.width.value = ed.dom.getAttrib(e, 'width');\r
+                       f.height.value = ed.dom.getAttrib(e, 'height');\r
+                       f.insert.value = ed.getLang('update');\r
+                       this.styleVal = ed.dom.getAttrib(e, 'style');\r
+                       selectByValue(f, 'image_list', f.src.value);\r
+                       selectByValue(f, 'align', this.getAttrib(e, 'align'));\r
+                       this.updateStyle();\r
+               }\r
+       },\r
+\r
+       fillFileList : function(id, l) {\r
+               var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;\r
+\r
+               l = window[l];\r
+\r
+               if (l && l.length > 0) {\r
+                       lst.options[lst.options.length] = new Option('', '');\r
+\r
+                       tinymce.each(l, function(o) {\r
+                               lst.options[lst.options.length] = new Option(o[0], o[1]);\r
+                       });\r
+               } else\r
+                       dom.remove(dom.getParent(id, 'tr'));\r
+       },\r
+\r
+       update : function() {\r
+               var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el;\r
+\r
+               tinyMCEPopup.restoreSelection();\r
+\r
+               if (f.src.value === '') {\r
+                       if (ed.selection.getNode().nodeName == 'IMG') {\r
+                               ed.dom.remove(ed.selection.getNode());\r
+                               ed.execCommand('mceRepaint');\r
+                       }\r
+\r
+                       tinyMCEPopup.close();\r
+                       return;\r
+               }\r
+\r
+               if (!ed.settings.inline_styles) {\r
+                       args = tinymce.extend(args, {\r
+                               vspace : nl.vspace.value,\r
+                               hspace : nl.hspace.value,\r
+                               border : nl.border.value,\r
+                               align : getSelectValue(f, 'align')\r
+                       });\r
+               } else\r
+                       args.style = this.styleVal;\r
+\r
+               tinymce.extend(args, {\r
+                       src : f.src.value,\r
+                       alt : f.alt.value,\r
+                       width : f.width.value,\r
+                       height : f.height.value\r
+               });\r
+\r
+               el = ed.selection.getNode();\r
+\r
+               if (el && el.nodeName == 'IMG') {\r
+                       ed.dom.setAttribs(el, args);\r
+               } else {\r
+                       ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" src="javascript:;" />', {skip_undo : 1});\r
+                       ed.dom.setAttribs('__mce_tmp', args);\r
+                       ed.dom.setAttrib('__mce_tmp', 'id', '');\r
+                       ed.undoManager.add();\r
+               }\r
+\r
+               tinyMCEPopup.close();\r
+       },\r
+\r
+       updateStyle : function() {\r
+               var dom = tinyMCEPopup.dom, st, v, f = document.forms[0];\r
+\r
+               if (tinyMCEPopup.editor.settings.inline_styles) {\r
+                       st = tinyMCEPopup.dom.parseStyle(this.styleVal);\r
+\r
+                       // Handle align\r
+                       v = getSelectValue(f, 'align');\r
+                       if (v) {\r
+                               if (v == 'left' || v == 'right') {\r
+                                       st['float'] = v;\r
+                                       delete st['vertical-align'];\r
+                               } else {\r
+                                       st['vertical-align'] = v;\r
+                                       delete st['float'];\r
+                               }\r
+                       } else {\r
+                               delete st['float'];\r
+                               delete st['vertical-align'];\r
+                       }\r
+\r
+                       // Handle border\r
+                       v = f.border.value;\r
+                       if (v || v == '0') {\r
+                               if (v == '0')\r
+                                       st['border'] = '0';\r
+                               else\r
+                                       st['border'] = v + 'px solid black';\r
+                       } else\r
+                               delete st['border'];\r
+\r
+                       // Handle hspace\r
+                       v = f.hspace.value;\r
+                       if (v) {\r
+                               delete st['margin'];\r
+                               st['margin-left'] = v + 'px';\r
+                               st['margin-right'] = v + 'px';\r
+                       } else {\r
+                               delete st['margin-left'];\r
+                               delete st['margin-right'];\r
+                       }\r
+\r
+                       // Handle vspace\r
+                       v = f.vspace.value;\r
+                       if (v) {\r
+                               delete st['margin'];\r
+                               st['margin-top'] = v + 'px';\r
+                               st['margin-bottom'] = v + 'px';\r
+                       } else {\r
+                               delete st['margin-top'];\r
+                               delete st['margin-bottom'];\r
+                       }\r
+\r
+                       // Merge\r
+                       st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st));\r
+                       this.styleVal = dom.serializeStyle(st);\r
+               }\r
+       },\r
+\r
+       getAttrib : function(e, at) {\r
+               var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;\r
+\r
+               if (ed.settings.inline_styles) {\r
+                       switch (at) {\r
+                               case 'align':\r
+                                       if (v = dom.getStyle(e, 'float'))\r
+                                               return v;\r
+\r
+                                       if (v = dom.getStyle(e, 'vertical-align'))\r
+                                               return v;\r
+\r
+                                       break;\r
+\r
+                               case 'hspace':\r
+                                       v = dom.getStyle(e, 'margin-left')\r
+                                       v2 = dom.getStyle(e, 'margin-right');\r
+                                       if (v && v == v2)\r
+                                               return parseInt(v.replace(/[^0-9]/g, ''));\r
+\r
+                                       break;\r
+\r
+                               case 'vspace':\r
+                                       v = dom.getStyle(e, 'margin-top')\r
+                                       v2 = dom.getStyle(e, 'margin-bottom');\r
+                                       if (v && v == v2)\r
+                                               return parseInt(v.replace(/[^0-9]/g, ''));\r
+\r
+                                       break;\r
+\r
+                               case 'border':\r
+                                       v = 0;\r
+\r
+                                       tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {\r
+                                               sv = dom.getStyle(e, 'border-' + sv + '-width');\r
+\r
+                                               // False or not the same as prev\r
+                                               if (!sv || (sv != v && v !== 0)) {\r
+                                                       v = 0;\r
+                                                       return false;\r
+                                               }\r
+\r
+                                               if (sv)\r
+                                                       v = sv;\r
+                                       });\r
+\r
+                                       if (v)\r
+                                               return parseInt(v.replace(/[^0-9]/g, ''));\r
+\r
+                                       break;\r
+                       }\r
+               }\r
+\r
+               if (v = dom.getAttrib(e, at))\r
+                       return v;\r
+\r
+               return '';\r
+       },\r
+\r
+       resetImageData : function() {\r
+               var f = document.forms[0];\r
+\r
+               f.width.value = f.height.value = "";    \r
+       },\r
+\r
+       updateImageData : function() {\r
+               var f = document.forms[0], t = ImageDialog;\r
+\r
+               if (f.width.value == "")\r
+                       f.width.value = t.preloadImg.width;\r
+\r
+               if (f.height.value == "")\r
+                       f.height.value = t.preloadImg.height;\r
+       },\r
+\r
+       getImageData : function() {\r
+               var f = document.forms[0];\r
+\r
+               this.preloadImg = new Image();\r
+               this.preloadImg.onload = this.updateImageData;\r
+               this.preloadImg.onerror = this.resetImageData;\r
+               this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value);\r
+       }\r
+};\r
+\r
+ImageDialog.preInit();\r
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);\r
diff --git a/program/js/tiny_mce/themes/advanced/js/link.js b/program/js/tiny_mce/themes/advanced/js/link.js
new file mode 100644 (file)
index 0000000..ab434da
--- /dev/null
@@ -0,0 +1,126 @@
+tinyMCEPopup.requireLangPack();\r
+\r
+var LinkDialog = {\r
+       preInit : function() {\r
+               var url;\r
+\r
+               if (url = tinyMCEPopup.getParam("external_link_list_url"))\r
+                       document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');\r
+       },\r
+\r
+       init : function() {\r
+               var f = document.forms[0], ed = tinyMCEPopup.editor;\r
+\r
+               // Setup browse button\r
+               document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link');\r
+               if (isVisible('hrefbrowser'))\r
+                       document.getElementById('href').style.width = '180px';\r
+\r
+               this.fillClassList('class_list');\r
+               this.fillFileList('link_list', 'tinyMCELinkList');\r
+               this.fillTargetList('target_list');\r
+\r
+               if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) {\r
+                       f.href.value = ed.dom.getAttrib(e, 'href');\r
+                       f.linktitle.value = ed.dom.getAttrib(e, 'title');\r
+                       f.insert.value = ed.getLang('update');\r
+                       selectByValue(f, 'link_list', f.href.value);\r
+                       selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target'));\r
+                       selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class'));\r
+               }\r
+       },\r
+\r
+       update : function() {\r
+               var f = document.forms[0], ed = tinyMCEPopup.editor, e, b;\r
+\r
+               tinyMCEPopup.restoreSelection();\r
+\r
+               // Remove element if there is no href\r
+               if (!f.href.value) {\r
+                       e = ed.dom.getParent(ed.selection.getNode(), 'A');\r
+                       if (e) {\r
+                               tinyMCEPopup.execCommand("mceBeginUndoLevel");\r
+                               b = ed.selection.getBookmark();\r
+                               ed.dom.remove(e, 1);\r
+                               ed.selection.moveToBookmark(b);\r
+                               tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+                               tinyMCEPopup.close();\r
+                               return;\r
+                       }\r
+               }\r
+\r
+               ed.execCommand('mceInsertLink', false, {\r
+                       href : f.href.value,\r
+                       title : f.linktitle.value,\r
+                       target : f.target_list ? f.target_list.options[f.target_list.selectedIndex].value : null,\r
+                       'class' : f.class_list ? f.class_list.options[f.class_list.selectedIndex].value : null\r
+               });\r
+\r
+               tinyMCEPopup.close();\r
+       },\r
+\r
+       checkPrefix : function(n) {\r
+               if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email')))\r
+                       n.value = 'mailto:' + n.value;\r
+\r
+               if (/^\s*www./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external')))\r
+                       n.value = 'http://' + n.value;\r
+       },\r
+\r
+       fillFileList : function(id, l) {\r
+               var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;\r
+\r
+               l = window[l];\r
+\r
+               if (l && l.length > 0) {\r
+                       lst.options[lst.options.length] = new Option('', '');\r
+\r
+                       tinymce.each(l, function(o) {\r
+                               lst.options[lst.options.length] = new Option(o[0], o[1]);\r
+                       });\r
+               } else\r
+                       dom.remove(dom.getParent(id, 'tr'));\r
+       },\r
+\r
+       fillClassList : function(id) {\r
+               var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;\r
+\r
+               if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {\r
+                       cl = [];\r
+\r
+                       tinymce.each(v.split(';'), function(v) {\r
+                               var p = v.split('=');\r
+\r
+                               cl.push({'title' : p[0], 'class' : p[1]});\r
+                       });\r
+               } else\r
+                       cl = tinyMCEPopup.editor.dom.getClasses();\r
+\r
+               if (cl.length > 0) {\r
+                       lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');\r
+\r
+                       tinymce.each(cl, function(o) {\r
+                               lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);\r
+                       });\r
+               } else\r
+                       dom.remove(dom.getParent(id, 'tr'));\r
+       },\r
+\r
+       fillTargetList : function(id) {\r
+               var dom = tinyMCEPopup.dom, lst = dom.get(id), v;\r
+\r
+               lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');\r
+               lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');\r
+               lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');\r
+\r
+               if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) {\r
+                       tinymce.each(v.split(','), function(v) {\r
+                               v = v.split('=');\r
+                               lst.options[lst.options.length] = new Option(v[0], v[1]);\r
+                       });\r
+               }\r
+       }\r
+};\r
+\r
+LinkDialog.preInit();\r
+tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog);\r
diff --git a/program/js/tiny_mce/themes/advanced/js/source_editor.js b/program/js/tiny_mce/themes/advanced/js/source_editor.js
new file mode 100644 (file)
index 0000000..af2231c
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCEPopup.requireLangPack();\r
+tinyMCEPopup.onInit.add(onLoadInit);\r
+\r
+function saveContent() {\r
+       tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinymce.isGecko)\r
+               document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck");\r
+\r
+       document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent();\r
+\r
+       if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) {\r
+               setWrap('soft');\r
+               document.getElementById('wraped').checked = true;\r
+       }\r
+\r
+       resizeInputs();\r
+}\r
+\r
+function setWrap(val) {\r
+       var v, n, s = document.getElementById('htmlSource');\r
+\r
+       s.wrap = val;\r
+\r
+       if (!tinymce.isIE) {\r
+               v = s.value;\r
+               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.isIE) {\r
+                wHeight = self.innerHeight - 65;\r
+                wWidth = self.innerWidth - 16;\r
+       } else {\r
+                wHeight = document.body.clientHeight - 70;\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/jscripts/about.js b/program/js/tiny_mce/themes/advanced/jscripts/about.js
deleted file mode 100644 (file)
index 4e53c28..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-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
deleted file mode 100644 (file)
index e7c1c62..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-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
deleted file mode 100644 (file)
index eaa6a94..0000000
+++ /dev/null
@@ -1,326 +0,0 @@
-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
deleted file mode 100644 (file)
index 00fc823..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-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
deleted file mode 100644 (file)
index a52bfad..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-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
deleted file mode 100644 (file)
index e195497..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-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
deleted file mode 100644 (file)
index d0d517d..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-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
index 8409e582b467eceb9857b3045ebdd9434b454c53..69694b1f9f8cd4ecfe36a64b7ccb80014458a5fa 100644 (file)
@@ -1,93 +1,62 @@
-// 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
+tinyMCE.addI18n('en.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Your custom description here",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/en_dlg.js b/program/js/tiny_mce/themes/advanced/langs/en_dlg.js
new file mode 100644 (file)
index 0000000..9d124d7
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('en.advanced_dlg',{\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
+link_list:"Link list"\r
+});
\ No newline at end of file
index b27af9b6c9b6f50e83eaf418330890027f4cbe7e..286cc92479c80f95a03ce04dc8589b21bb43655e 100644 (file)
@@ -1,18 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <title>{$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
+       <title>{#advanced_dlg.link_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script type="text/javascript" src="js/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
+<body id="link" style="display: none">\r
+<form onsubmit="LinkDialog.update();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
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.link_title}</a></span></li>\r
                </ul>\r
        </div>\r
 \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 nowrap="nowrap"><label for="href">{#advanced_dlg.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><input id="href" name="href" type="text" class="mceFocus" value="" style="width: 200px" onchange="LinkDialog.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><label for="link_list">{#advanced_dlg.link_list}</label></td>\r
+                       <td><select id="link_list" name="link_list" onchange="document.getElementById('href').value=this.options[this.selectedIndex].value;"></select></td>\r
+                 </tr>\r
+               <tr>\r
+                       <td><label id="targetlistlabel" for="targetlist">{#advanced_dlg.link_target}</label></td>\r
+                       <td><select id="target_list" name="target_list"></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
+            <td nowrap="nowrap"><label for="linktitle">{#advanced_dlg.link_titlefield}</label></td>\r
+            <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px" /></td>\r
           </tr>\r
+                       <tr>\r
+                               <td><label for="class_list">{#class_name}</label></td>\r
+                               <td><select id="class_list" name="class_list"></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
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
                </div>\r
 \r
                <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </div>\r
 </form>\r
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/content.css b/program/js/tiny_mce/themes/advanced/skins/default/content.css
new file mode 100644 (file)
index 0000000..4bbbfde
--- /dev/null
@@ -0,0 +1,25 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}\r
+body {background:#FFF;}\r
+body.mceForceColors {background:#FFF; color:#000;}\r
+h1 {font-size: 2em}\r
+h2 {font-size: 1.5em}\r
+h3 {font-size: 1.17em}\r
+h4 {font-size: 1em}\r
+h5 {font-size: .83em}\r
+h6 {font-size: .75em}\r
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}\r
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(img/items.gif) no-repeat bottom left;}\r
+img.mceItemAnchor {width:12px; height:12px; background:url(img/items.gif) no-repeat;}\r
+img {border:0;}\r
+\r
+/* IE */\r
+* html body {\r
+scrollbar-3dlight-color:#F0F0EE;\r
+scrollbar-arrow-color:#676662;\r
+scrollbar-base-color:#F0F0EE;\r
+scrollbar-darkshadow-color:#DDD;\r
+scrollbar-face-color:#E0E0DD;\r
+scrollbar-highlight-color:#F0F0EE;\r
+scrollbar-shadow-color:#F0F0EE;\r
+scrollbar-track-color:#F5F5F5;\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/dialog.css b/program/js/tiny_mce/themes/advanced/skins/default/dialog.css
new file mode 100644 (file)
index 0000000..c944a60
--- /dev/null
@@ -0,0 +1,114 @@
+/* Generic */\r
+body {\r
+font-family:Verdana, Arial, Helvetica, sans-serif; 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
+background:#F0F0EE;\r
+padding:0;\r
+margin:8px 8px 0 8px;\r
+}\r
+\r
+html {background:#F0F0EE;}\r
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}\r
+textarea {resize:none;outline:none;}\r
+a:link, a:visited {color:black;}\r
+a:hover {color:#2B6FB6;}\r
+\r
+/* Forms */\r
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}\r
+legend {color:#2B6FB6; font-weight:bold;}\r
+label.msg {display:none;}\r
+label.invalid {color:#EE0000; display:inline;}\r
+input.invalid {border:1px solid #EE0000;}\r
+input {background:#FFF; border:1px solid #CCC;}\r
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}\r
+input, select, textarea {border:1px solid #808080;}\r
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}\r
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}\r
+.input_noborder {border:0;}\r
+\r
+/* Buttons */\r
+#insert, #cancel, input.button, .updateButton {\r
+border:0; margin:0; padding:0;\r
+font-weight:bold;\r
+width:94px; height:26px;\r
+background:url(img/buttons.png) 0 -26px;\r
+cursor:pointer;\r
+padding-bottom:2px;\r
+}\r
+\r
+#insert {background:url(img/buttons.png) 0 -52px;}\r
+#cancel {background:url(img/buttons.png) 0 0;}\r
+\r
+/* Browse */\r
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}\r
+.mceOldBoxModel a.browse span {width:22px; height:20px;}\r
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}\r
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}\r
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}\r
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}\r
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}\r
+a.pickcolor:hover span {background-color:#B2BBD0;}\r
+a.pickcolor:hover span.disabled {}\r
+\r
+/* Charmap */\r
+table.charmap {border:1px solid #AAA; text-align:center}\r
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}\r
+#charmap a {display:block; color:#000; text-decoration:none; border:0}\r
+#charmap a:hover {background:#CCC;color:#2B6FB6}\r
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}\r
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}\r
+\r
+/* Source */\r
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}\r
+.mceActionPanel {margin-top:5px;}\r
+\r
+/* Tabs classes */\r
+.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;}\r
+.tabs ul {margin:0; padding:0; list-style:none;}\r
+.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}\r
+.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}\r
+.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}\r
+.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;}\r
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}\r
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}\r
+\r
+/* Panels */\r
+.panel_wrapper div.panel {display:none;}\r
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}\r
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}\r
+\r
+/* Columns */\r
+.column {float:left;}\r
+.properties {width:100%;}\r
+.properties .column1 {}\r
+.properties .column2 {text-align:left;}\r
+\r
+/* Titles */\r
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}\r
+h3 {font-size:14px;}\r
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}\r
+\r
+/* Dialog specific */\r
+#link .panel_wrapper, #link div.current {height:125px;}\r
+#image .panel_wrapper, #image div.current {height:200px;}\r
+#plugintable thead {font-weight:bold; background:#DDD;}\r
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}\r
+#plugintable {width:96%; margin-top:10px;}\r
+#pluginscontainer {height:290px; overflow:auto;}\r
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}\r
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}\r
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}\r
+#colorpicker #light div {overflow:hidden;}\r
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}\r
+#colorpicker .panel_wrapper div.current {height:175px;}\r
+#colorpicker #namedcolors {width:150px;}\r
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}\r
+#colorpicker #colornamecontainer {margin-top:5px;}\r
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/img/buttons.png b/program/js/tiny_mce/themes/advanced/skins/default/img/buttons.png
new file mode 100644 (file)
index 0000000..7dd5841
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/default/img/buttons.png differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/img/items.gif b/program/js/tiny_mce/themes/advanced/skins/default/img/items.gif
new file mode 100644 (file)
index 0000000..2eafd79
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/default/img/items.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif b/program/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif
new file mode 100644 (file)
index 0000000..85e31df
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/program/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif
new file mode 100644 (file)
index 0000000..adfdddc
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/img/progress.gif b/program/js/tiny_mce/themes/advanced/skins/default/img/progress.gif
new file mode 100644 (file)
index 0000000..5bb90fd
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/default/img/progress.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif b/program/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif
new file mode 100644 (file)
index 0000000..ce4be63
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/default/ui.css b/program/js/tiny_mce/themes/advanced/skins/default/ui.css
new file mode 100644 (file)
index 0000000..953a7fb
--- /dev/null
@@ -0,0 +1,211 @@
+/* Reset */\r
+.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}\r
+.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}\r
+.defaultSkin table td {vertical-align:middle}\r
+\r
+/* Containers */\r
+.defaultSkin table {background:#F0F0EE}\r
+.defaultSkin iframe {display:block; background:#FFF}\r
+.defaultSkin .mceToolbar {height:26px}\r
+.defaultSkin .mceLeft {text-align:left}\r
+.defaultSkin .mceRight {text-align:right}\r
+\r
+/* External */\r
+.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;}\r
+.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}\r
+.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}\r
+\r
+/* Layout */\r
+.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC}\r
+.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC}\r
+.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC}\r
+.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;}\r
+.defaultSkin td.mceToolbar {padding-top:1px; vertical-align:top}\r
+.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC}\r
+.defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px}\r
+.defaultSkin .mceStatusbar div {float:left; margin:2px}\r
+.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}\r
+.defaultSkin .mceStatusbar a:hover {text-decoration:underline}\r
+.defaultSkin table.mceToolbar {margin-left:3px}\r
+.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px}\r
+.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}\r
+.defaultSkin td.mceCenter {text-align:center;}\r
+.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;}\r
+.defaultSkin td.mceRight table {margin:0 0 0 auto;}\r
+\r
+/* Button */\r
+.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px;}\r
+.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}\r
+.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0}\r
+.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30)}\r
+\r
+/* Separator */\r
+.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px}\r
+\r
+/* ListBox */\r
+.defaultSkin .mceListBox {direction:ltr}\r
+.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block}\r
+.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}\r
+.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;}\r
+.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF}\r
+.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0}\r
+.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;}\r
+.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden}\r
+.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px}\r
+.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;}\r
+.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;}\r
+\r
+/* SplitButton */\r
+.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr}\r
+.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block}\r
+.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;}\r
+.defaultSkin .mceSplitButton span.mceAction {width:20px; background:url(../../img/icons.gif) 20px 20px;}\r
+.defaultSkin .mceSplitButton a.mceOpen {width:9px; border:1px solid #F0F0EE;}\r
+.defaultSkin .mceSplitButton span.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0;}\r
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0}\r
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {border:1px solid #0A246A;}\r
+.defaultSkin table.mceSplitButtonEnabled:hover span.mceOpen, .defaultSkin .mceSplitButtonHover span.mceOpen, .defaultSkin .mceSplitButtonSelected span.mceOpen {background-color:#B2BBD0}\r
+.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled span.mceOpen {opacity:0.3; filter:alpha(opacity=30)}\r
+.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0}\r
+.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;}\r
+\r
+/* ColorSplitButton */\r
+.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}\r
+.defaultSkin .mceColorSplitMenu td {padding:2px}\r
+.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}\r
+.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}\r
+.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}\r
+.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}\r
+.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A}\r
+.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a}\r
+.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px}\r
+\r
+/* Menu */\r
+.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8}\r
+.defaultSkin .mceNoIcons span.mceIcon {width:0;}\r
+.defaultSkin .mceNoIcons a .mceText {padding-left:10px}\r
+.defaultSkin .mceMenu table {background:#FFF}\r
+.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block}\r
+.defaultSkin .mceMenu td {height:20px}\r
+.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0}\r
+.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}\r
+.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px}\r
+.defaultSkin .mceMenu pre.mceText {font-family:Monospace}\r
+.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}\r
+.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3}\r
+.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px}\r
+.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD}\r
+.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}\r
+.defaultSkin .mceMenuItemDisabled .mceText {color:#888}\r
+.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)}\r
+.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center}\r
+.defaultSkin .mceMenu span.mceMenuLine {display:none}\r
+.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;}\r
+\r
+/* Progress,Resize */\r
+.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}\r
+.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}\r
+.defaultSkin .mcePlaceHolder {border:1px dotted gray}\r
+\r
+/* Formats */\r
+.defaultSkin .mce_formatPreview a {font-size:10px}\r
+.defaultSkin .mce_p span.mceText {}\r
+.defaultSkin .mce_address span.mceText {font-style:italic}\r
+.defaultSkin .mce_pre span.mceText {font-family:monospace}\r
+.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}\r
+.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}\r
+.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}\r
+.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}\r
+.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}\r
+.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}\r
+\r
+/* Theme */\r
+.defaultSkin span.mce_bold {background-position:0 0}\r
+.defaultSkin span.mce_italic {background-position:-60px 0}\r
+.defaultSkin span.mce_underline {background-position:-140px 0}\r
+.defaultSkin span.mce_strikethrough {background-position:-120px 0}\r
+.defaultSkin span.mce_undo {background-position:-160px 0}\r
+.defaultSkin span.mce_redo {background-position:-100px 0}\r
+.defaultSkin span.mce_cleanup {background-position:-40px 0}\r
+.defaultSkin span.mce_bullist {background-position:-20px 0}\r
+.defaultSkin span.mce_numlist {background-position:-80px 0}\r
+.defaultSkin span.mce_justifyleft {background-position:-460px 0}\r
+.defaultSkin span.mce_justifyright {background-position:-480px 0}\r
+.defaultSkin span.mce_justifycenter {background-position:-420px 0}\r
+.defaultSkin span.mce_justifyfull {background-position:-440px 0}\r
+.defaultSkin span.mce_anchor {background-position:-200px 0}\r
+.defaultSkin span.mce_indent {background-position:-400px 0}\r
+.defaultSkin span.mce_outdent {background-position:-540px 0}\r
+.defaultSkin span.mce_link {background-position:-500px 0}\r
+.defaultSkin span.mce_unlink {background-position:-640px 0}\r
+.defaultSkin span.mce_sub {background-position:-600px 0}\r
+.defaultSkin span.mce_sup {background-position:-620px 0}\r
+.defaultSkin span.mce_removeformat {background-position:-580px 0}\r
+.defaultSkin span.mce_newdocument {background-position:-520px 0}\r
+.defaultSkin span.mce_image {background-position:-380px 0}\r
+.defaultSkin span.mce_help {background-position:-340px 0}\r
+.defaultSkin span.mce_code {background-position:-260px 0}\r
+.defaultSkin span.mce_hr {background-position:-360px 0}\r
+.defaultSkin span.mce_visualaid {background-position:-660px 0}\r
+.defaultSkin span.mce_charmap {background-position:-240px 0}\r
+.defaultSkin span.mce_paste {background-position:-560px 0}\r
+.defaultSkin span.mce_copy {background-position:-700px 0}\r
+.defaultSkin span.mce_cut {background-position:-680px 0}\r
+.defaultSkin span.mce_blockquote {background-position:-220px 0}\r
+.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0}\r
+.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0}\r
+.defaultSkin .mce_forecolorpicker {background-position:-720px 0}\r
+.defaultSkin .mce_backcolorpicker {background-position:-760px 0}\r
+\r
+/* Plugins */\r
+.defaultSkin span.mce_advhr {background-position:-0px -20px}\r
+.defaultSkin span.mce_ltr {background-position:-20px -20px}\r
+.defaultSkin span.mce_rtl {background-position:-40px -20px}\r
+.defaultSkin span.mce_emotions {background-position:-60px -20px}\r
+.defaultSkin span.mce_fullpage {background-position:-80px -20px}\r
+.defaultSkin span.mce_fullscreen {background-position:-100px -20px}\r
+.defaultSkin span.mce_iespell {background-position:-120px -20px}\r
+.defaultSkin span.mce_insertdate {background-position:-140px -20px}\r
+.defaultSkin span.mce_inserttime {background-position:-160px -20px}\r
+.defaultSkin span.mce_absolute {background-position:-180px -20px}\r
+.defaultSkin span.mce_backward {background-position:-200px -20px}\r
+.defaultSkin span.mce_forward {background-position:-220px -20px}\r
+.defaultSkin span.mce_insert_layer {background-position:-240px -20px}\r
+.defaultSkin span.mce_insertlayer {background-position:-260px -20px}\r
+.defaultSkin span.mce_movebackward {background-position:-280px -20px}\r
+.defaultSkin span.mce_moveforward {background-position:-300px -20px}\r
+.defaultSkin span.mce_media {background-position:-320px -20px}\r
+.defaultSkin span.mce_nonbreaking {background-position:-340px -20px}\r
+.defaultSkin span.mce_pastetext {background-position:-360px -20px}\r
+.defaultSkin span.mce_pasteword {background-position:-380px -20px}\r
+.defaultSkin span.mce_selectall {background-position:-400px -20px}\r
+.defaultSkin span.mce_preview {background-position:-420px -20px}\r
+.defaultSkin span.mce_print {background-position:-440px -20px}\r
+.defaultSkin span.mce_cancel {background-position:-460px -20px}\r
+.defaultSkin span.mce_save {background-position:-480px -20px}\r
+.defaultSkin span.mce_replace {background-position:-500px -20px}\r
+.defaultSkin span.mce_search {background-position:-520px -20px}\r
+.defaultSkin span.mce_styleprops {background-position:-560px -20px}\r
+.defaultSkin span.mce_table {background-position:-580px -20px}\r
+.defaultSkin span.mce_cell_props {background-position:-600px -20px}\r
+.defaultSkin span.mce_delete_table {background-position:-620px -20px}\r
+.defaultSkin span.mce_delete_col {background-position:-640px -20px}\r
+.defaultSkin span.mce_delete_row {background-position:-660px -20px}\r
+.defaultSkin span.mce_col_after {background-position:-680px -20px}\r
+.defaultSkin span.mce_col_before {background-position:-700px -20px}\r
+.defaultSkin span.mce_row_after {background-position:-720px -20px}\r
+.defaultSkin span.mce_row_before {background-position:-740px -20px}\r
+.defaultSkin span.mce_merge_cells {background-position:-760px -20px}\r
+.defaultSkin span.mce_table_props {background-position:-980px -20px}\r
+.defaultSkin span.mce_row_props {background-position:-780px -20px}\r
+.defaultSkin span.mce_split_cells {background-position:-800px -20px}\r
+.defaultSkin span.mce_template {background-position:-820px -20px}\r
+.defaultSkin span.mce_visualchars {background-position:-840px -20px}\r
+.defaultSkin span.mce_abbr {background-position:-860px -20px}\r
+.defaultSkin span.mce_acronym {background-position:-880px -20px}\r
+.defaultSkin span.mce_attribs {background-position:-900px -20px}\r
+.defaultSkin span.mce_cite {background-position:-920px -20px}\r
+.defaultSkin span.mce_del {background-position:-940px -20px}\r
+.defaultSkin span.mce_ins {background-position:-960px -20px}\r
+.defaultSkin span.mce_pagebreak {background-position:0 -40px}\r
+.defaultSkin .mce_spellchecker span.mceAction {background-position:-540px -20px}\r
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/content.css b/program/js/tiny_mce/themes/advanced/skins/o2k7/content.css
new file mode 100644 (file)
index 0000000..296dd69
--- /dev/null
@@ -0,0 +1,25 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}\r
+body {background:#FFF;}\r
+body.mceForceColors {background:#FFF; color:#000;}\r
+h1 {font-size: 2em}\r
+h2 {font-size: 1.5em}\r
+h3 {font-size: 1.17em}\r
+h4 {font-size: 1em}\r
+h5 {font-size: .83em}\r
+h6 {font-size: .75em}\r
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}\r
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(../default/img/items.gif) no-repeat bottom left;}\r
+img.mceItemAnchor {width:12px; height:12px; background:url(../default/img/items.gif) no-repeat;}\r
+img {border:0;}\r
+\r
+/* IE */\r
+* html body {\r
+scrollbar-3dlight-color:#F0F0EE;\r
+scrollbar-arrow-color:#676662;\r
+scrollbar-base-color:#F0F0EE;\r
+scrollbar-darkshadow-color:#DDD;\r
+scrollbar-face-color:#E0E0DD;\r
+scrollbar-highlight-color:#F0F0EE;\r
+scrollbar-shadow-color:#F0F0EE;\r
+scrollbar-track-color:#F5F5F5;\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/program/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css
new file mode 100644 (file)
index 0000000..e36042e
--- /dev/null
@@ -0,0 +1,113 @@
+/* Generic */\r
+body {\r
+font-family:Verdana, Arial, Helvetica, sans-serif; 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
+background:#F0F0EE;\r
+padding:0;\r
+margin:8px 8px 0 8px;\r
+}\r
+\r
+html {background:#F0F0EE;}\r
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}\r
+textarea {resize:none;outline:none;}\r
+a:link, a:visited {color:black;}\r
+a:hover {color:#2B6FB6;}\r
+\r
+/* Forms */\r
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}\r
+legend {color:#2B6FB6; font-weight:bold;}\r
+label.msg {display:none;}\r
+label.invalid {color:#EE0000; display:inline;}\r
+input.invalid {border:1px solid #EE0000;}\r
+input {background:#FFF; border:1px solid #CCC;}\r
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}\r
+input, select, textarea {border:1px solid #808080;}\r
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}\r
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}\r
+.input_noborder {border:0;}\r
+\r
+/* Buttons */\r
+#insert, #cancel, input.button, .updateButton {\r
+border:0; margin:0; padding:0;\r
+font-weight:bold;\r
+width:94px; height:26px;\r
+background:url(../default/img/buttons.png) 0 -26px;\r
+cursor:pointer;\r
+padding-bottom:2px;\r
+}\r
+\r
+#insert {background:url(../default/img/buttons.png) 0 -52px;}\r
+#cancel {background:url(../default/img/buttons.png) 0 0;}\r
+\r
+/* Browse */\r
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}\r
+.mceOldBoxModel a.browse span {width:22px; height:20px;}\r
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}\r
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}\r
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}\r
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}\r
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}\r
+a.pickcolor:hover span {background-color:#B2BBD0;}\r
+a.pickcolor:hover span.disabled {}\r
+\r
+/* Charmap */\r
+table.charmap {border:1px solid #AAA; text-align:center}\r
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}\r
+#charmap a {display:block; color:#000; text-decoration:none; border:0}\r
+#charmap a:hover {background:#CCC;color:#2B6FB6}\r
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}\r
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}\r
+\r
+/* Source */\r
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}\r
+.mceActionPanel {margin-top:5px;}\r
+\r
+/* Tabs classes */\r
+.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;}\r
+.tabs ul {margin:0; padding:0; list-style:none;}\r
+.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}\r
+.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}\r
+.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}\r
+.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;}\r
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}\r
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}\r
+\r
+/* Panels */\r
+.panel_wrapper div.panel {display:none;}\r
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}\r
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}\r
+\r
+/* Columns */\r
+.column {float:left;}\r
+.properties {width:100%;}\r
+.properties .column1 {}\r
+.properties .column2 {text-align:left;}\r
+\r
+/* Titles */\r
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}\r
+h3 {font-size:14px;}\r
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}\r
+\r
+/* Dialog specific */\r
+#link .panel_wrapper, #link div.current {height:125px;}\r
+#image .panel_wrapper, #image div.current {height:200px;}\r
+#plugintable thead {font-weight:bold; background:#DDD;}\r
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}\r
+#plugintable {width:96%; margin-top:10px;}\r
+#pluginscontainer {height:290px; overflow:auto;}\r
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}\r
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}\r
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}\r
+#colorpicker #light div {overflow:hidden;}\r
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}\r
+#colorpicker .panel_wrapper div.current {height:175px;}\r
+#colorpicker #namedcolors {width:150px;}\r
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}\r
+#colorpicker #colornamecontainer {margin-top:5px;}\r
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png
new file mode 100644 (file)
index 0000000..12cfb41
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png
new file mode 100644 (file)
index 0000000..8996c74
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png
new file mode 100644 (file)
index 0000000..bd5d255
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png differ
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/ui.css b/program/js/tiny_mce/themes/advanced/skins/o2k7/ui.css
new file mode 100644 (file)
index 0000000..f5d450b
--- /dev/null
@@ -0,0 +1,211 @@
+/* Reset */\r
+.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}\r
+.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}\r
+.o2k7Skin table td {vertical-align:middle}\r
+\r
+/* Containers */\r
+.o2k7Skin table {background:#E5EFFD}\r
+.o2k7Skin iframe {display:block; background:#FFF}\r
+.o2k7Skin .mceToolbar {height:26px}\r
+\r
+/* External */\r
+.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none}\r
+.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;}\r
+.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}\r
+\r
+/* Layout */\r
+.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD}\r
+.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD}\r
+.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD}\r
+.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0}\r
+.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD}\r
+.o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px}\r
+.o2k7Skin .mceStatusbar div {float:left; padding:2px}\r
+.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}\r
+.o2k7Skin .mceStatusbar a:hover {text-decoration:underline}\r
+.o2k7Skin table.mceToolbar {margin-left:3px}\r
+.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;}\r
+.o2k7Skin .mceToolbar td.mceFirst span {margin:0}\r
+.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}\r
+.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none}\r
+.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px}\r
+.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}\r
+.o2k7Skin td.mceCenter {text-align:center;}\r
+.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;}\r
+.o2k7Skin td.mceRight table {margin:0 0 0 auto;}\r
+\r
+/* Button */\r
+.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}\r
+.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px}\r
+.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px}\r
+.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}\r
+.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px}\r
+.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30)}\r
+\r
+/* Separator */\r
+.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}\r
+\r
+/* ListBox */\r
+.o2k7Skin .mceListBox {margin-left:3px}\r
+.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block}\r
+.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}\r
+.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0}\r
+.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF}\r
+.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px}\r
+.o2k7Skin .mceListBoxDisabled .mceText {color:gray}\r
+.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden}\r
+.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px}\r
+.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;}\r
+\r
+/* SplitButton */\r
+.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px}\r
+.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)}\r
+.o2k7Skin .mceSplitButton a.mceAction {width:22px}\r
+.o2k7Skin .mceSplitButton span.mceAction {width:22px; background:url(../../img/icons.gif) 20px 20px}\r
+.o2k7Skin .mceSplitButton a.mceOpen {width:10px}\r
+.o2k7Skin .mceSplitButton span.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0}\r
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px}\r
+.o2k7Skin table.mceSplitButtonEnabled:hover span.mceOpen, .o2k7Skin .mceSplitButtonHover span.mceOpen, .o2k7Skin .mceSplitButtonSelected span.mceOpen {background-position:-44px -44px}\r
+.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; filter:alpha(opacity=30)}\r
+.o2k7Skin .mceSplitButtonActive {background-position:0 -44px}\r
+\r
+/* ColorSplitButton */\r
+.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}\r
+.o2k7Skin .mceColorSplitMenu td {padding:2px}\r
+.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}\r
+.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}\r
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}\r
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}\r
+.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A}\r
+.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a}\r
+.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px}\r
+\r
+/* Menu */\r
+.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD}\r
+.o2k7Skin .mceNoIcons span.mceIcon {width:0;}\r
+.o2k7Skin .mceNoIcons a .mceText {padding-left:10px}\r
+.o2k7Skin .mceMenu table {background:#FFF}\r
+.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block}\r
+.o2k7Skin .mceMenu td {height:20px}\r
+.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0}\r
+.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}\r
+.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px}\r
+.o2k7Skin .mceMenu pre.mceText {font-family:Monospace}\r
+.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}\r
+.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3}\r
+.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px}\r
+.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD}\r
+.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}\r
+.o2k7Skin .mceMenuItemDisabled .mceText {color:#888}\r
+.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)}\r
+.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center}\r
+.o2k7Skin .mceMenu span.mceMenuLine {display:none}\r
+.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;}\r
+\r
+/* Progress,Resize */\r
+.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}\r
+.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}\r
+.o2k7Skin .mcePlaceHolder {border:1px dotted gray}\r
+\r
+/* Formats */\r
+.o2k7Skin .mce_formatPreview a {font-size:10px}\r
+.o2k7Skin .mce_p span.mceText {}\r
+.o2k7Skin .mce_address span.mceText {font-style:italic}\r
+.o2k7Skin .mce_pre span.mceText {font-family:monospace}\r
+.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}\r
+.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}\r
+.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}\r
+.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}\r
+.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}\r
+.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}\r
+\r
+/* Theme */\r
+.o2k7Skin span.mce_bold {background-position:0 0}\r
+.o2k7Skin span.mce_italic {background-position:-60px 0}\r
+.o2k7Skin span.mce_underline {background-position:-140px 0}\r
+.o2k7Skin span.mce_strikethrough {background-position:-120px 0}\r
+.o2k7Skin span.mce_undo {background-position:-160px 0}\r
+.o2k7Skin span.mce_redo {background-position:-100px 0}\r
+.o2k7Skin span.mce_cleanup {background-position:-40px 0}\r
+.o2k7Skin span.mce_bullist {background-position:-20px 0}\r
+.o2k7Skin span.mce_numlist {background-position:-80px 0}\r
+.o2k7Skin span.mce_justifyleft {background-position:-460px 0}\r
+.o2k7Skin span.mce_justifyright {background-position:-480px 0}\r
+.o2k7Skin span.mce_justifycenter {background-position:-420px 0}\r
+.o2k7Skin span.mce_justifyfull {background-position:-440px 0}\r
+.o2k7Skin span.mce_anchor {background-position:-200px 0}\r
+.o2k7Skin span.mce_indent {background-position:-400px 0}\r
+.o2k7Skin span.mce_outdent {background-position:-540px 0}\r
+.o2k7Skin span.mce_link {background-position:-500px 0}\r
+.o2k7Skin span.mce_unlink {background-position:-640px 0}\r
+.o2k7Skin span.mce_sub {background-position:-600px 0}\r
+.o2k7Skin span.mce_sup {background-position:-620px 0}\r
+.o2k7Skin span.mce_removeformat {background-position:-580px 0}\r
+.o2k7Skin span.mce_newdocument {background-position:-520px 0}\r
+.o2k7Skin span.mce_image {background-position:-380px 0}\r
+.o2k7Skin span.mce_help {background-position:-340px 0}\r
+.o2k7Skin span.mce_code {background-position:-260px 0}\r
+.o2k7Skin span.mce_hr {background-position:-360px 0}\r
+.o2k7Skin span.mce_visualaid {background-position:-660px 0}\r
+.o2k7Skin span.mce_charmap {background-position:-240px 0}\r
+.o2k7Skin span.mce_paste {background-position:-560px 0}\r
+.o2k7Skin span.mce_copy {background-position:-700px 0}\r
+.o2k7Skin span.mce_cut {background-position:-680px 0}\r
+.o2k7Skin span.mce_blockquote {background-position:-220px 0}\r
+.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0}\r
+.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0}\r
+.o2k7Skin .mce_forecolorpicker {background-position:-720px 0}\r
+.o2k7Skin .mce_backcolorpicker {background-position:-760px 0}\r
+\r
+/* Plugins */\r
+.o2k7Skin span.mce_advhr {background-position:-0px -20px}\r
+.o2k7Skin span.mce_ltr {background-position:-20px -20px}\r
+.o2k7Skin span.mce_rtl {background-position:-40px -20px}\r
+.o2k7Skin span.mce_emotions {background-position:-60px -20px}\r
+.o2k7Skin span.mce_fullpage {background-position:-80px -20px}\r
+.o2k7Skin span.mce_fullscreen {background-position:-100px -20px}\r
+.o2k7Skin span.mce_iespell {background-position:-120px -20px}\r
+.o2k7Skin span.mce_insertdate {background-position:-140px -20px}\r
+.o2k7Skin span.mce_inserttime {background-position:-160px -20px}\r
+.o2k7Skin span.mce_absolute {background-position:-180px -20px}\r
+.o2k7Skin span.mce_backward {background-position:-200px -20px}\r
+.o2k7Skin span.mce_forward {background-position:-220px -20px}\r
+.o2k7Skin span.mce_insert_layer {background-position:-240px -20px}\r
+.o2k7Skin span.mce_insertlayer {background-position:-260px -20px}\r
+.o2k7Skin span.mce_movebackward {background-position:-280px -20px}\r
+.o2k7Skin span.mce_moveforward {background-position:-300px -20px}\r
+.o2k7Skin span.mce_media {background-position:-320px -20px}\r
+.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px}\r
+.o2k7Skin span.mce_pastetext {background-position:-360px -20px}\r
+.o2k7Skin span.mce_pasteword {background-position:-380px -20px}\r
+.o2k7Skin span.mce_selectall {background-position:-400px -20px}\r
+.o2k7Skin span.mce_preview {background-position:-420px -20px}\r
+.o2k7Skin span.mce_print {background-position:-440px -20px}\r
+.o2k7Skin span.mce_cancel {background-position:-460px -20px}\r
+.o2k7Skin span.mce_save {background-position:-480px -20px}\r
+.o2k7Skin span.mce_replace {background-position:-500px -20px}\r
+.o2k7Skin span.mce_search {background-position:-520px -20px}\r
+.o2k7Skin span.mce_styleprops {background-position:-560px -20px}\r
+.o2k7Skin span.mce_table {background-position:-580px -20px}\r
+.o2k7Skin span.mce_cell_props {background-position:-600px -20px}\r
+.o2k7Skin span.mce_delete_table {background-position:-620px -20px}\r
+.o2k7Skin span.mce_delete_col {background-position:-640px -20px}\r
+.o2k7Skin span.mce_delete_row {background-position:-660px -20px}\r
+.o2k7Skin span.mce_col_after {background-position:-680px -20px}\r
+.o2k7Skin span.mce_col_before {background-position:-700px -20px}\r
+.o2k7Skin span.mce_row_after {background-position:-720px -20px}\r
+.o2k7Skin span.mce_row_before {background-position:-740px -20px}\r
+.o2k7Skin span.mce_merge_cells {background-position:-760px -20px}\r
+.o2k7Skin span.mce_table_props {background-position:-980px -20px}\r
+.o2k7Skin span.mce_row_props {background-position:-780px -20px}\r
+.o2k7Skin span.mce_split_cells {background-position:-800px -20px}\r
+.o2k7Skin span.mce_template {background-position:-820px -20px}\r
+.o2k7Skin span.mce_visualchars {background-position:-840px -20px}\r
+.o2k7Skin span.mce_abbr {background-position:-860px -20px}\r
+.o2k7Skin span.mce_acronym {background-position:-880px -20px}\r
+.o2k7Skin span.mce_attribs {background-position:-900px -20px}\r
+.o2k7Skin span.mce_cite {background-position:-920px -20px}\r
+.o2k7Skin span.mce_del {background-position:-940px -20px}\r
+.o2k7Skin span.mce_ins {background-position:-960px -20px}\r
+.o2k7Skin span.mce_pagebreak {background-position:0 -40px}\r
+.o2k7Skin .mce_spellchecker span.mceAction {background-position:-540px -20px}\r
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/program/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css
new file mode 100644 (file)
index 0000000..a42a727
--- /dev/null
@@ -0,0 +1,8 @@
+/* Black */\r
+.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton span.mceOpen, .o2k7SkinBlack .mceListBox .mceOpen {background-image:url(img/button_bg_black.png)}\r
+.o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF}\r
+.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0}\r
+.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0}\r
+.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;}\r
+.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)}\r
+.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#FFE7A1}
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/program/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css
new file mode 100644 (file)
index 0000000..548b1b8
--- /dev/null
@@ -0,0 +1,5 @@
+/* Silver */\r
+.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton span.mceOpen, .o2k7SkinSilver .mceListBox .mceOpen {background-image:url(img/button_bg_silver.png)}\r
+.o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee}\r
+.o2k7SkinSilver .mceListBox .mceText {background:#FFF}\r
+.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb}\r
index c3f80c4f780e411c7efcd2268a0a1953a2d3b3f3..119a913c93062ebc345b9caed7843a3c0538326f 100644 (file)
@@ -1,30 +1,30 @@
 <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
+       <title>{#advanced_dlg.code_title}</title>\r
+       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script type="text/javascript" src="js/source_editor.js"></script>\r
        <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
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">\r
+       <form name="source" onsubmit="saveContent();return false;" action="#">\r
+               <div style="float: left" class="title">{#advanced_dlg.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
+                       <input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{#advanced_dlg.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
+               <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea>\r
 \r
                <div class="mceActionPanel">\r
                        <div style="float: left">\r
-                               <input type="button" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />\r
+                               <input type="submit" name="insert" value="{#update}" id="insert" />\r
                        </div>\r
 \r
                        <div style="float: right">\r
-                               <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+                               <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
                        </div>\r
                </div>\r
        </form>\r
diff --git a/program/js/tiny_mce/themes/simple/editor_template.js b/program/js/tiny_mce/themes/simple/editor_template.js
new file mode 100644 (file)
index 0000000..3a25c04
--- /dev/null
@@ -0,0 +1 @@
+(function(){var DOM=tinymce.DOM;tinymce.ThemeManager.requireLangPack('simple');tinymce.create('tinymce.themes.SimpleTheme',{init:function(ed,url){var t=this,states=['Bold','Italic','Underline','Strikethrough','InsertUnorderedList','InsertOrderedList'],s=ed.settings;t.editor=ed;ed.onInit.add(function(){ed.onNodeChange.add(function(ed,cm){tinymce.each(states,function(c){cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c));});});ed.dom.loadCSS(url+"/skins/"+s.skin+"/content.css");});DOM.loadCSS((s.editor_css?ed.baseURI.toAbsolute(s.editor_css):'')||url+"/skins/"+s.skin+"/ui.css");},renderUI:function(o){var t=this,n=o.targetNode,ic,tb,ed=t.editor,cf=ed.controlManager,sc;n=DOM.insertAfter(DOM.create('span',{id:ed.id+'_container','class':'mceEditor '+ed.settings.skin+'SimpleSkin'}),n);n=sc=DOM.add(n,'table',{cellPadding:0,cellSpacing:0,'class':'mceLayout'});n=tb=DOM.add(n,'tbody');n=DOM.add(tb,'tr');n=ic=DOM.add(DOM.add(n,'td'),'div',{'class':'mceIframeContainer'});n=DOM.add(DOM.add(tb,'tr',{'class':'last'}),'td',{'class':'mceToolbar mceLast',align:'center'});tb=t.toolbar=cf.createToolbar("tools1");tb.add(cf.createButton('bold',{title:'simple.bold_desc',cmd:'Bold'}));tb.add(cf.createButton('italic',{title:'simple.italic_desc',cmd:'Italic'}));tb.add(cf.createButton('underline',{title:'simple.underline_desc',cmd:'Underline'}));tb.add(cf.createButton('strikethrough',{title:'simple.striketrough_desc',cmd:'Strikethrough'}));tb.add(cf.createSeparator());tb.add(cf.createButton('undo',{title:'simple.undo_desc',cmd:'Undo'}));tb.add(cf.createButton('redo',{title:'simple.redo_desc',cmd:'Redo'}));tb.add(cf.createSeparator());tb.add(cf.createButton('cleanup',{title:'simple.cleanup_desc',cmd:'mceCleanup'}));tb.add(cf.createSeparator());tb.add(cf.createButton('insertunorderedlist',{title:'simple.bullist_desc',cmd:'InsertUnorderedList'}));tb.add(cf.createButton('insertorderedlist',{title:'simple.numlist_desc',cmd:'InsertOrderedList'}));tb.renderTo(n);return{iframeContainer:ic,editorContainer:ed.id+'_container',sizeContainer:sc,deltaHeight:-20};},getInfo:function(){return{longname:'Simple theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add('simple',tinymce.themes.SimpleTheme);})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/simple/editor_template_src.js b/program/js/tiny_mce/themes/simple/editor_template_src.js
new file mode 100644 (file)
index 0000000..adc4492
--- /dev/null
@@ -0,0 +1,85 @@
+/**\r
+ * $Id: editor_template_src.js 752 2008-03-27 21:51:25Z spocke $\r
+ *\r
+ * This file is meant to showcase how to create a simple theme. The advanced\r
+ * theme is more suitable for production use.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM;\r
+\r
+       // Tell it to load theme specific language pack(s)\r
+       tinymce.ThemeManager.requireLangPack('simple');\r
+\r
+       tinymce.create('tinymce.themes.SimpleTheme', {\r
+               init : function(ed, url) {\r
+                       var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings;\r
+\r
+                       t.editor = ed;\r
+\r
+                       ed.onInit.add(function() {\r
+                               ed.onNodeChange.add(function(ed, cm) {\r
+                                       tinymce.each(states, function(c) {\r
+                                               cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c));\r
+                                       });\r
+                               });\r
+\r
+                               ed.dom.loadCSS(url + "/skins/" + s.skin + "/content.css");\r
+                       });\r
+\r
+                       DOM.loadCSS((s.editor_css ? ed.baseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css");\r
+               },\r
+\r
+               renderUI : function(o) {\r
+                       var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc;\r
+\r
+                       n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n);\r
+                       n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'});\r
+                       n = tb = DOM.add(n, 'tbody');\r
+\r
+                       // Create iframe container\r
+                       n = DOM.add(tb, 'tr');\r
+                       n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'});\r
+\r
+                       // Create toolbar container\r
+                       n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'});\r
+\r
+                       // Create toolbar\r
+                       tb = t.toolbar = cf.createToolbar("tools1");\r
+                       tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'}));\r
+                       tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'}));\r
+                       tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'}));\r
+                       tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'}));\r
+                       tb.add(cf.createSeparator());\r
+                       tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'}));\r
+                       tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'}));\r
+                       tb.add(cf.createSeparator());\r
+                       tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'}));\r
+                       tb.add(cf.createSeparator());\r
+                       tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'}));\r
+                       tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'}));\r
+                       tb.renderTo(n);\r
+\r
+                       return {\r
+                               iframeContainer : ic,\r
+                               editorContainer : ed.id + '_container',\r
+                               sizeContainer : sc,\r
+                               deltaHeight : -20\r
+                       };\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Simple theme',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       }\r
+               }\r
+       });\r
+\r
+       tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme);\r
+})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/simple/img/icons.gif b/program/js/tiny_mce/themes/simple/img/icons.gif
new file mode 100644 (file)
index 0000000..16af141
Binary files /dev/null and b/program/js/tiny_mce/themes/simple/img/icons.gif differ
diff --git a/program/js/tiny_mce/themes/simple/langs/en.js b/program/js/tiny_mce/themes/simple/langs/en.js
new file mode 100644 (file)
index 0000000..9f08f10
--- /dev/null
@@ -0,0 +1,11 @@
+tinyMCE.addI18n('en.simple',{\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+cleanup_desc:"Cleanup messy code"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/simple/skins/default/content.css b/program/js/tiny_mce/themes/simple/skins/default/content.css
new file mode 100644 (file)
index 0000000..2506c80
--- /dev/null
@@ -0,0 +1,25 @@
+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;\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/program/js/tiny_mce/themes/simple/skins/default/ui.css b/program/js/tiny_mce/themes/simple/skins/default/ui.css
new file mode 100644 (file)
index 0000000..1cf64b8
--- /dev/null
@@ -0,0 +1,32 @@
+/* Reset */\r
+.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000}\r
+\r
+/* Containers */\r
+.defaultSimpleSkin {position:relative}\r
+.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;}\r
+.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;}\r
+.defaultSimpleSkin .mceToolbar {height:24px;}\r
+\r
+/* Layout */\r
+.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px}\r
+.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}\r
+\r
+/* Button */\r
+.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px}\r
+.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}\r
+.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0}\r
+.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; filter:alpha(opacity=30)}\r
+\r
+/* Separator */\r
+.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px}\r
+\r
+/* Theme */\r
+.defaultSimpleSkin span.mce_bold {background-position:0 0}\r
+.defaultSimpleSkin span.mce_italic {background-position:-60px 0}\r
+.defaultSimpleSkin span.mce_underline {background-position:-140px 0}\r
+.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0}\r
+.defaultSimpleSkin span.mce_undo {background-position:-160px 0}\r
+.defaultSimpleSkin span.mce_redo {background-position:-100px 0}\r
+.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0}\r
+.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0}\r
+.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0}\r
diff --git a/program/js/tiny_mce/themes/simple/skins/o2k7/content.css b/program/js/tiny_mce/themes/simple/skins/o2k7/content.css
new file mode 100644 (file)
index 0000000..595809f
--- /dev/null
@@ -0,0 +1,17 @@
+body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}\r
+\r
+body {background: #FFF;}\r
+.mceVisualAid {border: 1px dashed #BBB;}\r
+\r
+/* IE */\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/program/js/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png b/program/js/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png
new file mode 100644 (file)
index 0000000..527e349
Binary files /dev/null and b/program/js/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png differ
diff --git a/program/js/tiny_mce/themes/simple/skins/o2k7/ui.css b/program/js/tiny_mce/themes/simple/skins/o2k7/ui.css
new file mode 100644 (file)
index 0000000..bfae96e
--- /dev/null
@@ -0,0 +1,35 @@
+/* Reset */\r
+.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000}\r
+\r
+/* Containers */\r
+.o2k7SimpleSkin {position:relative}\r
+.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;}\r
+.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;}\r
+.o2k7SimpleSkin .mceToolbar {height:26px;}\r
+\r
+/* Layout */\r
+.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; }\r
+.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}\r
+.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px}\r
+.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}\r
+\r
+/* Button */\r
+.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}\r
+.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px}\r
+.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}\r
+.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px}\r
+.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; filter:alpha(opacity=30)}\r
+\r
+/* Separator */\r
+.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}\r
+\r
+/* Theme */\r
+.o2k7SimpleSkin span.mce_bold {background-position:0 0}\r
+.o2k7SimpleSkin span.mce_italic {background-position:-60px 0}\r
+.o2k7SimpleSkin span.mce_underline {background-position:-140px 0}\r
+.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0}\r
+.o2k7SimpleSkin span.mce_undo {background-position:-160px 0}\r
+.o2k7SimpleSkin span.mce_redo {background-position:-100px 0}\r
+.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0}\r
+.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0}\r
+.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0}\r
index 71e62a06d0646a284a28d00c375e108202fb26ee..b36e797a278394e62a259f74732da58ea354dd82 100644 (file)
@@ -1 +1 @@
-function TinyMCE_Engine(){var ua;this.majorVersion="2";this.minorVersion="1.3";this.releaseDate="2007-11-27";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);this._def("save_on_tinymce_forms",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,n;if(inst){inst.switchSettings();editor_id=inst.editorId;h=tinyMCE.getContent(editor_id);this.removeInstance(inst);tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;for(n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;tinyMCE.selectedInstance=tinyMCE.instances[n];break}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":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;if(tinyMCE.getParam('save_on_tinymce_forms')){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}}}}else found=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,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();anySelection=!inst.selection.isCollapsed();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&&win.document){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){if(m.hasOwnProperty(n))c.prototype[n]=m[n]}},extend:function(p,np){var o={},n;o.parent=p;for(n in p){if(p.hasOwnProperty(n))o[n]=p[n]}for(n in np){if(np.hasOwnProperty(n))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&&ne.nodeValue.replace(/\s+/g,'')!='')||(ne.nodeType==1&&!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.setAttribute('align','');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.setAttribute('align','');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.setAttribute('align','');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"JustifyLeft":case"JustifyCenter":case"JustifyFull":case"JustifyRight":var el=tinyMCE.getParentNode(focusElm,function(n){return tinyMCE.getAttrib(n,'align')});if(el){el.setAttribute('align','');el.removeAttribute('align')}else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();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||tinyMCE.isOpera){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;if(i&&box[i]!=box[i-1])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++;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=[];this.serializationId=0;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(document.importNode(r.cloneContents(),true));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=="HTML"?doc.body:startNode;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
+var tinymce={majorVersion:'3',minorVersion:'0.6.2',releaseDate:'2008-04-07',_init:function(){var t=this,ua=navigator.userAgent,i,nl,n,base;t.isOpera=window.opera&&opera.buildNumber;t.isWebKit=/WebKit/.test(ua);t.isOldWebKit=t.isWebKit&&!window.getSelection().getRangeAt;t.isIE=!t.isWebKit&&!t.isOpera&&(/MSIE/gi).test(ua)&&(/Explorer/gi).test(navigator.appName);t.isIE6=t.isIE&&/MSIE [56]/.test(ua);t.isGecko=!t.isWebKit&&/Gecko/.test(ua);t.isMac=ua.indexOf('Mac')!=-1;if(window.tinyMCEPreInit){t.suffix=tinyMCEPreInit.suffix;t.baseURL=tinyMCEPreInit.base;return;}t.suffix='';nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)base=nl[i].href;}function getBase(n){if(n.src&&/tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)){if(/_(src|dev)\.js/g.test(n.src))t.suffix='_src';t.baseURL=n.src.substring(0,n.src.lastIndexOf('/'));if(base&&t.baseURL.indexOf('://')==-1)t.baseURL=base+t.baseURL;return t.baseURL;}return null;};nl=document.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}n=document.getElementsByTagName('head')[0];if(n){nl=n.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}}return;},is:function(o,t){var n=typeof(o);if(!t)return n!='undefined';if(t=='array'&&(o instanceof Array))return true;return n==t;},each:function(o,cb,s){var n,l;if(!o)return 0;s=s||o;if(typeof(o.length)!='undefined'){for(n=0,l=o.length;n<l;n++){if(cb.call(s,o[n],n,o)===false)return 0;}}else{for(n in o){if(o.hasOwnProperty(n)){if(cb.call(s,o[n],n,o)===false)return 0;}}}return 1;},map:function(a,f){var o=[];tinymce.each(a,function(v){o.push(f(v));});return o;},grep:function(a,f){var o=[];tinymce.each(a,function(v){if(!f||f(v))o.push(v);});return o;},inArray:function(a,v){var i,l;if(a){for(i=0,l=a.length;i<l;i++){if(a[i]===v)return i;}}return-1;},extend:function(o,e){var i,a=arguments;for(i=1;i<a.length;i++){e=a[i];tinymce.each(e,function(v,n){if(typeof(v)!=='undefined')o[n]=v;});}return o;},trim:function(s){return(s?''+s:'').replace(/^\s*|\s*$/g,'');},create:function(s,p){var t=this,sp,ns,cn,scn,c,de=0;s=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);cn=s[3].match(/(^|\.)(\w+)$/i)[2];ns=t.createNS(s[3].replace(/\.\w+$/,''));if(ns[cn])return;if(s[2]=='static'){ns[cn]=p;if(this.onCreate)this.onCreate(s[2],s[3],ns[cn]);return;}if(!p[cn]){p[cn]=function(){};de=1;}ns[cn]=p[cn];t.extend(ns[cn].prototype,p);if(s[5]){sp=t.resolve(s[5]).prototype;scn=s[5].match(/\.(\w+)$/i)[1];c=ns[cn];if(de){ns[cn]=function(){return sp[scn].apply(this,arguments);};}else{ns[cn]=function(){this.parent=sp[scn];return c.apply(this,arguments);};}ns[cn].prototype[cn]=ns[cn];t.each(sp,function(f,n){ns[cn].prototype[n]=sp[n];});t.each(p,function(f,n){if(sp[n]){ns[cn].prototype[n]=function(){this.parent=sp[n];return f.apply(this,arguments);};}else{if(n!=cn)ns[cn].prototype[n]=f;}});}t.each(p['static'],function(f,n){ns[cn][n]=f;});if(this.onCreate)this.onCreate(s[2],s[3],ns[cn].prototype);},walk:function(o,f,n,s){s=s||this;if(o){if(n)o=o[n];tinymce.each(o,function(o,i){if(f.call(s,o,i,n)===false)return false;tinymce.walk(o,f,n,s);});}},createNS:function(n,o){var i,v;o=o||window;n=n.split('.');for(i=0;i<n.length;i++){v=n[i];if(!o[v])o[v]={};o=o[v];}return o;},resolve:function(n,o){var i,l;o=o||window;n=n.split('.');for(i=0,l=n.length;i<l;i++){o=o[n[i]];if(!o)break;}return o;},addUnload:function(f,s){var t=this,w=window,unload;f={func:f,scope:s||this};if(!t.unloads){unload=function(){var li=t.unloads,o,n;for(n in li){o=li[n];if(o&&o.func)o.func.call(o.scope,1);}if(w.detachEvent)w.detachEvent('onunload',unload);else if(w.removeEventListener)w.removeEventListener('unload',unload,false);o=li=w=unload=null;if(window.CollectGarbage)window.CollectGarbage();};if(w.attachEvent)w.attachEvent('onunload',unload);else if(w.addEventListener)w.addEventListener('unload',unload,false);t.unloads=[f];}else t.unloads.push(f);return f;},removeUnload:function(f){var u=this.unloads,r=null;tinymce.each(u,function(o,i){if(o&&o.func==f){u.splice(i,1);r=f;return false;}});return r;},explode:function(s,d){return tinymce.map(s.split(d||','),tinymce.trim);}};window.tinymce=tinymce;tinymce._init();tinymce.create('tinymce.util.Dispatcher',{scope:null,listeners:null,Dispatcher:function(s){this.scope=s||this;this.listeners=[];},add:function(cb,s){this.listeners.push({cb:cb,scope:s||this.scope});return cb;},addToTop:function(cb,s){this.listeners.unshift({cb:cb,scope:s||this.scope});return cb;},remove:function(cb){var l=this.listeners,o=null;tinymce.each(l,function(c,i){if(cb==c.cb){o=cb;l.splice(i,1);return false;}});return o;},dispatch:function(){var s,a=arguments,i,li=this.listeners,c;for(i=0;i<li.length;i++){c=li[i];s=c.cb.apply(c.scope,a);if(s===false)break;}return s;}});(function(){var each=tinymce.each;tinymce.create('tinymce.util.URI',{URI:function(u,s){var t=this,o,a,b;s=t.settings=s||{};if(/^(mailto|news|javascript|about):/i.test(u)||/^\s*#/.test(u)){t.source=u;return;}if(u.indexOf('/')===0&&u.indexOf('//')!==0)u=(s.base_uri?s.base_uri.protocol||'http':'http')+'://mce_host'+u;if(u.indexOf('://')===-1&&u.indexOf('//')!==0)u=(s.base_uri.protocol||'http')+'://mce_host'+t.toAbsPath(s.base_uri.path,u);u=u.replace(/@@/g,'(mce_at)');u=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(v,i){var s=u[i];if(s)s=s.replace(/\(mce_at\)/g,'@@');t[v]=s;});if(b=s.base_uri){if(!t.protocol)t.protocol=b.protocol;if(!t.userInfo)t.userInfo=b.userInfo;if(!t.port&&t.host=='mce_host')t.port=b.port;if(!t.host||t.host=='mce_host')t.host=b.host;t.source='';}},setPath:function(p){var t=this;p=/^(.*?)\/?(\w+)?$/.exec(p);t.path=p[0];t.directory=p[1];t.file=p[2];t.source='';t.getURI();},toRelative:function(u){var t=this,o;u=new tinymce.util.URI(u,{base_uri:t});if((u.host!='mce_host'&&t.host!=u.host&&u.host)||t.port!=u.port||t.protocol!=u.protocol)return u.getURI();o=t.toRelPath(t.path,u.path);if(u.query)o+='?'+u.query;if(u.anchor)o+='#'+u.anchor;return o;},toAbsolute:function(u,nh){var u=new tinymce.util.URI(u,{base_uri:this});return u.getURI(this.host==u.host?nh:0);},toRelPath:function(base,path){var items,bp=0,out='',i;base=base.substring(0,base.lastIndexOf('/'));base=base.split('/');items=path.split('/');if(base.length>=items.length){for(i=0;i<base.length;i++){if(i>=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length<items.length){for(i=0;i<items.length;i++){if(i>=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0;i<base.length-(bp-1);i++)out+="../";for(i=bp-1;i<items.length;i++){if(i!=bp-1)out+="/"+items[i];else out+=items[i];}return out;},toAbsPath:function(base,path){var i,nb=0,o=[];base=base.split('/');path=path.split('/');each(base,function(k){if(k)o.push(k);});base=o;for(i=path.length-1,o=[];i>=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return'/'+o.reverse().join('/');return'/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});})();(function(){var each=tinymce.each;tinymce.create('static tinymce.util.Cookie',{getHash:function(n){var v=this.get(n),h;if(v){each(v.split('&'),function(v){v=v.split('=');h=h||{};h[unescape(v[0])]=unescape(v[1]);});}return h;},setHash:function(n,v,e,p,d,s){var o='';each(v,function(v,k){o+=(!o?'':'&')+escape(k)+'='+escape(v);});this.set(n,o,e,p,d,s);},get:function(n){var c=document.cookie,e,p=n+"=",b;if(!c)return;b=c.indexOf("; "+p);if(b==-1){b=c.indexOf(p);if(b!=0)return null;}else b+=2;e=c.indexOf(";",b);if(e==-1)e=c.length;return unescape(c.substring(b+p.length,e));},set:function(n,v,e,p,d,s){document.cookie=n+"="+escape(v)+((e)?"; expires="+e.toGMTString():"")+((p)?"; path="+escape(p):"")+((d)?"; domain="+d:"")+((s)?"; secure":"");},remove:function(n,p){var d=new Date();d.setTime(d.getTime()-1000);this.set(n,'',d,p,d);}});})();tinymce.create('static tinymce.util.JSON',{serialize:function(o){var i,v,s=tinymce.util.JSON.serialize,t;if(o==null)return'null';t=typeof o;if(t=='string'){v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g,function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a;})+'"';}if(t=='object'){if(o instanceof Array){for(i=0,v='[';i<o.length;i++)v+=(i>0?',':'')+s(o[i]);return v+']';}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}';}return''+o;},parse:function(s){try{return eval('('+s+')');}catch(ex){}}});tinymce.create('static tinymce.util.XHR',{send:function(o){var x,t,w=window,c=0;o.scope=o.scope||this;o.success_scope=o.success_scope||o.scope;o.error_scope=o.error_scope||o.scope;o.async=o.async===false?false:true;o.data=o.data||'';function get(s){x=0;try{x=new ActiveXObject(s);}catch(ex){}return x;};x=w.XMLHttpRequest?new XMLHttpRequest():get('Microsoft.XMLHTTP')||get('Msxml2.XMLHTTP');if(x){if(x.overrideMimeType)x.overrideMimeType(o.content_type);x.open(o.type||(o.data?'POST':'GET'),o.url,o.async);if(o.content_type)x.setRequestHeader('Content-Type',o.content_type);x.send(o.data);t=w.setInterval(function(){if(x.readyState==4||c++>10000){w.clearInterval(t);if(o.success&&c<10000&&x.status==200)o.success.call(o.success_scope,''+x.responseText,x,o);else if(o.error)o.error.call(o.error_scope,c>10000?'TIMED_OUT':'GENERAL',x,o);x=null;}},10);}}});(function(){var extend=tinymce.extend,JSON=tinymce.util.JSON,XHR=tinymce.util.XHR;tinymce.create('tinymce.util.JSONRequest',{JSONRequest:function(s){this.settings=extend({},s);this.count=0;},send:function(o){var ecb=o.error,scb=o.success;o=extend(this.settings,o);o.success=function(c,x){c=JSON.parse(c);if(typeof(c)=='undefined'){c={error:'JSON Parse error.'};}if(c.error)ecb.call(o.error_scope||o.scope,c.error,x);else scb.call(o.success_scope||o.scope,c.result);};o.error=function(ty,x){ecb.call(o.error_scope||o.scope,ty,x);};o.data=JSON.serialize({id:o.id||'c'+(this.count++),method:o.method,params:o.params});o.content_type='application/json';XHR.send(o);},'static':{sendRPC:function(o){return new tinymce.util.JSONRequest().send(o);}}});}());(function(){var each=tinymce.each,is=tinymce.is;var isWebKit=tinymce.isWebKit,isIE=tinymce.isIE;tinymce.create('tinymce.dom.DOMUtils',{doc:null,root:null,files:null,listeners:{},pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,cache:{},idPattern:/^#[\w]+$/,elmPattern:/^[\w_*]+$/,elmClassPattern:/^([\w_]*)\.([\w_]+)$/,DOMUtils:function(d,s){var t=this;t.doc=d;t.win=window;t.files={};t.cssFlicker=false;t.counter=0;t.boxModel=!tinymce.isIE||d.compatMode=="CSS1Compat";t.stdMode=d.documentMode===8;this.settings=s=tinymce.extend({keep_values:false,hex_colors:1,process_html:1},s);if(tinymce.isIE6){try{d.execCommand('BackgroundImageCache',false,true);}catch(e){t.cssFlicker=true;}}tinymce.addUnload(t.destroy,t);},getRoot:function(){var t=this,s=t.settings;return(s&&t.get(s.root_element))||t.doc.body;},getViewPort:function(w){var d,b;w=!w?this.win:w;d=w.document;b=this.boxModel?d.documentElement:d.body;return{x:w.pageXOffset||b.scrollLeft,y:w.pageYOffset||b.scrollTop,w:w.innerWidth||b.clientWidth,h:w.innerHeight||b.clientHeight};},getRect:function(e){var p,t=this,w,h;e=t.get(e);p=t.getPos(e);w=t.getStyle(e,'width');h=t.getStyle(e,'height');if(w.indexOf('px')===-1)w=0;if(h.indexOf('px')===-1)h=0;return{x:p.x,y:p.y,w:parseInt(w)||e.offsetWidth||e.clientWidth,h:parseInt(h)||e.offsetHeight||e.clientHeight};},getParent:function(n,f,r){var na,se=this.settings;n=this.get(n);if(se.strict_root)r=r||this.getRoot();if(is(f,'string')){na=f.toUpperCase();f=function(n){var s=false;if(n.nodeType==1&&na==='*'){s=true;return false;}each(na.split(','),function(v){if(n.nodeType==1&&((se.strict&&n.nodeName.toUpperCase()==v)||n.nodeName==v)){s=true;return false;}});return s;};}while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode;}return null;},get:function(e){var n;if(this.doc&&typeof(e)=='string'){n=e;e=this.doc.getElementById(e);if(e&&e.id!==n)return this.doc.getElementsByName(n)[1];}return e;},select:function(pa,s){var t=this,cs,c,pl,o=[],x,i,l,n;s=t.get(s)||t.doc;if(s.querySelectorAll){if(s!=t.doc){i=s.id;s.id='_mc_tmp';pa='#_mc_tmp '+pa;}l=tinymce.grep(s.querySelectorAll(pa));s.id=i;return l;}if(t.settings.strict){function get(s,n){return s.getElementsByTagName(n.toLowerCase());};}else{function get(s,n){return s.getElementsByTagName(n);};}if(t.elmPattern.test(pa)){x=get(s,pa);for(i=0,l=x.length;i<l;i++)o.push(x[i]);return o;}if(t.elmClassPattern.test(pa)){pl=t.elmClassPattern.exec(pa);x=get(s,pl[1]||'*');c=' '+pl[2]+' ';for(i=0,l=x.length;i<l;i++){n=x[i];if(n.className&&(' '+n.className+' ').indexOf(c)!==-1)o.push(n);}return o;}function collect(n){if(!n.mce_save){n.mce_save=1;o.push(n);}};function collectIE(n){if(!n.getAttribute('mce_save')){n.setAttribute('mce_save','1');o.push(n);}};function find(n,f,r){var i,l,nl=get(r,n);for(i=0,l=nl.length;i<l;i++)f(nl[i]);};each(pa.split(','),function(v,i){v=tinymce.trim(v);if(t.elmPattern.test(v)){each(get(s,v),function(n){collect(n);});return;}if(t.elmClassPattern.test(v)){x=t.elmClassPattern.exec(v);each(get(s,x[1]),function(n){if(t.hasClass(n,x[2]))collect(n);});return;}if(!(cs=t.cache[pa])){cs='x=(function(cf, s) {';pl=v.split(' ');each(pl,function(v){var p=/^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v);p[1]=p[1]||'*';cs+='find("'+p[1]+'", function(n) {';if(p[2])cs+='if (n.id !== "'+p[2]+'") return;';if(p[3]){cs+='var c = " " + n.className + " ";';cs+='if (';c='';each(p[3].split('.'),function(v){if(v)c+=(c?'||':'')+'c.indexOf(" '+v+' ") === -1';});cs+=c+') return;';}});cs+='cf(n);';for(i=pl.length-1;i>=0;i--)cs+='}, '+(i?'n':'s')+');';cs+='})';t.cache[pa]=cs=eval(cs);}cs(isIE?collectIE:collect,s);});each(o,function(n){if(isIE)n.removeAttribute('mce_save');else delete n.mce_save;});return o;},add:function(p,n,a,h,c){var t=this;return this.run(p,function(p){var e,k;e=is(n,'string')?t.doc.createElement(n):n;if(a){for(k in a){if(a.hasOwnProperty(k)&&!is(a[k],'object'))t.setAttrib(e,k,''+a[k]);}if(a.style&&!is(a.style,'string')){each(a.style,function(v,n){t.setStyle(e,n,v);});}}if(h){if(h.nodeType)e.appendChild(h);else t.setHTML(e,h);}return!c?p.appendChild(e):e;});},create:function(n,a,h){return this.add(this.doc.createElement(n),n,a,h,1);},createHTML:function(n,a,h){var o='',t=this,k;o+='<'+n;for(k in a){if(a.hasOwnProperty(k))o+=' '+k+'="'+t.encode(a[k])+'"';}if(tinymce.is(h))return o+'>'+h+'</'+n+'>';return o+' />';},remove:function(n,k){return this.run(n,function(n){var p,g;p=n.parentNode;if(!p)return null;if(k){each(n.childNodes,function(c){p.insertBefore(c.cloneNode(true),n);});}return p.removeChild(n);});},setStyle:function(n,na,v){var t=this;return t.run(n,function(e){var s,i;s=e.style;na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(t.pixelStyles.test(na)&&(tinymce.is(v,'number')||/^[\-0-9\.]+$/.test(v)))v+='px';switch(na){case'opacity':if(isIE){s.filter=v===''?'':"alpha(opacity="+(v*100)+")";if(!n.currentStyle||!n.currentStyle.hasLayout)s.display='inline-block';}s[na]=s['-moz-opacity']=s['-khtml-opacity']=v||'';break;case'float':isIE?s.styleFloat=v:s.cssFloat=v;break;default:s[na]=v||'';}if(t.settings.update_styles)t.setAttrib(e,'mce_style');});},getStyle:function(n,na,c){n=this.get(n);if(!n)return false;if(this.doc.defaultView&&c){na=na.replace(/[A-Z]/g,function(a){return'-'+a;});try{return this.doc.defaultView.getComputedStyle(n,null).getPropertyValue(na);}catch(ex){return null;}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(na=='float')na=isIE?'styleFloat':'cssFloat';if(n.currentStyle&&c)return n.currentStyle[na];return n.style[na];},setStyles:function(e,o){var t=this,s=t.settings,ol;ol=s.update_styles;s.update_styles=0;each(o,function(v,n){t.setStyle(e,n,v);});s.update_styles=ol;if(s.update_styles)t.setAttrib(e,s.cssText);},setAttrib:function(e,n,v){var t=this;if(t.settings.strict)n=n.toLowerCase();return this.run(e,function(e){var s=t.settings;switch(n){case"style":if(s.keep_values){if(v)e.setAttribute('mce_style',v,2);else e.removeAttribute('mce_style',2);}e.style.cssText=v;break;case"class":e.className=v||'';break;case"src":case"href":if(s.keep_values){if(s.url_converter)v=s.url_converter.call(s.url_converter_scope||t,v,n,e);t.setAttrib(e,'mce_'+n,v,2);}break;}if(is(v)&&v!==null&&v.length!==0)e.setAttribute(n,''+v,2);else e.removeAttribute(n,2);});},setAttribs:function(e,o){var t=this;return this.run(e,function(e){each(o,function(v,n){t.setAttrib(e,n,v);});});},getAttrib:function(e,n,dv){var v,t=this;e=t.get(e);if(!e)return false;if(!is(dv))dv="";if(/^(src|href|style|coords)$/.test(n)){v=e.getAttribute("mce_"+n);if(v)return v;}v=e.getAttribute(n,2);if(!v){switch(n){case'class':v=e.className;break;default:if(isIE&&n==='name'&&e.nodeName==='A'){v=e.name;break;}v=e.attributes[n];v=v&&is(v.nodeValue)?v.nodeValue:v;}}switch(n){case'style':v=v||e.style.cssText;if(v){v=t.serializeStyle(t.parseStyle(v));if(t.settings.keep_values)e.setAttribute('mce_style',v);}break;}if(isWebKit&&n==="class"&&v)v=v.replace(/(apple|webkit)\-[a-z\-]+/gi,'');if(isIE){switch(n){case'rowspan':case'colspan':if(v===1)v='';break;case'size':if(v==='+0')v='';break;case'hspace':if(v===-1)v='';break;case'tabindex':if(v===32768)v='';break;case'shape':v=v.toLowerCase();break;default:if(n.indexOf('on')===0&&v)v=(''+v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,'$1');}}return(v&&v!='')?''+v:dv;},getPos:function(n){var t=this,x=0,y=0,e,d=t.doc,r;n=t.get(n);if(n&&isIE){n=n.getBoundingClientRect();e=t.boxModel?d.documentElement:d.body;x=t.getStyle(t.select('html')[0],'borderWidth');x=(x=='medium'||t.boxModel&&!t.isIE6)&&2||x;n.top+=t.win.self!=t.win.top?2:0;return{x:n.left+e.scrollLeft-x,y:n.top+e.scrollTop-x};}r=n;while(r){x+=r.offsetLeft||0;y+=r.offsetTop||0;r=r.offsetParent;}r=n;while(r){if(!/^table-row|inline.*/i.test(t.getStyle(r,"display",1))){x-=r.scrollLeft||0;y-=r.scrollTop||0;}r=r.parentNode;if(r==d.body)break;}return{x:x,y:y};},parseStyle:function(st){var t=this,s=t.settings,o={};if(!st)return o;function compress(p,s,ot){var t,r,b,l;t=o[p+'-top'+s];if(!t)return;r=o[p+'-right'+s];if(t!=r)return;b=o[p+'-bottom'+s];if(r!=b)return;l=o[p+'-left'+s];if(b!=l)return;o[ot]=l;delete o[p+'-top'+s];delete o[p+'-right'+s];delete o[p+'-bottom'+s];delete o[p+'-left'+s];};function compress2(ta,a,b,c){var t;t=o[a];if(!t)return;t=o[b];if(!t)return;t=o[c];if(!t)return;o[ta]=o[a]+' '+o[b]+' '+o[c];delete o[a];delete o[b];delete o[c];};each(st.split(';'),function(v){var sv,ur=[];if(v){v=v.replace(/url\([^\)]+\)/g,function(v){ur.push(v);return'url('+ur.length+')';});v=v.split(':');sv=tinymce.trim(v[1]);sv=sv.replace(/url\(([^\)]+)\)/g,function(a,b){return ur[parseInt(b)-1];});sv=sv.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});if(s.url_converter){sv=sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),'style',null))+')';});}o[tinymce.trim(v[0]).toLowerCase()]=sv;}});compress("border","","border");compress("border","-width","border-width");compress("border","-color","border-color");compress("border","-style","border-style");compress("padding","","padding");compress("margin","","margin");compress2('border','border-width','border-style','border-color');if(isIE){if(o.border=='medium none')o.border='';}return o;},serializeStyle:function(o){var s='';each(o,function(v,k){if(k&&v){switch(k){case'color':case'background-color':v=v.toLowerCase();break;}s+=(s?' ':'')+k+': '+v+';';}});return s;},loadCSS:function(u){var t=this,d=t.doc;if(!u)u='';each(u.split(','),function(u){if(t.files[u])return;t.files[u]=true;t.add(t.select('head')[0],'link',{rel:'stylesheet',href:u});});},addClass:function(e,c){return this.run(e,function(e){var o;if(!c)return 0;if(this.hasClass(e,c))return e.className;o=this.removeClass(e,c);return e.className=(o!=''?(o+' '):'')+c;});},removeClass:function(e,c){var t=this,re;return t.run(e,function(e){var v;if(t.hasClass(e,c)){if(!re)re=new RegExp("(^|\\s+)"+c+"(\\s+|$)","g");v=e.className.replace(re,' ');return e.className=tinymce.trim(v!=' '?v:'');}return e.className;});},hasClass:function(n,c){n=this.get(n);if(!n||!c)return false;return(' '+n.className+' ').indexOf(' '+c+' ')!==-1;},show:function(e){return this.setStyle(e,'display','block');},hide:function(e){return this.setStyle(e,'display','none');},isHidden:function(e){e=this.get(e);return e.style.display=='none'||this.getStyle(e,'display')=='none';},uniqueId:function(p){return(!p?'mce_':p)+(this.counter++);},setHTML:function(e,h){var t=this;return this.run(e,function(e){var x,i,nl,n,p,x;h=t.processHTML(h);if(isIE){function set(){try{e.innerHTML='<br />'+h;e.removeChild(e.firstChild);}catch(ex){while(e.firstChild)e.firstChild.removeNode();x=t.create('div');x.innerHTML='<br />'+h;each(x.childNodes,function(n,i){if(i)e.appendChild(n);});}};if(t.settings.fix_ie_paragraphs)h=h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 mce_keep="true">&nbsp;</p>');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("p");for(i=nl.length-1,x=0;i>=0;i--){n=nl[i];if(!n.hasChildNodes()){if(!n.mce_keep){x=1;break;}n.removeAttribute('mce_keep');}}}if(x){h=h.replace(/<p([^>]+)>|<p>/g,'<div$1 mce_tmp="1">');h=h.replace(/<\/p>/g,'</div>');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("DIV");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.mce_tmp){p=t.doc.createElement('p');n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(a,b){var v;if(b!=='mce_tmp'){v=n.getAttribute(b);if(!v&&b==='class')v=n.className;p.setAttribute(b,v);}});for(x=0;x<n.childNodes.length;x++)p.appendChild(n.childNodes[x].cloneNode(true));n.swapNode(p);}}}}}else e.innerHTML=h;return h;});},processHTML:function(h){var t=this,s=t.settings;if(!s.process_html)return h;if(tinymce.isGecko){h=h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi,'<$1b$2>');h=h.replace(/<(\/?)em>|<em( [^>]+)>/gi,'<$1i$2>');}h=h.replace(/<a( )([^>]+)\/>|<a\/>/gi,'<a$1$2></a>');if(s.keep_values){if(h.indexOf('<script')!==-1){h=h.replace(/<script>/g,'<script type="text/javascript">');h=h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g,'<mce:script$1><!--\n');h=h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g,'\n// --></mce:script>');h=h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g,'<mce:script$1></mce:script>');}h=h.replace(/<([\w:]+) [^>]*(src|href|style|coords)[^>]*>/gi,function(a,n){function handle(m,b,c){var u=c;if(a.indexOf('mce_'+b)!=-1)return m;if(b=='style'){if(s.hex_colors){u=u.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});}if(s.url_converter){u=u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n))+')';});}}else if(b!='coords'){if(s.url_converter)u=t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n));}return' '+b+'="'+c+'" mce_'+b+'="'+u+'"';};a=a.replace(/ (src|href|style|coords)=[\"]([^\"]+)[\"]/gi,handle);a=a.replace(/ (src|href|style|coords)=[\']([^\']+)[\']/gi,handle);return a.replace(/ (src|href|style|coords)=([^\s\"\'>]+)/gi,handle);});}return h;},getOuterHTML:function(e){var d;e=this.get(e);if(!e)return null;if(isIE)return e.outerHTML;d=(e.ownerDocument||this.doc).createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML;},setOuterHTML:function(e,h,d){var t=this;return this.run(e,function(e){var n,tp;e=t.get(e);d=d||e.ownerDocument||t.doc;if(isIE&&e.nodeType==1)e.outerHTML=h;else{tp=d.createElement("body");tp.innerHTML=h;n=tp.lastChild;while(n){t.insertAfter(n.cloneNode(true),e);n=n.previousSibling;}t.remove(e);}});},decode:function(s){var e;if(/&[^;]+;/.test(s)){e=this.doc.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue;}return s;},encode:function(s){return s?(''+s).replace(/[<>&\"]/g,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;';}return c;}):s;},insertAfter:function(n,r){var t=this;r=t.get(r);return this.run(n,function(n){var p,ns;p=r.parentNode;ns=r.nextSibling;if(ns)p.insertBefore(n,ns);else p.appendChild(n);return n;});},isBlock:function(n){if(n.nodeType&&n.nodeType!==1)return false;n=n.nodeName||n;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);},replace:function(n,o,k){if(is(o,'array'))n=n.cloneNode(true);return this.run(o,function(o){if(k){each(o.childNodes,function(c){n.appendChild(c.cloneNode(true));});}if(isIE&&o.nodeType===1){o.parentNode.insertBefore(n,o);o.outerHTML='';return n;}return o.parentNode.replaceChild(n,o);});},toHex:function(s){var c=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);function hex(s){s=parseInt(s).toString(16);return s.length>1?s:'0'+s;};if(c){s='#'+hex(c[1])+hex(c[2])+hex(c[3]);return s;}return s;},getClasses:function(){var t=this,cl=[],i,lo={},f=t.settings.class_filter,ov;if(t.classes)return t.classes;function addClasses(s){each(s.imports,function(r){addClasses(r);});each(s.cssRules||s.rules,function(r){switch(r.type||1){case 1:if(r.selectorText){each(r.selectorText.split(','),function(v){v=v.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(v)||!/\.[\w\-]+$/.test(v))return;ov=v;v=v.replace(/.*\.([a-z0-9_\-]+).*/i,'$1');if(f&&!(v=f(v,ov)))return;if(!lo[v]){cl.push({'class':v});lo[v]=1;}});}break;case 3:addClasses(r.styleSheet);break;}});};try{each(t.doc.styleSheets,addClasses);}catch(ex){}if(cl.length>0)t.classes=cl;return cl;},run:function(e,f,s){var t=this,o;if(t.doc&&typeof(e)==='string')e=t.doc.getElementById(e);if(!e)return false;s=s||this;if(!e.nodeType&&(e.length||e.length===0)){o=[];each(e,function(e,i){if(e){if(typeof(e)=='string')e=t.doc.getElementById(e);o.push(f.call(s,e,i));}});return o;}return f.call(s,e);},getAttribs:function(n){var o;n=this.get(n);if(!n)return[];if(isIE){o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;}return n.attributes;},destroy:function(s){var t=this;t.win=t.doc=t.root=null;if(!s)tinymce.removeUnload(t.destroy);}});tinymce.DOM=new tinymce.dom.DOMUtils(document,{process_html:0});})();(function(){var each=tinymce.each,DOM=tinymce.DOM,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit,Event;tinymce.create('static tinymce.dom.Event',{inits:[],events:[],add:function(o,n,f,s){var cb,t=this,el=t.events,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.add(o,n,f,s));});return r;}o=DOM.get(o);if(!o)return;cb=function(e){e=e||window.event;if(e&&!e.target&&isIE)e.target=e.srcElement;if(!s)return f(e);return f.call(s,e);};if(n=='unload'){tinymce.unloads.unshift({func:cb});return cb;}if(n=='init'){if(t.domLoaded)cb();else t.inits.push(cb);return cb;}el.push({obj:o,name:n,func:f,cfunc:cb,scope:s});t._add(o,n,cb);return f;},remove:function(o,n,f){var t=this,a=t.events,s=false,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.remove(o,n,f));});return r;}o=DOM.get(o);each(a,function(e,i){if(e.obj==o&&e.name==n&&(!f||(e.func==f||e.cfunc==f))){a.splice(i,1);t._remove(o,n,e.cfunc);s=true;return false;}});return s;},clear:function(o){var t=this,a=t.events,i,e;if(o){o=DOM.get(o);for(i=a.length-1;i>=0;i--){e=a[i];if(e.obj===o){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;a.splice(i,1);}}}},cancel:function(e){if(!e)return false;this.stop(e);return this.prevent(e);},stop:function(e){if(e.stopPropagation)e.stopPropagation();else e.cancelBubble=true;return false;},prevent:function(e){if(e.preventDefault)e.preventDefault();else e.returnValue=false;return false;},_unload:function(){var t=Event;each(t.events,function(e,i){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;});t.events=[];t=null;},_add:function(o,n,f){if(o.attachEvent)o.attachEvent('on'+n,f);else if(o.addEventListener)o.addEventListener(n,f,false);else o['on'+n]=f;},_remove:function(o,n,f){if(o){try{if(o.detachEvent)o.detachEvent('on'+n,f);else if(o.removeEventListener)o.removeEventListener(n,f,false);else o['on'+n]=null;}catch(ex){}}},_pageInit:function(){var e=Event;e._remove(window,'DOMContentLoaded',e._pageInit);e.domLoaded=true;each(e.inits,function(c){c();});e.inits=[];},_wait:function(){var t;if(window.tinyMCE_GZ&&tinyMCE_GZ.loaded)return;if(isIE&&document.location.protocol!='https:'){document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');DOM.get("__ie_onload").onreadystatechange=function(){if(this.readyState=="complete"){Event._pageInit();DOM.get("__ie_onload").onreadystatechange=null;}};}else{Event._add(window,'DOMContentLoaded',Event._pageInit,Event);if(isIE||isWebKit){t=setInterval(function(){if(/loaded|complete/.test(document.readyState)){clearInterval(t);Event._pageInit();}},10);}}}});Event=tinymce.dom.Event;Event._wait();tinymce.addUnload(Event._unload);})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.Element',{Element:function(id,s){var t=this,dom,el;s=s||{};t.id=id;t.dom=dom=s.dom||tinymce.DOM;t.settings=s;if(!tinymce.isIE)el=t.dom.get(t.id);each(['getPos','getRect','getParent','add','setStyle','getStyle','setStyles','setAttrib','setAttribs','getAttrib','addClass','removeClass','hasClass','getOuterHTML','setOuterHTML','remove','show','hide','isHidden','setHTML','get'],function(k){t[k]=function(){var a=arguments,o;if(tinymce.isOpera){a=[id];each(arguments,function(v){a.push(v);});}else Array.prototype.unshift.call(a,el||id);o=dom[k].apply(dom,a);t.update(k);return o;};});},on:function(n,f,s){return tinymce.dom.Event.add(this.id,n,f,s);},getXY:function(){return{x:parseInt(this.getStyle('left')),y:parseInt(this.getStyle('top'))};},getSize:function(){var n=this.dom.get(this.id);return{w:parseInt(this.getStyle('width')||n.clientWidth),h:parseInt(this.getStyle('height')||n.clientHeight)};},moveTo:function(x,y){this.setStyles({left:x,top:y});},moveBy:function(x,y){var p=this.getXY();this.moveTo(p.x+x,p.y+y);},resizeTo:function(w,h){this.setStyles({width:w,height:h});},resizeBy:function(w,h){var s=this.getSize();this.resizeTo(s.w+w,s.h+h);},update:function(k){var t=this,b,dom=t.dom;if(tinymce.isIE6&&t.settings.blocker){k=k||'';if(k.indexOf('get')===0||k.indexOf('has')===0||k.indexOf('is')===0)return;if(k=='remove'){dom.remove(t.blocker);return;}if(!t.blocker){t.blocker=dom.uniqueId();b=dom.add(t.settings.container||dom.getRoot(),'iframe',{id:t.blocker,style:'position:absolute;',frameBorder:0,src:'javascript:""'});dom.setStyle(b,'opacity',0);}else b=dom.get(t.blocker);dom.setStyle(b,'left',t.getStyle('left',1));dom.setStyle(b,'top',t.getStyle('top',1));dom.setStyle(b,'width',t.getStyle('width',1));dom.setStyle(b,'height',t.getStyle('height',1));dom.setStyle(b,'display',t.getStyle('display',1));dom.setStyle(b,'zIndex',parseInt(t.getStyle('zIndex',1)||0)-1);}}});})();(function(){var is=tinymce.is,isIE=tinymce.isIE,each=tinymce.each;tinymce.create('tinymce.dom.Selection',{Selection:function(dom,win,serializer){var t=this;t.dom=dom;t.win=win;t.serializer=serializer;tinymce.addUnload(t.destroy,t);},getContent:function(s){var t=this,r=t.getRng(),e=t.dom.create("body"),se=t.getSel(),wb,wa,n;s=s||{};wb=wa='';s.get=true;s.format=s.format||'html';if(s.format=='text')return t.isCollapsed()?'':(r.text||(se.toString?se.toString():''));if(r.cloneContents){n=r.cloneContents();if(n)e.appendChild(n);}else if(is(r.item)||is(r.htmlText))e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();if(/^\s/.test(e.innerHTML))wb=' ';if(/\s+$/.test(e.innerHTML))wa=' ';s.getInner=true;return t.isCollapsed()?'':wb+t.serializer.serialize(e,s)+wa;},setContent:function(h,s){var t=this,r=t.getRng(),d;s=s||{format:'html'};s.set=true;h=t.dom.processHTML(h);if(r.insertNode){d=t.win.document;if(tinymce.isGecko&&h.indexOf('<')==-1){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h+'<span id="__caret">_</span>'));t.select(t.dom.get('__caret'));t.getRng().deleteContents();return;}try{if(d.queryCommandEnabled('InsertHTML'))return d.execCommand('InsertHTML',false,h);}catch(ex){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h));}}else{if(r.item)r.item(0).outerHTML=h;else r.pasteHTML(h);}},getStart:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(1);e=r.parentElement();if(e.nodeName=='BODY')return e.firstChild;return e;}else{e=r.startContainer;if(e.nodeName=='BODY')return e.firstChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getEnd:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(0);e=r.parentElement();if(e.nodeName=='BODY')return e.lastChild;return e;}else{e=r.endContainer;if(e.nodeName=='BODY')return e.lastChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getBookmark:function(si){var t=this,r=t.getRng(),tr,sx,sy,vp=t.dom.getViewPort(t.win),e,sp,bp,le,c=-0xFFFFFF,s,ro=t.dom.getRoot(),wb=0,wa=0,nv;sx=vp.x;sy=vp.y;if(si=='simple')return{rng:r,scrollX:sx,scrollY:sy};if(isIE){if(r.item){e=r.item(0);each(t.dom.select(e.nodeName),function(n,i){if(e==n){sp=i;return false;}});return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy};}tr=t.dom.doc.body.createTextRange();tr.moveToElementText(ro);tr.collapse(true);bp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(true);sp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(false);le=Math.abs(tr.move('character',c))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy};}e=t.getNode();s=t.getSel();if(!s)return null;if(e&&e.nodeName=='IMG'){return{scrollX:sx,scrollY:sy};}function getPos(r,sn,en){var w=t.dom.doc.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+=tinymce.trim(n.nodeValue||'').length;}return null;};if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=getPos(ro,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};(s.anchorNode.nodeValue||'').replace(/^\s+/,function(a){wb=a.length;});return{start:Math.max(e.start+s.anchorOffset-wb,0),end:Math.max(e.end+s.focusOffset-wb,0),scrollX:sx,scrollY:sy,beg:s.anchorOffset-wb==0};}else{e=getPos(ro,r.startContainer,r.endContainer);(r.startContainer.nodeValue||'').replace(/^\s+/,function(a){wb=a.length;});(r.endContainer.nodeValue||'').replace(/^\s+/,function(a){wa=a.length;});if(!e)return{scrollX:sx,scrollY:sy};return{start:Math.max(e.start+r.startOffset-wb,0),end:Math.max(e.end+r.endOffset-wa,0),scrollX:sx,scrollY:sy,beg:r.startOffset-wb==0};}},moveToBookmark:function(b){var t=this,r=t.getRng(),s=t.getSel(),ro=t.dom.getRoot(),sd,nvl,nv;function getPos(r,sp,ep){var w=t.dom.doc.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={},o,v,wa,wb;while((n=w.nextNode())!=null){wa=wb=0;nv=n.nodeValue||'';nv.replace(/^\s+[^\s]/,function(a){wb=a.length-1;});nv.replace(/[^\s]\s+$/,function(a){wa=a.length-1;});nvl=tinymce.trim(nv).length;p+=nvl;if(p>=sp&&!d.startNode){o=sp-(p-nvl);if(b.beg&&o>=nvl)continue;d.startNode=n;d.startOffset=o+wb;}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-nvl)+wb;return d;}}return null;};if(!b)return false;t.win.scrollTo(b.scrollX,b.scrollY);if(isIE){if(r=b.rng){try{r.select();}catch(ex){}return true;}t.win.focus();if(b.tag){r=ro.createControlRange();each(t.dom.select(b.tag),function(n,i){if(i==b.index)r.addElement(n);});}else{try{if(b.start<0)return true;r=s.createRange();r.moveToElementText(ro);r.collapse(true);r.moveStart('character',b.start);r.moveEnd('character',b.length);}catch(ex2){return true;}}try{r.select();}catch(ex){}return true;}if(!s)return false;if(b.rng){s.removeAllRanges();s.addRange(b.rng);}else{if(is(b.start)&&is(b.end)){try{sd=getPos(ro,b.start,b.end);if(sd){r=t.dom.doc.createRange();r.setStart(sd.startNode,sd.startOffset);r.setEnd(sd.endNode,sd.endOffset);s.removeAllRanges();s.addRange(r);}if(!tinymce.isOpera)t.win.focus();}catch(ex){}}}},select:function(n,c){var t=this,r=t.getRng(),s=t.getSel(),b,fn,ln,d=t.win.document;function first(n){return n?d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false).nextNode():null;};function last(n){var c,o,w;if(!n)return null;w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(c=w.nextNode())o=c;return o;};if(isIE){try{b=d.body;if(/^(IMG|TABLE)$/.test(n.nodeName)){r=b.createControlRange();r.addElement(n);}else{r=b.createTextRange();r.moveToElementText(n);}r.select();}catch(ex){}}else{if(c){fn=first(n);ln=last(n);if(fn&&ln){r=d.createRange();r.setStart(fn,0);r.setEnd(ln,ln.nodeValue.length);}else r.selectNode(n);}else r.selectNode(n);t.setRng(r);}return n;},isCollapsed:function(){var t=this,r=t.getRng(),s=t.getSel();if(!r||r.item)return false;return!s||r.boundingWidth==0||s.isCollapsed;},collapse:function(b){var t=this,r=t.getRng(),n;if(r.item){n=r.item(0);r=this.win.document.body.createTextRange();r.moveToElementText(n);}r.collapse(!!b);t.setRng(r);},getSel:function(){var t=this,w=this.win;return w.getSelection?w.getSelection():w.document.selection;},getRng:function(){var t=this,s=t.getSel(),r;try{if(s)r=s.rangeCount>0?s.getRangeAt(0):(s.createRange?s.createRange():t.win.document.createRange());}catch(ex){}if(!r)r=isIE?t.win.document.body.createTextRange():t.win.document.createRange();return r;},setRng:function(r){var s;if(!isIE){s=this.getSel();if(s){s.removeAllRanges();s.addRange(r);}}else{try{r.select();}catch(ex){}}},setNode:function(n){var t=this;t.setContent(t.dom.getOuterHTML(n));return n;},getNode:function(){var t=this,r=t.getRng(),s=t.getSel(),e;if(!isIE){if(!r)return t.dom.getRoot();e=r.commonAncestorContainer;if(!r.collapsed){if(r.startContainer==r.endContainer||(tinymce.isWebKit&&r.startContainer==r.endContainer.parentNode)){if(r.startOffset-r.endOffset<2||tinymce.isWebKit){if(r.startContainer.hasChildNodes())e=r.startContainer.childNodes[r.startOffset];}}}return t.dom.getParent(e,function(n){return n.nodeType==1;});}return r.item?r.item(0):r.parentElement();},destroy:function(s){var t=this;t.win=null;if(!s)tinymce.removeUnload(t.destroy);}});})();(function(){tinymce.create('tinymce.dom.XMLWriter',{node:null,XMLWriter:function(s){function getXML(){var i=document.implementation;if(!i||!i.createDocument){try{return new ActiveXObject('MSXML2.DOMDocument');}catch(ex){}try{return new ActiveXObject('Microsoft.XmlDom');}catch(ex){}}else return i.createDocument('','',null);};this.doc=getXML();this.valid=tinymce.isOpera||tinymce.isWebKit;this.reset();},reset:function(){var t=this,d=t.doc;if(d.firstChild)d.removeChild(d.firstChild);t.node=d.appendChild(d.createElement("html"));},writeStartElement:function(n){var t=this;t.node=t.node.appendChild(t.doc.createElement(n));},writeAttribute:function(n,v){if(this.valid)v=v.replace(/>/g,'%MCGT%');this.node.setAttribute(n,v);},writeEndElement:function(){this.node=this.node.parentNode;},writeFullEndElement:function(){var t=this,n=t.node;n.appendChild(t.doc.createTextNode(""));t.node=n.parentNode;},writeText:function(v){if(this.valid)v=v.replace(/>/g,'%MCGT%');this.node.appendChild(this.doc.createTextNode(v));},writeCDATA:function(v){this.node.appendChild(this.doc.createCDATA(v));},writeComment:function(v){this.node.appendChild(this.doc.createComment(v));},getContent:function(){var h;h=this.doc.xml||new XMLSerializer().serializeToString(this.doc);h=h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,'');h=h.replace(/ ?\/>/g,' />');if(this.valid)h=h.replace(/\%MCGT%/g,'&gt;');return h;}});})();(function(){tinymce.create('tinymce.dom.StringWriter',{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(s){this.settings=tinymce.extend({indent_char:' ',indentation:1},s);this.reset();},reset:function(){this.indent='';this.str="";this.tags=[];this.count=0;},writeStartElement:function(n){this._writeAttributesEnd();this.writeRaw('<'+n);this.tags.push(n);this.inAttr=true;this.count++;this.elementCount=this.count;},writeAttribute:function(n,v){var t=this;t.writeRaw(" "+t.encode(n)+'="'+t.encode(v)+'"');},writeEndElement:function(){var n;if(this.tags.length>0){n=this.tags.pop();if(this._writeAttributesEnd(1))this.writeRaw('</'+n+'>');if(this.settings.indentation>0)this.writeRaw('\n');}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw('</'+this.tags.pop()+'>');if(this.settings.indentation>0)this.writeRaw('\n');}},writeText:function(v){this._writeAttributesEnd();this.writeRaw(this.encode(v));this.count++;},writeCDATA:function(v){this._writeAttributesEnd();this.writeRaw('<![CDATA['+v+']]>');this.count++;},writeComment:function(v){this._writeAttributesEnd();this.writeRaw('<!-- '+v+'-->');this.count++;},writeRaw:function(v){this.str+=v;},encode:function(s){return s.replace(/[<>&"]/g,function(v){switch(v){case'<':return'&lt;';case'>':return'&gt;';case'&':return'&amp;';case'"':return'&quot;';}return v;});},getContent:function(){return this.str;},_writeAttributesEnd:function(s){if(!this.inAttr)return;this.inAttr=false;if(s&&this.elementCount==this.count){this.writeRaw(' />');return false;}this.writeRaw('>');return true;}});})();(function(){var extend=tinymce.extend,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher,isIE=tinymce.isIE,isGecko=tinymce.isGecko;function getIEAtts(n){var o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;};function wildcardToRE(s){return s.replace(/([?+*])/g,'.$1');};tinymce.create('tinymce.dom.Serializer',{Serializer:function(s){var t=this;t.key=0;t.onPreProcess=new Dispatcher(t);t.onPostProcess=new Dispatcher(t);if(tinymce.relaxedDomain&&tinymce.isGecko){t.writer=new tinymce.dom.StringWriter();}else{try{t.writer=new tinymce.dom.XMLWriter();}catch(ex){t.writer=new tinymce.dom.StringWriter();}}t.settings=s=extend({dom:tinymce.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(mce_|_moz_)/,closed:/(br|hr|input|meta|img|link|param)/,entity_encoding:'named',entities:'160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro',valid_elements:'*[*]',extended_valid_elements:0,valid_child_elements:0,invalid_elements:0,fix_table_elements:0,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,font_size_style_values:0,apply_source_formatting:0,indent_mode:'simple',indent_char:'\t',indent_levels:1,remove_linebreaks:1},s);t.dom=s.dom;if(s.fix_list_elements){t.onPreProcess.add(function(se,o){var nl,x,a=['ol','ul'],i,n,p,r=/^(OL|UL)$/,np;function prevNode(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;};for(x=0;x<a.length;x++){nl=t.dom.select(a[x],o.node);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=prevNode(n,'LI');if(!np){np=t.dom.create('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild);}else np.appendChild(n);}}}});}if(s.fix_table_elements){t.onPreProcess.add(function(se,o){each(t.dom.select('table',o.node),function(e){var pa=t.dom.getParent(e,'H1,H2,H3,H4,H5,H6,P'),pa2,n,tm,pl=[],i,ns;if(pa){pa2=pa.cloneNode(false);pl.push(e);for(n=e;n=n.parentNode;){pl.push(n);if(n==pa)break;}tm=pa2;for(i=pl.length-1;i>=0;i--){if(i==pl.length-1){while(ns=pl[i-1].nextSibling)tm.appendChild(ns.parentNode.removeChild(ns));}else{n=pl[i].cloneNode(false);if(i!=0){while(ns=pl[i-1].nextSibling)n.appendChild(ns.parentNode.removeChild(ns));}tm=tm.appendChild(n);}}e=t.dom.insertAfter(e.parentNode.removeChild(e),pa);t.dom.insertAfter(e,pa);t.dom.insertAfter(pa2,e);}});});}},setEntities:function(s){var t=this,a,i,l={},re='',v;if(t.entityLookup)return;a=s.split(',');for(i=0;i<a.length;i+=2){v=a[i];if(v==34||v==38||v==60||v==62)continue;l[String.fromCharCode(a[i])]=a[i+1];v=parseInt(a[i]).toString(16);re+='\\u'+'0000'.substring(v.length)+v;}if(!re){t.settings.entity_encoding='raw';return;}t.entitiesRE=new RegExp('['+re+']','g');t.entityLookup=l;},setValidChildRules:function(s){this.childRules=null;this.addValidChildRules(s);},addValidChildRules:function(s){var t=this,inst,intr,bloc;if(!s)return;inst='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';intr='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';bloc='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';each(s.split(','),function(s){var p=s.split(/\[|\]/),re;s='';each(p[1].split('|'),function(v){if(s)s+='|';switch(v){case'%itrans':v=intr;break;case'%itrans_na':v=intr.substring(2);break;case'%istrict':v=inst;break;case'%istrict_na':v=inst.substring(2);break;case'%btrans':v=bloc;break;case'%bstrict':v=bloc;break;}s+=v;});re=new RegExp('^('+s.toLowerCase()+')$','i');each(p[0].split('/'),function(s){t.childRules=t.childRules||{};t.childRules[s]=re;});});s='';each(t.childRules,function(v,k){if(s)s+='|';s+=k;});t.parentElementsRE=new RegExp('^('+s.toLowerCase()+')$','i');},setRules:function(s){var t=this;t._setup();t.rules={};t.wildRules=[];t.validElements={};return t.addRules(s);},addRules:function(s){var t=this,dr;if(!s)return;t._setup();each(s.split(','),function(s){var p=s.split(/\[|\]/),tn=p[0].split('/'),ra,at,wat,va=[];if(dr)at=tinymce.extend([],dr.attribs);if(p.length>1){each(p[1].split('|'),function(s){var ar={},i;at=at||[];s=s.replace(/::/g,'~');s=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s);s[2]=s[2].replace(/~/g,':');if(s[1]=='!'){ra=ra||[];ra.push(s[2]);}if(s[1]=='-'){for(i=0;i<at.length;i++){if(at[i].name==s[2]){at.splice(i,1);return;}}}switch(s[3]){case'=':ar.defaultVal=s[4]||'';break;case':':ar.forcedVal=s[4];break;case'<':ar.validVals=s[4].split('?');break;}if(/[*.?]/.test(s[2])){wat=wat||[];ar.nameRE=new RegExp('^'+wildcardToRE(s[2])+'$');wat.push(ar);}else{ar.name=s[2];at.push(ar);}va.push(s[2]);});}each(tn,function(s,i){var pr=s.charAt(0),x=1,ru={};if(dr){if(dr.noEmpty)ru.noEmpty=dr.noEmpty;if(dr.fullEnd)ru.fullEnd=dr.fullEnd;if(dr.padd)ru.padd=dr.padd;}switch(pr){case'-':ru.noEmpty=true;break;case'+':ru.fullEnd=true;break;case'#':ru.padd=true;break;default:x=0;}tn[i]=s=s.substring(x);t.validElements[s]=1;if(/[*.?]/.test(tn[0])){ru.nameRE=new RegExp('^'+wildcardToRE(tn[0])+'$');t.wildRules=t.wildRules||{};t.wildRules.push(ru);}else{ru.name=tn[0];if(tn[0]=='@')dr=ru;t.rules[s]=ru;}ru.attribs=at;if(ra)ru.requiredAttribs=ra;if(wat){s='';each(va,function(v){if(s)s+='|';s+='('+wildcardToRE(v)+')';});ru.validAttribsRE=new RegExp('^'+s.toLowerCase()+'$');ru.wildAttribs=wat;}});});s='';each(t.validElements,function(v,k){if(s)s+='|';if(k!='@')s+=k;});t.validElementsRE=new RegExp('^('+wildcardToRE(s.toLowerCase())+')$');},findRule:function(n){var t=this,rl=t.rules,i,r;t._setup();r=rl[n];if(r)return r;rl=t.wildRules;for(i=0;i<rl.length;i++){if(rl[i].nameRE.test(n))return rl[i];}return null;},findAttribRule:function(ru,n){var i,wa=ru.wildAttribs;for(i=0;i<wa.length;i++){if(wa[i].nameRE.test(n))return wa[i];}return null;},serialize:function(n,o){var h,t=this;t._setup();o=o||{};o.format=o.format||'html';t.processObj=o;n=n.cloneNode(true);t.key=''+(parseInt(t.key)+1);if(!o.no_events){o.node=n;t.onPreProcess.dispatch(t,o);}t.writer.reset();t._serializeNode(n,o.getInner);o.content=t.writer.getContent();if(!o.no_events)t.onPostProcess.dispatch(t,o);t._postProcess(o);o.node=null;return tinymce.trim(o.content);},_postProcess:function(o){var t=this,s=t.settings,h=o.content,sc=[],p,l;if(o.format=='html'){p=t._protect({content:h,patterns:[/(<script[^>]*>)(.*?)(<\/script>)/g,/(<style[^>]*>)(.*?)(<\/style>)/g,/(<pre[^>]*>)(.*?)(<\/pre>)/g]});h=p.content;if(s.entity_encoding!=='raw'){if(s.entity_encoding.indexOf('named')!=-1){t.setEntities(s.entities);l=t.entityLookup;h=h.replace(t.entitiesRE,function(a){var v;if(v=l[a])a='&'+v+';';return a;});}if(s.entity_encoding.indexOf('numeric')!=-1){h=h.replace(/[\u007E-\uFFFF]/g,function(a){return'&#'+a.charCodeAt(0)+';';});}}if(!o.set){h=h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,s.entity_encoding=='numeric'?'<p$1>&#160;</p>':'<p$1>&nbsp;</p>');if(s.remove_linebreaks){h=h.replace(/\r?\n|\r/g,' ');h=h.replace(/(<[^>]+>)\s+/g,'$1 ');h=h.replace(/\s+(<\/[^>]+>)/g,' $1');h=h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,'<$1 $2>');h=h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,'<$1>');h=h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,'</$1>');}if(s.apply_source_formatting&&s.indent_mode=='simple'){h=h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,'\n<$1$2$3>\n');h=h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,'\n<$1$2>');h=h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,'</$1>\n');h=h.replace(/\n\n/g,'\n');}}h=t._unprotect(h,p);if(s.entity_encoding=='raw')h=h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g,'<p$1>\u00a0</p>');}o.content=h;},_serializeNode:function(n,inn){var t=this,s=t.settings,w=t.writer,hc,el,cn,i,l,a,at,no,v,nn,ru,ar,iv;if(!s.node_filter||s.node_filter(n)){switch(n.nodeType){case 1:if(n.hasAttribute?n.hasAttribute('mce_bogus'):n.getAttribute('mce_bogus'))return;iv=false;hc=n.hasChildNodes();nn=n.getAttribute('mce_name')||n.nodeName.toLowerCase();if(isIE){if(n.scopeName!=='HTML'&&n.scopeName!=='html')nn=n.scopeName+':'+nn;}if(nn.indexOf('mce:')===0)nn=nn.substring(4);if(!t.validElementsRE.test(nn)||(t.invalidElementsRE&&t.invalidElementsRE.test(nn))||inn){iv=true;break;}if(isIE){if(s.fix_content_duplication){if(n.mce_serialized==t.key)return;n.mce_serialized=t.key;}if(nn.charAt(0)=='/')nn=nn.substring(1);}else if(isGecko){if(n.nodeName==='BR'&&n.getAttribute('type')=='_moz')return;}if(t.childRules){if(t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(nn)){iv=true;break;}}t.elementName=nn;}ru=t.findRule(nn);nn=ru.name||nn;if((!hc&&ru.noEmpty)||(isIE&&!nn)){iv=true;break;}if(ru.requiredAttribs){a=ru.requiredAttribs;for(i=a.length-1;i>=0;i--){if(this.dom.getAttrib(n,a[i])!=='')break;}if(i==-1){iv=true;break;}}w.writeStartElement(nn);if(ru.attribs){for(i=0,at=ru.attribs,l=at.length;i<l;i++){a=at[i];v=t._getAttrib(n,a);if(v!==null)w.writeAttribute(a.name,v);}}if(ru.validAttribsRE){at=isIE?getIEAtts(n):n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified){a=no.nodeName.toLowerCase();if(s.invalid_attrs.test(a)||!ru.validAttribsRE.test(a))continue;ar=t.findAttribRule(ru,a);v=t._getAttrib(n,ar,a);if(v!==null)w.writeAttribute(a,v);}}}if(!hc&&ru.padd)w.writeText('\u00a0');break;case 3:if(t.childRules&&t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(n.nodeName))return;}return w.writeText(n.nodeValue);case 4:return w.writeCDATA(n.nodeValue);case 8:return w.writeComment(n.nodeValue);}}else if(n.nodeType==1)hc=n.hasChildNodes();if(hc){cn=n.firstChild;while(cn){t._serializeNode(cn);t.elementName=nn;cn=cn.nextSibling;}}if(!iv){if(hc||!s.closed.test(nn))w.writeFullEndElement();else w.writeEndElement();}},_protect:function(o){o.items=o.items||[];function enc(s){return s.replace(/[\r\n\\]/g,function(c){if(c==='\n')return'\\n';else if(c==='\\')return'\\\\';return'\\r';});};function dec(s){return s.replace(/\\[\\rn]/g,function(c){if(c==='\\n')return'\n';else if(c==='\\\\')return'\\';return'\r';});};each(o.patterns,function(p){o.content=dec(enc(o.content).replace(p,function(x,a,b,c){o.items.push(dec(b));return a+'<!--mce:'+(o.items.length-1)+'-->'+c;}));});return o;},_unprotect:function(h,o){h=h.replace(/\<!--mce:([0-9]+)--\>/g,function(a,b){return o.items[parseInt(b)];});o.items=[];return h;},_setup:function(){var t=this,s=this.settings;if(t.done)return;t.done=1;t.setRules(s.valid_elements);t.addRules(s.extended_valid_elements);t.addValidChildRules(s.valid_child_elements);if(s.invalid_elements)t.invalidElementsRE=new RegExp('^('+wildcardToRE(s.invalid_elements.replace(',','|').toLowerCase())+')$');if(s.attrib_value_filter)t.attribValueFilter=s.attribValueFilter;},_getAttrib:function(n,a,na){var i,v;na=na||a.name;if(a.forcedVal&&(v=a.forcedVal)){if(v==='{$uid}')return this.dom.uniqueId();return v;}v=this.dom.getAttrib(n,na);switch(na){case'rowspan':case'colspan':if(v=='1')v='';break;}if(this.attribValueFilter)v=this.attribValueFilter(na,v,n);if(a.validVals){for(i=a.validVals.length-1;i>=0;i--){if(v==a.validVals[i])break;}if(i==-1)return null;}if(v===''&&typeof(a.defaultVal)!='undefined'){v=a.defaultVal;if(v==='{$uid}')return this.dom.uniqueId();return v;}else{if(na=='class'&&this.processObj.get)v=v.replace(/\s?mceItem\w+\s?/g,'');}if(v==='')return null;return v;}});})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.ScriptLoader',{ScriptLoader:function(s){this.settings=s||{};this.queue=[];this.lookup={};},isDone:function(u){return this.lookup[u]?this.lookup[u].state==2:0;},markDone:function(u){this.lookup[u]={state:2,url:u};},add:function(u,cb,s,pr){var t=this,lo=t.lookup,o;if(o=lo[u]){if(cb&&o.state==2)cb.call(s||this);return o;}o={state:0,url:u,func:cb,scope:s||this};if(pr)t.queue.unshift(o);else t.queue.push(o);lo[u]=o;return o;},load:function(u,cb,s){var t=this,o;if(o=t.lookup[u]){if(cb&&o.state==2)cb.call(s||t);return o;}function loadScript(u){if(tinymce.dom.Event.domLoaded||t.settings.strict_mode){tinymce.util.XHR.send({url:u,error:t.settings.error,async:false,success:function(co){t.eval(co);}});}else document.write('<script type="text/javascript" src="'+u+'"></script>');};if(!tinymce.is(u,'string')){each(u,function(u){loadScript(u);});if(cb)cb.call(s||t);}else{loadScript(u);if(cb)cb.call(s||t);}},loadQueue:function(cb,s){var t=this;if(!t.queueLoading){t.queueLoading=1;t.queueCallbacks=[];t.loadScripts(t.queue,function(){t.queueLoading=0;if(cb)cb.call(s||t);each(t.queueCallbacks,function(o){o.func.call(o.scope);});});}else if(cb)t.queueCallbacks.push({func:cb,scope:s||t});},eval:function(co){var w=window;if(!w.execScript){try{eval.call(w,co);}catch(ex){eval(co,w);}}else w.execScript(co);},loadScripts:function(sc,cb,s){var t=this,lo=t.lookup;function done(o){o.state=2;if(o.func)o.func.call(o.scope||t);};function allDone(){var l;l=sc.length;each(sc,function(o){o=lo[o.url];if(o.state===2){done(o);l--;}else load(o);});if(l===0&&cb){cb.call(s||t);cb=0;}};function load(o){if(o.state>0)return;o.state=1;tinymce.util.XHR.send({url:o.url,error:t.settings.error,success:function(co){t.eval(co);done(o);allDone();}});};each(sc,function(o){var u=o.url;if(!lo[u]){lo[u]=o;t.queue.push(o);}else o=lo[u];if(o.state>0)return;if(!tinymce.dom.Event.domLoaded&&!t.settings.strict_mode){var ix,ol='';if(cb||o.func){o.state=1;ix=tinymce.dom.ScriptLoader._addOnLoad(function(){done(o);allDone();});if(tinymce.isIE)ol=' onreadystatechange="';else ol=' onload="';ol+='tinymce.dom.ScriptLoader._onLoad(this,\''+u+'\','+ix+');"';}document.write('<script type="text/javascript" src="'+u+'"'+ol+'></script>');if(!o.func)done(o);}else load(o);});allDone();},'static':{_addOnLoad:function(f){var t=this;t._funcs=t._funcs||[];t._funcs.push(f);return t._funcs.length-1;},_onLoad:function(e,u,ix){if(!tinymce.isIE||e.readyState=='complete')this._funcs[ix].call(this);}}});tinymce.ScriptLoader=new tinymce.dom.ScriptLoader();})();(function(){var DOM=tinymce.DOM,is=tinymce.is;tinymce.create('tinymce.ui.Control',{Control:function(id,s){this.id=id;this.settings=s=s||{};this.rendered=false;this.onRender=new tinymce.util.Dispatcher(this);this.classPrefix='';this.scope=s.scope||this;this.disabled=0;this.active=0;},setDisabled:function(s){var e;if(s!=this.disabled){e=DOM.get(this.id);if(e&&this.settings.unavailable_prefix){if(s){this.prevTitle=e.title;e.title=this.settings.unavailable_prefix+": "+e.title;}else e.title=this.prevTitle;}this.setState('Disabled',s);this.setState('Enabled',!s);this.disabled=s;}},isDisabled:function(){return this.disabled;},setActive:function(s){if(s!=this.active){this.setState('Active',s);this.active=s;}},isActive:function(){return this.active;},setState:function(c,s){var n=DOM.get(this.id);c=this.classPrefix+c;if(s)DOM.addClass(n,c);else DOM.removeClass(n,c);},isRendered:function(){return this.rendered;},renderHTML:function(){},renderTo:function(n){DOM.setHTML(n,this.renderHTML());},postRender:function(){var t=this,b;if(is(t.disabled)){b=t.disabled;t.disabled=-1;t.setDisabled(b);}if(is(t.active)){b=t.active;t.active=-1;t.setActive(b);}},remove:function(){DOM.remove(this.id);this.destroy();},destroy:function(){tinymce.dom.Event.clear(this.id);}});})();tinymce.create('tinymce.ui.Container:tinymce.ui.Control',{Container:function(id,s){this.parent(id,s);this.controls=[];this.lookup={};},add:function(c){this.lookup[c.id]=c;this.controls.push(c);return c;},get:function(n){return this.lookup[n];}});tinymce.create('tinymce.ui.Separator:tinymce.ui.Control',{Separator:function(id,s){this.parent(id,s);this.classPrefix='mceSeparator';},renderHTML:function(){return tinymce.DOM.createHTML('span',{'class':this.classPrefix});}});(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control',{MenuItem:function(id,s){this.parent(id,s);this.classPrefix='mceMenuItem';},setSelected:function(s){this.setState('Selected',s);this.selected=s;},isSelected:function(){return this.selected;},postRender:function(){var t=this;t.parent();if(is(t.selected))t.setSelected(t.selected);}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem',{Menu:function(id,s){var t=this;t.parent(id,s);t.items={};t.collapsed=false;t.menuCount=0;t.onAddItem=new tinymce.util.Dispatcher(this);},expand:function(d){var t=this;if(d){walk(t,function(o){if(o.expand)o.expand();},'items',t);}t.collapsed=false;},collapse:function(d){var t=this;if(d){walk(t,function(o){if(o.collapse)o.collapse();},'items',t);}t.collapsed=true;},isCollapsed:function(){return this.collapsed;},add:function(o){if(!o.settings)o=new tinymce.ui.MenuItem(o.id||DOM.uniqueId(),o);this.onAddItem.dispatch(this,o);return this.items[o.id]=o;},addSeparator:function(){return this.add({separator:true});},addMenu:function(o){if(!o.collapse)o=this.createMenu(o);this.menuCount++;return this.add(o);},hasMenus:function(){return this.menuCount!==0;},remove:function(o){delete this.items[o.id];},removeAll:function(){var t=this;walk(t,function(o){if(o.removeAll)o.removeAll();else o.remove();o.destroy();},'items',t);t.items={};},createMenu:function(o){var m=new tinymce.ui.Menu(o.id||DOM.uniqueId(),o);m.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return m;}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,Event=tinymce.dom.Event,Element=tinymce.dom.Element;tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu',{DropMenu:function(id,s){s=s||{};s.container=s.container||DOM.doc.body;s.offset_x=s.offset_x||0;s.offset_y=s.offset_y||0;s.vp_offset_x=s.vp_offset_x||0;s.vp_offset_y=s.vp_offset_y||0;if(is(s.icons)&&!s.icons)s['class']+=' mceNoIcons';this.parent(id,s);this.onShowMenu=new tinymce.util.Dispatcher(this);this.onHideMenu=new tinymce.util.Dispatcher(this);this.classPrefix='mceMenu';this.fixIE=tinymce.isIE&&DOM.win.top!=DOM.win;},createMenu:function(s){var t=this,cs=t.settings,m;s.container=s.container||cs.container;s.parent=t;s.constrain=s.constrain||cs.constrain;s['class']=s['class']||cs['class'];s.vp_offset_x=s.vp_offset_x||cs.vp_offset_x;s.vp_offset_y=s.vp_offset_y||cs.vp_offset_y;m=new tinymce.ui.DropMenu(s.id||DOM.uniqueId(),s);m.onAddItem.add(t.onAddItem.dispatch,t.onAddItem);return m;},update:function(){var t=this,s=t.settings,tb=DOM.get('menu_'+t.id+'_tbl'),co=DOM.get('menu_'+t.id+'_co'),tw,th;tw=s.max_width?Math.min(tb.clientWidth,s.max_width):tb.clientWidth;th=s.max_height?Math.min(tb.clientHeight,s.max_height):tb.clientHeight;if(!DOM.boxModel)t.element.setStyles({width:tw+2,height:th+2});else t.element.setStyles({width:tw,height:th});if(s.max_width)DOM.setStyle(co,'width',tw);if(s.max_height){DOM.setStyle(co,'height',th);if(tb.clientHeight<s.max_height)DOM.setStyle(co,'overflow','hidden');}},showMenu:function(x,y,px){var t=this,s=t.settings,co,vp=DOM.getViewPort(),w,h,mx,my,ot=2,dm,tb,cp=t.classPrefix;t.collapse(1);if(t.isMenuVisible)return;if(!t.rendered){co=DOM.add(t.settings.container,t.renderNode());each(t.items,function(o){o.postRender();});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});}else co=DOM.get('menu_'+t.id);if(!tinymce.isOpera)DOM.setStyles(co,{left:-0xFFFF,top:-0xFFFF});DOM.show(co);t.update();x+=s.offset_x||0;y+=s.offset_y||0;vp.w-=4;vp.h-=4;if(s.constrain){w=co.clientWidth-ot;h=co.clientHeight-ot;mx=vp.x+vp.w;my=vp.y+vp.h;if((x+s.vp_offset_x+w)>mx)x=px?px-w:Math.max(0,(mx-s.vp_offset_x)-w);if((y+s.vp_offset_y+h)>my)y=Math.max(0,(my-s.vp_offset_y)-h);}DOM.setStyles(co,{left:x,top:y});t.element.update();t.isMenuVisible=1;t.mouseClickFunc=Event.add(co,t.fixIE?'mousedown':'click',function(e){var m;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))&&!DOM.hasClass(e,cp+'ItemSub')){m=t.items[e.id];if(m.isDisabled())return;dm=t;while(dm){if(dm.hideMenu)dm.hideMenu();dm=dm.settings.parent;}if(m.settings.onclick)m.settings.onclick(e);return Event.cancel(e);}});if(t.hasMenus()){t.mouseOverFunc=Event.add(co,'mouseover',function(e){var m,r,mi;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))){m=t.items[e.id];if(t.lastMenu)t.lastMenu.collapse(1);if(m.isDisabled())return;if(e&&DOM.hasClass(e,cp+'ItemSub')){r=DOM.getRect(e);m.showMenu((r.x+r.w-ot),r.y-ot,r.x);t.lastMenu=m;DOM.addClass(DOM.get(m.id).firstChild,cp+'ItemActive');}}});}t.onShowMenu.dispatch(t);if(s.keyboard_focus){Event.add(co,'keydown',t._keyHandler,t);DOM.select('a','menu_'+t.id)[0].focus();}},hideMenu:function(c){var t=this,co=DOM.get('menu_'+t.id),e;if(!t.isMenuVisible)return;Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,t.fixIE?'mousedown':'click',t.mouseClickFunc);Event.remove(co,'keydown',t._keyHandler);DOM.hide(co);t.isMenuVisible=0;if(!c)t.collapse(1);if(t.element)t.element.hide();if(e=DOM.get(t.id))DOM.removeClass(e.firstChild,t.classPrefix+'ItemActive');t.onHideMenu.dispatch(t);},add:function(o){var t=this,co;o=t.parent(o);if(t.isRendered&&(co=DOM.get('menu_'+t.id)))t._add(DOM.select('tbody',co)[0],o);return o;},collapse:function(d){this.parent(d);this.hideMenu(1);},remove:function(o){DOM.remove(o.id);this.destroy();return this.parent(o);},destroy:function(){var t=this,co=DOM.get('menu_'+t.id);Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,'click',t.mouseClickFunc);if(t.element)t.element.remove();DOM.remove(co);},renderNode:function(){var t=this,s=t.settings,n,tb,co,w;w=DOM.create('div',{id:'menu_'+t.id,'class':s['class'],'style':'position:absolute;left:0;top:0;z-index:200000'});co=DOM.add(w,'div',{id:'menu_'+t.id+'_co','class':t.classPrefix+(s['class']?' '+s['class']:'')});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});if(s.menu_line)DOM.add(co,'span',{'class':t.classPrefix+'Line'});n=DOM.add(co,'table',{id:'menu_'+t.id+'_tbl',border:0,cellPadding:0,cellSpacing:0});tb=DOM.add(n,'tbody');each(t.items,function(o){t._add(tb,o);});t.rendered=true;return w;},_keyHandler:function(e){if(e.keyCode==27)this.hideMenu();},_add:function(tb,o){var n,s=o.settings,a,ro,it,cp=this.classPrefix;if(s.separator){ro=DOM.add(tb,'tr',{id:o.id,'class':cp+'ItemSeparator'});DOM.add(ro,'td',{'class':cp+'ItemSeparator'});if(n=ro.previousSibling)DOM.addClass(n,'mceLast');return;}n=ro=DOM.add(tb,'tr',{id:o.id,'class':cp+'Item '+cp+'ItemEnabled'});n=it=DOM.add(n,'td');n=a=DOM.add(n,'a',{href:'javascript:;',onclick:"return false;",onmousedown:'return false;'});DOM.addClass(it,s['class']);DOM.add(n,'span',{'class':'mceIcon'+(s.icon?' mce_'+s.icon:'')});n=DOM.add(n,s.element||'span',{'class':'mceText',title:o.settings.title},o.settings.title);if(o.settings.style)DOM.setAttrib(n,'style',o.settings.style);if(tb.childNodes.length==1)DOM.addClass(ro,'mceFirst');if((n=ro.previousSibling)&&DOM.hasClass(n,cp+'ItemSeparator'))DOM.addClass(ro,'mceFirst');if(o.collapse)DOM.addClass(ro,cp+'ItemSub');if(n=ro.previousSibling)DOM.removeClass(n,'mceLast');DOM.addClass(ro,'mceLast');}});})();(function(){var DOM=tinymce.DOM;tinymce.create('tinymce.ui.Button:tinymce.ui.Control',{Button:function(id,s){this.parent(id,s);this.classPrefix='mceButton';},renderHTML:function(){var cp=this.classPrefix,s=this.settings,h='<a id="'+this.id+'" href="javascript:;" class="'+cp+' '+cp+'Enabled '+s['class']+'" onmousedown="return false;" onclick="return false;" title="'+DOM.encode(s.title)+'">';if(s.image)h+='<img class="mceIcon" src="'+s.image+'" /></a>';else h+='<span class="mceIcon '+s['class']+'"></span></a>';return h;},postRender:function(){var t=this,s=t.settings;tinymce.dom.Event.add(t.id,'click',function(e){if(!t.isDisabled())return s.onclick.call(s.scope,e);});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control',{ListBox:function(id,s){var t=this;t.parent(id,s);t.items=[];t.onChange=new Dispatcher(t);t.onPostRender=new Dispatcher(t);t.onAdd=new Dispatcher(t);t.onRenderMenu=new tinymce.util.Dispatcher(this);t.classPrefix='mceListBox';},select:function(v){var t=this,e,fv;if(v!=t.selectedValue){e=DOM.get(t.id+'_text');t.selectedValue=v;each(t.items,function(o){if(o.value==v){DOM.setHTML(e,DOM.encode(o.title));fv=1;return false;}});if(!fv){DOM.setHTML(e,DOM.encode(t.settings.title));DOM.addClass(e,'mceTitle');e=0;return;}else DOM.removeClass(e,'mceTitle');}e=0;},add:function(n,v,o){var t=this;o=o||{};o=tinymce.extend(o,{title:n,value:v});t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return this.items.length;},renderHTML:function(){var h='',t=this,s=t.settings,cp=t.classPrefix;h='<table id="'+t.id+'" cellpadding="0" cellspacing="0" class="'+cp+' '+cp+'Enabled'+(s['class']?(' '+s['class']):'')+'"><tbody><tr>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_text',href:'javascript:;','class':'mceText',onclick:"return false;",onmousedown:'return false;'},DOM.encode(t.settings.title))+'</td>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',tabindex:-1,href:'javascript:;','class':'mceOpen',onclick:"return false;",onmousedown:'return false;'},'<span></span>')+'</td>';h+='</tr></tbody></table>';return h;},showMenu:function(){var t=this,p1,p2,e=DOM.get(this.id),m;if(t.isDisabled()||t.items.length==0)return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(this.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.keyboard_focus=t._focused;if(t.oldID)m.items[t.oldID].setSelected(0);each(t.items,function(o){if(o.value===t.selectedValue){m.items[o.id].setSelected(1);t.oldID=o.id;}});m.showMenu(0,e.clientHeight);Event.add(DOM.doc,'mousedown',t.hideMenu,t);DOM.addClass(t.id,t.classPrefix+'Selected');},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){DOM.removeClass(t.id,t.classPrefix+'Selected');Event.remove(DOM.doc,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':t.classPrefix+'Menu mceNoIcons',max_width:150,max_height:150});m.onHideMenu.add(t.hideMenu,t);m.add({title:t.settings.title,'class':'mceMenuItemTitle'}).setDisabled(1);each(t.items,function(o){o.id=DOM.uniqueId();o.onclick=function(){if(t.settings.onselect(o.value)!==false)t.select(o.value);};m.add(o);});t.onRenderMenu.dispatch(t,m);t.menu=m;},postRender:function(){var t=this,cp=t.classPrefix;Event.add(t.id,'click',t.showMenu,t);Event.add(t.id+'_text','focus',function(){t._focused=1;});Event.add(t.id+'_text','blur',function(){t._focused=0;});if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,cp+'Disabled'))DOM.addClass(t.id,cp+'Hover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,cp+'Disabled'))DOM.removeClass(t.id,cp+'Hover');});}t.onPostRender.dispatch(t,DOM.get(t.id));},destroy:function(){this.parent();Event.clear(this.id+'_text');}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox',{NativeListBox:function(id,s){this.parent(id,s);this.classPrefix='mceNativeListBox';},setDisabled:function(s){DOM.get(this.id).disabled=s;},isDisabled:function(){return DOM.get(this.id).disabled;},select:function(v){var e=DOM.get(this.id),ol=e.options;v=''+(v||'');e.selectedIndex=0;each(ol,function(o,i){if(o.value==v){e.selectedIndex=i;return false;}});},add:function(n,v,a){var o,t=this;a=a||{};a.value=v;if(t.isRendered())DOM.add(DOM.get(this.id),'option',a,n);o={title:n,value:v,attribs:a};t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return DOM.get(this.id).options.length-1;},renderHTML:function(){var h,t=this;h=DOM.createHTML('option',{value:''},'-- '+t.settings.title+' --');each(t.items,function(it){h+=DOM.createHTML('option',{value:it.value},it.title);});h=DOM.createHTML('select',{id:t.id,'class':'mceNativeListBox'},h);return h;},postRender:function(){var t=this,ch;t.rendered=true;function onChange(e){var v=e.target.options[e.target.selectedIndex].value;t.onChange.dispatch(t,v);if(t.settings.onselect)t.settings.onselect(v);};Event.add(t.id,'change',onChange);Event.add(t.id,'keydown',function(e){var bf;Event.remove(t.id,'change',ch);bf=Event.add(t.id,'blur',function(){Event.add(t.id,'change',onChange);Event.remove(t.id,'blur',bf);});if(e.keyCode==13||e.keyCode==32){onChange(e);return Event.cancel(e);}});t.onPostRender.dispatch(t,DOM.get(t.id));}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button',{MenuButton:function(id,s){this.parent(id,s);this.onRenderMenu=new tinymce.util.Dispatcher(this);s.menu_container=s.menu_container||DOM.doc.body;},showMenu:function(){var t=this,p1,p2,e=DOM.get(t.id),m;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(t.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.vp_offset_x=p2.x;m.settings.vp_offset_y=p2.y;m.settings.keyboard_focus=t._focused;m.showMenu(0,e.clientHeight);Event.add(DOM.doc,'mousedown',t.hideMenu,t);t.setState('Selected',1);},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':this.classPrefix+'Menu',icons:t.settings.icons});m.onHideMenu.add(t.hideMenu,t);t.onRenderMenu.dispatch(t,m);t.menu=m;},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){t.setState('Selected',0);Event.remove(DOM.doc,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},postRender:function(){var t=this,s=t.settings;Event.add(t.id,'click',function(){if(!t.isDisabled()){if(s.onclick)s.onclick(t.value);t.showMenu();}});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton',{SplitButton:function(id,s){this.parent(id,s);this.classPrefix='mceSplitButton';},renderHTML:function(){var h,t=this,s=t.settings,h1;h='<tbody><tr>';if(s.image)h1=DOM.createHTML('img ',{src:s.image,'class':'mceAction '+s['class']});else h1=DOM.createHTML('span',{'class':'mceAction '+s['class']},'');h+='<td>'+DOM.createHTML('a',{id:t.id+'_action',href:'javascript:;','class':'mceAction '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h1=DOM.createHTML('span',{'class':'mceOpen '+s['class']});h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',href:'javascript:;','class':'mceOpen '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h+='</tr></tbody>';return DOM.createHTML('table',{id:t.id,'class':'mceSplitButton mceSplitButtonEnabled '+s['class'],cellpadding:'0',cellspacing:'0',onmousedown:'return false;',title:s.title},h);},postRender:function(){var t=this,s=t.settings;if(s.onclick){Event.add(t.id+'_action','click',function(){if(!t.isDisabled())s.onclick(t.value);});}Event.add(t.id+'_open','click',t.showMenu,t);Event.add(t.id+'_open','focus',function(){t._focused=1;});Event.add(t.id+'_open','blur',function(){t._focused=0;});if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.addClass(t.id,'mceSplitButtonHover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.removeClass(t.id,'mceSplitButtonHover');});}},destroy:function(){this.parent();Event.clear(this.id+'_action');Event.clear(this.id+'_open');}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,is=tinymce.is,each=tinymce.each;tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton',{ColorSplitButton:function(id,s){var t=this;t.parent(id,s);t.settings=s=tinymce.extend({colors:'000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF',grid_width:8,default_color:'#888888'},t.settings);t.value=s.default_color;},showMenu:function(){var t=this,r,p,e,p2;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}e=DOM.get(t.id);DOM.show(t.id+'_menu');DOM.addClass(e,'mceSplitButtonSelected');p2=DOM.getPos(e);DOM.setStyles(t.id+'_menu',{left:p2.x,top:p2.y+e.clientHeight,zIndex:200000});e=0;Event.add(DOM.doc,'mousedown',t.hideMenu,t);if(t._focused){t._keyHandler=Event.add(t.id+'_menu','keydown',function(e){if(e.keyCode==27)t.hideMenu();});DOM.select('a',t.id+'_menu')[0].focus();}},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceSplitButtonMenu');})){DOM.removeClass(t.id,'mceSplitButtonSelected');Event.remove(DOM.doc,'mousedown',t.hideMenu,t);Event.remove(t.id+'_menu','keydown',t._keyHandler);DOM.hide(t.id+'_menu');}},renderMenu:function(){var t=this,m,i=0,s=t.settings,n,tb,tr,w;w=DOM.add(s.menu_container,'div',{id:t.id+'_menu','class':s['menu_class']+' '+s['class'],style:'position:absolute;left:0;top:-1000px;'});m=DOM.add(w,'div',{'class':s['class']+' mceSplitButtonMenu'});DOM.add(m,'span',{'class':'mceMenuLine'});n=DOM.add(m,'table',{'class':'mceColorSplitMenu'});tb=DOM.add(n,'tbody');i=0;each(is(s.colors,'array')?s.colors:s.colors.split(','),function(c){c=c.replace(/^#/,'');if(!i--){tr=DOM.add(tb,'tr');i=s.grid_width-1;}n=DOM.add(tr,'td');n=DOM.add(n,'a',{href:'javascript:;',style:{backgroundColor:'#'+c},mce_color:'#'+c});});if(s.more_colors_func){n=DOM.add(tb,'tr');n=DOM.add(n,'td',{colspan:s.grid_width,'class':'mceMoreColors'});n=DOM.add(n,'a',{id:t.id+'_more',href:'javascript:;',onclick:'return false;','class':'mceMoreColors'},s.more_colors_title);Event.add(n,'click',function(e){s.more_colors_func.call(s.more_colors_scope||this);return Event.cancel(e);});}DOM.addClass(m,'mceColorSplitMenu');Event.add(t.id+'_menu','click',function(e){var c;e=e.target;if(e.nodeName=='A'&&(c=e.getAttribute('mce_color')))t.setColor(c);});return w;},setColor:function(c){var t=this;DOM.setStyle(t.id+'_preview','backgroundColor',c);t.value=c;t.hideMenu();t.settings.onselect(c);},postRender:function(){var t=this,id=t.id;t.parent();DOM.add(id+'_action','div',{id:id+'_preview','class':'mceColorPreview'});},destroy:function(){this.parent();Event.clear(this.id+'_menu');Event.clear(this.id+'_more');DOM.remove(this.id+'_menu');}});})();tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container',{renderHTML:function(){var t=this,h='',c,co,dom=tinymce.DOM,s=t.settings,i,pr,nx,cl;cl=t.controls;for(i=0;i<cl.length;i++){co=cl[i];pr=cl[i-1];nx=cl[i+1];if(i===0){c='mceToolbarStart';if(co.Button)c+=' mceToolbarStartButton';else if(co.SplitButton)c+=' mceToolbarStartSplitButton';else if(co.ListBox)c+=' mceToolbarStartListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));}if(pr&&co.ListBox){if(pr.Button||pr.SplitButton)h+=dom.createHTML('td',{'class':'mceToolbarEnd'},dom.createHTML('span',null,'<!-- IE -->'));}if(dom.stdMode)h+='<td style="position: relative">'+co.renderHTML()+'</td>';else h+='<td>'+co.renderHTML()+'</td>';if(nx&&co.ListBox){if(nx.Button||nx.SplitButton)h+=dom.createHTML('td',{'class':'mceToolbarStart'},dom.createHTML('span',null,'<!-- IE -->'));}}c='mceToolbarEnd';if(co.Button)c+=' mceToolbarEndButton';else if(co.SplitButton)c+=' mceToolbarEndSplitButton';else if(co.ListBox)c+=' mceToolbarEndListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));return dom.createHTML('table',{id:t.id,'class':'mceToolbar'+(s['class']?' '+s['class']:''),cellpadding:'0',cellspacing:'0',align:t.settings.align||''},'<tbody><tr>'+h+'</tr></tbody>');}});(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each;tinymce.create('tinymce.AddOnManager',{items:[],urls:{},lookup:{},onAdd:new Dispatcher(this),get:function(n){return this.lookup[n];},requireLangPack:function(n){var u,s;if(tinymce.EditorManager.settings){u=this.urls[n]+'/langs/'+tinymce.EditorManager.settings.language+'.js';s=tinymce.EditorManager.settings;if(s){if(!tinymce.dom.Event.domLoaded&&!s.strict_mode)tinymce.ScriptLoader.load(u);else tinymce.ScriptLoader.add(u);}}},add:function(id,o){this.items.push(o);this.lookup[id]=o;this.onAdd.dispatch(this,id,o);return o;},load:function(n,u,cb,s){var t=this;if(t.urls[n])return;if(u.indexOf('/')!=0&&u.indexOf('://')==-1)u=tinymce.baseURL+'/'+u;t.urls[n]=u.substring(0,u.lastIndexOf('/'));tinymce.ScriptLoader.add(u,cb,s);}});tinymce.PluginManager=new tinymce.AddOnManager();tinymce.ThemeManager=new tinymce.AddOnManager();}());(function(){var each=tinymce.each,extend=tinymce.extend,DOM=tinymce.DOM,Event=tinymce.dom.Event,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,explode=tinymce.explode;tinymce.create('static tinymce.EditorManager',{editors:{},i18n:{},activeEditor:null,preInit:function(){var t=this,lo=window.location;tinymce.documentBaseURL=lo.href.replace(/[\?#].*$/,'').replace(/[\/\\][^\/]+$/,'');if(!/[\/\\]$/.test(tinymce.documentBaseURL))tinymce.documentBaseURL+='/';tinymce.baseURL=new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);tinymce.EditorManager.baseURI=new tinymce.util.URI(tinymce.baseURL);if(tinymce.EditorManager.baseURI.host!=lo.hostname&&lo.hostname)document.domain=tinymce.relaxedDomain=lo.hostname.replace(/.*\.(.+\..+)$/,'$1');t.onBeforeUnload=new tinymce.util.Dispatcher(t);Event.add(window,'beforeunload',function(e){t.onBeforeUnload.dispatch(t,e);});},init:function(s){var t=this,pl,sl=tinymce.ScriptLoader,c;function execCallback(se,n,s){var f=se[n];if(!f)return;if(tinymce.is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);}return f.apply(s||this,Array.prototype.slice.call(arguments,2));};s=extend({theme:"simple",language:"en",strict_loading_mode:document.contentType=='application/xhtml+xml'},s);t.settings=s;if(!Event.domLoaded&&!s.strict_loading_mode){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme&&s.theme.charAt(0)!='-'&&!ThemeManager.urls[s.theme])ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');if(s.plugins){pl=explode(s.plugins);if(tinymce.inArray(pl,'compat2x')!=-1)PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');each(pl,function(v){if(v&&v.charAt(0)!='-'&&!PluginManager.urls[v]){if(!tinymce.isWebKit&&v=='safari')return;PluginManager.load(v,'plugins/'+v+'/editor_plugin'+tinymce.suffix+'.js');}});}sl.loadQueue();}Event.add(document,'init',function(){var l,co;execCallback(s,'onpageload');if(s.browsers){l=false;each(explode(s.browsers),function(v){switch(v){case'ie':case'msie':if(tinymce.isIE)l=true;break;case'gecko':if(tinymce.isGecko)l=true;break;case'safari':case'webkit':if(tinymce.isWebKit)l=true;break;case'opera':if(tinymce.isOpera)l=true;break;}});if(!l)return;}switch(s.mode){case"exact":l=s.elements||'';if(l.length>0){each(explode(l),function(v){if(DOM.get(v))new tinymce.Editor(v,s).render(1);else{c=0;each(document.forms,function(f){each(f.elements,function(e){if(e.name===v){v='mce_editor_'+c;DOM.setAttrib(e,'id',v);new tinymce.Editor(v,s).render(1);}});});}});}break;case"textareas":case"specific_textareas":function hasClass(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className);};each(DOM.select('textarea'),function(v){if(s.editor_deselector&&hasClass(v,s.editor_deselector))return;if(!s.editor_selector||hasClass(v,s.editor_selector)){v.id=v.id||v.name;if(!v.id||t.get(v.id))v.id=DOM.uniqueId();new tinymce.Editor(v.id,s).render(1);}});break;}if(s.oninit){l=co=0;each(t.editors,function(ed){co++;if(!ed.initialized){ed.onInit.add(function(){l++;if(l==co)execCallback(s,'oninit');});}else l++;if(l==co)execCallback(s,'oninit');});}});},get:function(id){return this.editors[id];},getInstanceById:function(id){return this.get(id);},add:function(e){this.editors[e.id]=e;this._setActive(e);return e;},remove:function(e){var t=this;if(!t.editors[e.id])return null;delete t.editors[e.id];if(t.activeEditor==e){each(t.editors,function(e){t._setActive(e);return false;});}e.destroy();return e;},execCommand:function(c,u,v){var t=this,ed=t.get(v),w;switch(c){case"mceFocus":ed.focus();return true;case"mceAddEditor":case"mceAddControl":new tinymce.Editor(v,t.settings).render();return true;case"mceAddFrameControl":w=v.window;w.tinyMCE=tinyMCE;w.tinymce=tinymce;tinymce.DOM.doc=w.document;tinymce.DOM.win=w;ed=new tinymce.Editor(v.element_id,v);ed.render();if(tinymce.isIE){function clr(){ed.destroy();w.detachEvent('onunload',clr);w=w.tinyMCE=w.tinymce=null;};w.attachEvent('onunload',clr);}v.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":ed.remove();return true;case'mceToggleEditor':if(!ed){t.execCommand('mceAddControl',0,v);return true;}if(ed.isHidden())ed.show();else ed.hide();return true;}if(t.activeEditor)return t.activeEditor.execCommand(c,u,v);return false;},execInstanceCommand:function(id,c,u,v){var ed=this.get(id);if(ed)return ed.execCommand(c,u,v);return false;},triggerSave:function(){each(this.editors,function(e){e.save();});},addI18n:function(p,o){var lo,i18n=this.i18n;if(!tinymce.is(p,'string')){each(p,function(o,lc){each(o,function(o,g){each(o,function(o,k){if(g==='common')i18n[lc+'.'+k]=o;else i18n[lc+'.'+g+'.'+k]=o;});});});}else{each(o,function(o,k){i18n[p+'.'+k]=o;});}},_setActive:function(e){this.selectedInstance=this.activeEditor=e;}});tinymce.EditorManager.preInit();})();var tinyMCE=window.tinyMCE=tinymce.EditorManager;(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,Dispatcher=tinymce.util.Dispatcher;var each=tinymce.each,isGecko=tinymce.isGecko,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit;var is=tinymce.is,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,EditorManager=tinymce.EditorManager;var inArray=tinymce.inArray,grep=tinymce.grep,explode=tinymce.explode;tinymce.create('tinymce.Editor',{Editor:function(id,s){var t=this;t.id=t.editorId=id;t.execCommands={};t.queryStateCommands={};t.queryValueCommands={};t.plugins={};each(['onPreInit','onBeforeRenderUI','onPostRender','onInit','onRemove','onActivate','onDeactivate','onClick','onEvent','onMouseUp','onMouseDown','onDblClick','onKeyDown','onKeyUp','onKeyPress','onContextMenu','onSubmit','onReset','onPaste','onPreProcess','onPostProcess','onBeforeSetContent','onBeforeGetContent','onSetContent','onGetContent','onLoadContent','onSaveContent','onNodeChange','onChange','onBeforeExecCommand','onExecCommand','onUndo','onRedo','onVisualAid','onSetProgressState'],function(e){t[e]=new Dispatcher(t);});t.settings=s=extend({id:id,language:'en',docs_language:'en',theme:'simple',skin:'default',delta_width:0,delta_height:0,popup_css:'',plugins:'',document_base_url:tinymce.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',visual_table_class:'mceItemTable',visual:1,inline_styles:true,convert_fonts_to_spans:true,font_size_style_values:'xx-small,x-small,small,medium,large,x-large,xx-large',apply_source_formatting:1,directionality:'ltr',forced_root_block:'p',valid_elements:'@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:'30px'},s);t.documentBaseURI=new tinymce.util.URI(s.document_base_url||tinymce.documentBaseURL,{base_uri:tinyMCE.baseURI});t.baseURI=EditorManager.baseURI;t.execCallback('setup',t);},render:function(nst){var t=this,s=t.settings,id=t.id,sl=tinymce.ScriptLoader;if(!Event.domLoaded){Event.add(document,'init',function(){t.render();});return;}if(!nst){s.strict_loading_mode=1;tinyMCE.settings=s;}if(!t.getElement())return;if(s.strict_loading_mode){sl.settings.strict_mode=s.strict_loading_mode;tinymce.DOM.settings.strict=1;}if(!/TEXTAREA|INPUT/i.test(t.getElement().nodeName)&&s.hidden_input&&DOM.getParent(id,'form'))DOM.insertAfter(DOM.create('input',{type:'hidden',name:id}),id);t.windowManager=new tinymce.WindowManager(t);if(s.encoding=='xml'){t.onGetContent.add(function(ed,o){if(o.get)o.content=DOM.encode(o.content);});}if(s.add_form_submit_trigger){t.onSubmit.addToTop(function(){if(t.initialized){t.save();t.isNotDirty=1;}});}if(s.add_unload_trigger){t._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(t.initialized&&!t.destroyed)t.save({format:'raw',no_events:true});});}tinymce.addUnload(t.destroy,t);if(s.submit_patch){t.onBeforeRenderUI.add(function(){var n=t.getElement().form;if(!n)return;if(n._mceOldSubmit)return;if(!n.submit.nodeType&&!n.submit.length){t.formElement=n;n._mceOldSubmit=n.submit;n.submit=function(){EditorManager.triggerSave();t.isNotDirty=1;return this._mceOldSubmit(this);};}n=null;});}function loadScripts(){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme.charAt(0)!='-'&&!ThemeManager.urls[s.theme])ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');each(explode(s.plugins),function(p){if(p&&p.charAt(0)!='-'&&!PluginManager.urls[p]){if(!isWebKit&&p=='safari')return;PluginManager.load(p,'plugins/'+p+'/editor_plugin'+tinymce.suffix+'.js');}});sl.loadQueue(function(){if(s.ask){function ask(){t.windowManager.confirm(t.getLang('edit_confirm'),function(s){if(s)t.init();else Event.remove(t.id,'focus',ask);});};Event.add(t.id,'focus',ask);return;}if(!t.removed)t.init();});};if(s.plugins.indexOf('compat2x')!=-1){PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');sl.loadQueue(loadScripts);}else loadScripts();},init:function(){var n,t=this,s=t.settings,w,h,e=t.getElement(),o,ti,u,bi,bc,re;EditorManager.add(t);s.theme=s.theme.replace(/-/,'');o=ThemeManager.get(s.theme);t.theme=new o();if(t.theme.init&&s.init_theme)t.theme.init(t,ThemeManager.urls[s.theme]||tinymce.documentBaseURL.replace(/\/$/,''));each(explode(s.plugins.replace(/\-/g,'')),function(p){var c=PluginManager.get(p),u=PluginManager.urls[p]||tinymce.documentBaseURL.replace(/\/$/,''),po;if(c){po=new c(t,u);t.plugins[p]=po;if(po.init)po.init(t,u);}});if(s.popup_css)s.popup_css=t.documentBaseURI.toAbsolute(s.popup_css);else s.popup_css=t.baseURI.toAbsolute("themes/"+s.theme+"/skins/"+s.skin+"/dialog.css");if(s.popup_css_add)s.popup_css+=','+t.documentBaseURI.toAbsolute(s.popup_css_add);t.controlManager=new tinymce.ControlManager(t);t.undoManager=new tinymce.UndoManager(t);t.undoManager.onAdd.add(function(um,l){return t.onChange.dispatch(t,l,um);});t.undoManager.onUndo.add(function(um,l){return t.onUndo.dispatch(t,l,um);});t.undoManager.onRedo.add(function(um,l){return t.onRedo.dispatch(t,l,um);});if(s.custom_undo_redo){t.onExecCommand.add(function(ed,cmd,ui,val,a){if(cmd!='Undo'&&cmd!='Redo'&&cmd!='mceRepaint'&&(!a||!a.skip_undo))t.undoManager.add();});}t.onExecCommand.add(function(ed,c){if(!/^(FontName|FontSize)$/.test(c))t.nodeChanged();});if(isGecko){function repaint(a,o){if(!o||!o.initial)t.execCommand('mceRepaint');};t.onUndo.add(repaint);t.onRedo.add(repaint);t.onSetContent.add(repaint);}t.onBeforeRenderUI.dispatch(t,t.controlManager);if(s.render_ui){w=s.width||e.style.width||e.clientWidth;h=s.height||e.style.height||e.clientHeight;t.orgDisplay=e.style.display;re=/^[0-9\.]+(|px)$/i;if(re.test(''+w))w=Math.max(parseInt(w)+(o.deltaWidth||0),100);if(re.test(''+h))h=Math.max(parseInt(h)+(o.deltaHeight||0),100);o=t.theme.renderUI({targetNode:e,width:w,height:h,deltaWidth:s.delta_width,deltaHeight:s.delta_height});t.editorContainer=o.editorContainer;}DOM.setStyles(o.sizeContainer||o.editorContainer,{width:w,height:h});h=(o.iframeHeight||h)+((h+'').indexOf('%')==-1?(o.deltaHeight||0):'');if(h<100)h=100;t.iframeHTML=s.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+t.documentBaseURI.getURI()+'"></base>';t.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(tinymce.relaxedDomain)t.iframeHTML+='<script type="text/javascript">document.domain = "'+tinymce.relaxedDomain+'";</script>';bi=s.body_id||'tinymce';if(bi.indexOf('=')!=-1){bi=t.getParam('body_id','','hash');bi=bi[t.id]||bi;}bc=s.body_class||'';if(bc.indexOf('=')!=-1){bc=t.getParam('body_class','','hash');bc=bc[t.id]||'';}t.iframeHTML+='</head><body id="'+bi+'" class="mceContentBody '+bc+'"></body></html>';if(tinymce.relaxedDomain){if(isIE)u='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';else if(tinymce.isOpera)u='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()';}n=DOM.add(o.iframeContainer,'iframe',{id:t.id+"_ifr",src:u||'javascript:""',frameBorder:'0',style:{width:'100%',height:h}});t.contentAreaContainer=o.iframeContainer;DOM.get(o.editorContainer).style.display=t.orgDisplay;DOM.get(t.id).style.display='none';if(tinymce.isOldWebKit){Event.add(n,'load',t.setupIframe,t);n.src=tinymce.baseURL+'/plugins/safari/blank.htm';}else{if(!isIE||!tinymce.relaxedDomain)t.setupIframe();e=n=o=null;}},setupIframe:function(){var t=this,s=t.settings,e=DOM.get(t.id),d=t.getDoc(),h,b;if(!isIE||!tinymce.relaxedDomain){d.open();d.write(t.iframeHTML);d.close();}if(!isIE){try{d.designMode='On';}catch(ex){}}if(isIE){b=t.getBody();DOM.hide(b);b.contentEditable=true;DOM.show(b);}t.dom=new tinymce.DOM.DOMUtils(t.getDoc(),{keep_values:true,url_converter:t.convertURL,url_converter_scope:t,hex_colors:s.force_hex_style_colors,class_filter:s.class_filter,update_styles:1,fix_ie_paragraphs:1});t.serializer=new tinymce.dom.Serializer({entity_encoding:s.entity_encoding,entities:s.entities,valid_elements:s.verify_html===false?'*[*]':s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,invalid_elements:s.invalid_elements,fix_table_elements:s.fix_table_elements,fix_list_elements:s.fix_list_elements,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans,font_size_classes:s.font_size_classes,font_size_style_values:s.font_size_style_values,apply_source_formatting:s.apply_source_formatting,remove_linebreaks:s.remove_linebreaks,dom:t.dom});t.selection=new tinymce.dom.Selection(t.dom,t.getWin(),t.serializer);t.forceBlocks=new tinymce.ForceBlocks(t,{forced_root_block:s.forced_root_block});t.editorCommands=new tinymce.EditorCommands(t);t.serializer.onPreProcess.add(function(se,o){return t.onPreProcess.dispatch(t,o,se);});t.serializer.onPostProcess.add(function(se,o){return t.onPostProcess.dispatch(t,o,se);});t.onPreInit.dispatch(t);if(!s.gecko_spellcheck)t.getBody().spellcheck=0;t._addEvents();t.controlManager.onPostRender.dispatch(t,t.controlManager);t.onPostRender.dispatch(t);if(s.directionality)t.getBody().dir=s.directionality;if(s.nowrap)t.getBody().style.whiteSpace="nowrap";if(s.auto_resize)t.onNodeChange.add(t.resizeToContent,t);if(s.custom_elements){function handleCustom(ed,o){each(explode(s.custom_elements),function(v){var n;if(v.indexOf('~')===0){v=v.substring(1);n='span';}else n='div';o.content=o.content.replace(new RegExp('<('+v+')([^>]*)>','g'),'<'+n+' mce_name="$1"$2>');o.content=o.content.replace(new RegExp('</('+v+')>','g'),'</'+n+'>');});};t.onBeforeSetContent.add(handleCustom);t.onPostProcess.add(function(ed,o){if(o.set)handleCustom(ed,o)});}if(s.handle_node_change_callback){t.onNodeChange.add(function(ed,cm,n){t.execCallback('handle_node_change_callback',t.id,n,-1,-1,true,t.selection.isCollapsed());});}if(s.save_callback){t.onSaveContent.add(function(ed,o){var h=t.execCallback('save_callback',t.id,o.content,t.getBody());if(h)o.content=h;});}if(s.onchange_callback){t.onChange.add(function(ed,l){t.execCallback('onchange_callback',t,l);});}if(s.convert_newlines_to_brs){t.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/\r?\n/g,'<br />');});}if(s.fix_nesting&&isIE){t.onBeforeSetContent.add(function(ed,o){o.content=t._fixNesting(o.content);});}if(s.preformatted){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^\s*<pre.*?>/,'');o.content=o.content.replace(/<\/pre>\s*$/,'');if(o.set)o.content='<pre class="mceItemHidden">'+o.content+'</pre>';});}if(s.verify_css_classes){t.serializer.attribValueFilter=function(n,v){var s,cl;if(n=='class'){if(!t.classesRE){cl=t.dom.getClasses();if(cl.length>0){s='';each(cl,function(o){s+=(s?'|':'')+o['class'];});t.classesRE=new RegExp('('+s+')','gi');}}return!t.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v)||t.classesRE.test(v)?v:'';}return v;};}if(s.convert_fonts_to_spans)t._convertFonts();if(s.inline_styles)t._convertInlineElements();if(s.cleanup_callback){t.onBeforeSetContent.add(function(ed,o){o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);});t.onPreProcess.add(function(ed,o){if(o.set)t.execCallback('cleanup_callback','insert_to_editor_dom',o.node,o);if(o.get)t.execCallback('cleanup_callback','get_from_editor_dom',o.node,o);});t.onPostProcess.add(function(ed,o){if(o.set)o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);if(o.get)o.content=t.execCallback('cleanup_callback','get_from_editor',o.content,o);});}if(s.save_callback){t.onGetContent.add(function(ed,o){if(o.save)o.content=t.execCallback('save_callback',t.id,o.content,t.getBody());});}if(s.handle_event_callback){t.onEvent.add(function(ed,e,o){if(t.execCallback('handle_event_callback',e,ed,o)===false)Event.cancel(e);});}t.onSetContent.add(function(){t.addVisual(t.getBody());});if(s.padd_empty_editor){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^<p>(&nbsp;|#160;|\s|\u00a0)<\/p>$/,'');});}if(isGecko){try{d.designMode='Off';d.designMode='On';}catch(ex){}}setTimeout(function(){if(t.removed)return;t.load({initial:true,format:(s.cleanup_on_startup?'html':'raw')});t.startContent=t.getContent({format:'raw'});t.undoManager.add({initial:true});t.initialized=true;t.onInit.dispatch(t);t.execCallback('setupcontent_callback',t.id,t.getBody(),t.getDoc());t.execCallback('init_instance_callback',t);t.focus(true);t.nodeChanged({initial:1});if(s.content_css){tinymce.each(explode(s.content_css),function(u){t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));});}if(s.auto_focus){setTimeout(function(){var ed=EditorManager.get(s.auto_focus);ed.selection.select(ed.getBody(),1);ed.selection.collapse(1);ed.getWin().focus();},100);}},1);e=null;},focus:function(sf){var oed,t=this;if(!sf){t.getWin().focus();}if(EditorManager.activeEditor!=t){if((oed=EditorManager.activeEditor)!=null)oed.onDeactivate.dispatch(oed,t);t.onActivate.dispatch(t,oed);}EditorManager._setActive(t);},execCallback:function(n){var t=this,f=t.settings[n],s;if(!f)return;if(t.callbackLookup&&(s=t.callbackLookup[n])){f=s.func;s=s.scope;}if(is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);t.callbackLookup=t.callbackLookup||{};t.callbackLookup[n]={func:f,scope:s};}return f.apply(s||t,Array.prototype.slice.call(arguments,1));},translate:function(s){var c=this.settings.language,i18n=EditorManager.i18n;if(!s)return'';return i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return i18n[c+'.'+b]||'{#'+b+'}';});},getLang:function(n,dv){return EditorManager.i18n[this.settings.language+'.'+n]||(is(dv)?dv:'{#'+n+'}');},getParam:function(n,dv,ty){var tr=tinymce.trim,v=is(this.settings[n])?this.settings[n]:dv,o;if(ty==='hash'){o={};if(is(v,'string')){each(v.indexOf('=')>0?v.split(/[;,](?![^=;,]*(?:[;,]|$))/):v.split(','),function(v){v=v.split('=');if(v.length>1)o[tr(v[0])]=tr(v[1]);else o[tr(v[0])]=tr(v);});}else o=v;return o;}return v;},nodeChanged:function(o){var t=this,s=t.selection,n=s.getNode()||t.getBody();if(t.initialized){t.onNodeChange.dispatch(t,o?o.controlManager||t.controlManager:t.controlManager,isIE&&n.ownerDocument!=t.getDoc()?t.getBody():n,s.isCollapsed(),o);}},addButton:function(n,s){var t=this;t.buttons=t.buttons||{};t.buttons[n]=s;},addCommand:function(n,f,s){this.execCommands[n]={func:f,scope:s||this};},addQueryStateHandler:function(n,f,s){this.queryStateCommands[n]={func:f,scope:s||this};},addQueryValueHandler:function(n,f,s){this.queryValueCommands[n]={func:f,scope:s||this};},addShortcut:function(pa,desc,cmd_func,sc){var t=this,c;if(!t.settings.custom_shortcuts)return false;t.shortcuts=t.shortcuts||{};if(is(cmd_func,'string')){c=cmd_func;cmd_func=function(){t.execCommand(c,false,null);};}if(is(cmd_func,'object')){c=cmd_func;cmd_func=function(){t.execCommand(c[0],c[1],c[2]);};}each(explode(pa),function(pa){var o={func:cmd_func,scope:sc||this,desc:desc,alt:false,ctrl:false,shift:false};each(explode(pa,'+'),function(v){switch(v){case'alt':case'ctrl':case'shift':o[v]=true;break;default:o.charCode=v.charCodeAt(0);o.keyCode=v.toUpperCase().charCodeAt(0);}});t.shortcuts[(o.ctrl?'ctrl':'')+','+(o.alt?'alt':'')+','+(o.shift?'shift':'')+','+o.keyCode]=o;});return true;},execCommand:function(cmd,ui,val,a){var t=this,s=0,o;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd)&&(!a||!a.skip_focus))t.focus();o={};t.onBeforeExecCommand.dispatch(t,cmd,ui,val,o);if(o.terminate)return false;if(t.execCallback('execcommand_callback',t.id,t.selection.getNode(),cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(o=t.execCommands[cmd]){s=o.func.call(o.scope,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val,a);return s;}each(t.plugins,function(p){if(p.execCommand&&p.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);s=1;return false;}});if(s)return true;if(t.theme.execCommand&&t.theme.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(t.editorCommands.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}t.getDoc().execCommand(cmd,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val,a);},queryCommandState:function(c){var t=this,o;if(t._isHidden())return;if(o=t.queryStateCommands[c])return o.func.call(o.scope);o=t.editorCommands.queryCommandState(c);if(o!==-1)return o;try{return this.getDoc().queryCommandState(c);}catch(ex){}},queryCommandValue:function(c){var t=this,o;if(t._isHidden())return;if(o=t.queryValueCommands[c])return o.func.call(o.scope);o=t.editorCommands.queryCommandValue(c);if(is(o))return o;try{return this.getDoc().queryCommandValue(c);}catch(ex){}},show:function(){var t=this;DOM.show(t.getContainer());DOM.hide(t.id);t.load();},hide:function(){var t=this,d=t.getDoc();if(isIE&&d)d.execCommand('SelectAll');t.save();DOM.hide(t.getContainer());DOM.setStyle(t.id,'display',t.orgDisplay);},isHidden:function(){return!DOM.isHidden(this.id);},setProgressState:function(b,ti,o){this.onSetProgressState.dispatch(this,b,ti,o);return b;},resizeToContent:function(){var t=this;DOM.setStyle(t.id+"_ifr",'height',t.getBody().scrollHeight);},load:function(o){var t=this,e=t.getElement(),h;o=o||{};o.load=true;h=t.setContent(is(e.value)?e.value:e.innerHTML,o);o.element=e;if(!o.no_events)t.onLoadContent.dispatch(t,o);o.element=e=null;return h;},save:function(o){var t=this,e=t.getElement(),h,f;if(!t.initialized)return;o=o||{};o.save=true;o.element=e;h=o.content=t.getContent(o);if(!o.no_events)t.onSaveContent.dispatch(t,o);h=o.content;if(!/TEXTAREA|INPUT/i.test(e.nodeName)){e.innerHTML=h;if(f=DOM.getParent(t.id,'form')){each(f.elements,function(e){if(e.name==t.id){e.value=h;return false;}});}}else e.value=h;o.element=e=null;return h;},setContent:function(h,o){var t=this;o=o||{};o.format=o.format||'html';o.set=true;o.content=h;if(!o.no_events)t.onBeforeSetContent.dispatch(t,o);if(!tinymce.isIE&&(h.length===0||/^\s+$/.test(h))){o.content=t.dom.setHTML(t.getBody(),'<br mce_bogus="1" />',1);o.format='raw';}o.content=t.dom.setHTML(t.getBody(),tinymce.trim(o.content));if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;o.content=t.dom.setHTML(t.getBody(),t.serializer.serialize(t.getBody(),o));}if(!o.no_events)t.onSetContent.dispatch(t,o);return o.content;},getContent:function(o){var t=this,h;o=o||{};o.format=o.format||'html';o.get=true;if(!o.no_events)t.onBeforeGetContent.dispatch(t,o);if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;h=t.serializer.serialize(t.getBody(),o);}else h=t.getBody().innerHTML;h=h.replace(/^\s*|\s*$/g,'');o={content:h};t.onGetContent.dispatch(t,o);return o.content;},isDirty:function(){var t=this;return tinymce.trim(t.startContent)!=tinymce.trim(t.getContent({format:'raw',no_events:1}))&&!t.isNotDirty;},getContainer:function(){var t=this;if(!t.container)t.container=DOM.get(t.editorContainer||t.id+'_parent');return t.container;},getContentAreaContainer:function(){return this.contentAreaContainer;},getElement:function(){return DOM.get(this.settings.content_element||this.id);},getWin:function(){var t=this,e;if(!t.contentWindow){e=DOM.get(t.id+"_ifr");if(e)t.contentWindow=e.contentWindow;}return t.contentWindow;},getDoc:function(){var t=this,w;if(!t.contentDocument){w=t.getWin();if(w)t.contentDocument=w.document;}return t.contentDocument;},getBody:function(){return this.bodyElement||this.getDoc().body;},convertURL:function(u,n,e){var t=this,s=t.settings;if(s.urlconverter_callback)return t.execCallback('urlconverter_callback',u,e,true,n);if(!s.convert_urls||(e&&e.nodeName=='LINK')||u.indexOf('file:')===0)return u;if(s.relative_urls)return t.documentBaseURI.toRelative(u);u=t.documentBaseURI.toAbsolute(u,s.remove_script_host);return u;},addVisual:function(e){var t=this,s=t.settings;e=e||t.getBody();if(!is(t.hasVisual))t.hasVisual=s.visual;each(t.dom.select('table,a',e),function(e){var v;switch(e.nodeName){case'TABLE':v=t.dom.getAttrib(e,'border');if(!v||v=='0'){if(t.hasVisual)t.dom.addClass(e,s.visual_table_class);else t.dom.removeClass(e,s.visual_table_class);}return;case'A':v=t.dom.getAttrib(e,'name');if(v){if(t.hasVisual)t.dom.addClass(e,'mceItemAnchor');else t.dom.removeClass(e,'mceItemAnchor');}return;}});t.onVisualAid.dispatch(t,e,t.hasVisual);},remove:function(){var t=this,e=t.getContainer();t.removed=1;t.hide();t.execCallback('remove_instance_callback',t);t.onRemove.dispatch(t);t.onExecCommand.listeners=[];EditorManager.remove(t);DOM.remove(e);},destroy:function(s){var t=this;if(t.destroyed)return;if(!s){tinymce.removeUnload(t.destroy);tinyMCE.onBeforeUnload.remove(t._beforeUnload);if(t.theme.destroy)t.theme.destroy();t.controlManager.destroy();t.selection.destroy();t.dom.destroy();Event.clear(t.getWin());Event.clear(t.getDoc());Event.clear(t.getBody());Event.clear(t.formElement);}if(t.formElement){t.formElement.submit=t.formElement._mceOldSubmit;t.formElement._mceOldSubmit=null;}t.contentAreaContainer=t.formElement=t.container=t.settings.content_element=t.bodyElement=t.contentDocument=t.contentWindow=null;if(t.selection)t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null;t.destroyed=1;},_addEvents:function(){var t=this,i,s=t.settings,lo={mouseup:'onMouseUp',mousedown:'onMouseDown',click:'onClick',keyup:'onKeyUp',keydown:'onKeyDown',keypress:'onKeyPress',submit:'onSubmit',reset:'onReset',contextmenu:'onContextMenu',dblclick:'onDblClick',paste:'onPaste'};function eventHandler(e,o){var ty=e.type;if(t.removed)return;if(t.onEvent.dispatch(t,e,o)!==false){t[lo[e.fakeType||e.type]].dispatch(t,e,o);}};each(lo,function(v,k){switch(k){case'contextmenu':if(tinymce.isOpera){Event.add(t.getDoc(),'mousedown',function(e){if(e.ctrlKey){e.fakeType='contextmenu';eventHandler(e);}});}else Event.add(t.getDoc(),k,eventHandler);break;case'paste':Event.add(t.getBody(),k,function(e){var tx,h,el,r;if(e.clipboardData)tx=e.clipboardData.getData('text/plain');else if(tinymce.isIE)tx=t.getWin().clipboardData.getData('Text');eventHandler(e,{text:tx,html:h});});break;case'submit':case'reset':Event.add(t.getElement().form||DOM.getParent(t.id,'form'),k,eventHandler);break;default:Event.add(s.content_editable?t.getBody():t.getDoc(),k,eventHandler);}});Event.add(s.content_editable?t.getBody():(isGecko?t.getDoc():t.getWin()),'focus',function(e){t.focus(true);});if(tinymce.isGecko){Event.add(t.getDoc(),'DOMNodeInserted',function(e){var v;e=e.target;if(e.nodeType===1&&e.nodeName==='IMG'&&(v=e.getAttribute('mce_src')))e.src=t.documentBaseURI.toAbsolute(v);});}if(isGecko){function setOpts(){var t=this,d=t.getDoc(),s=t.settings;if(isGecko){if(t._isHidden()){try{if(!s.content_editable)d.designMode='On';}catch(ex){}}try{d.execCommand("styleWithCSS",0,false);}catch(ex){if(!t._isHidden())d.execCommand("useCSS",0,true);}if(!s.table_inline_editing)try{d.execCommand('enableInlineTableEditing',false,false);}catch(ex){}if(!s.object_resizing)try{d.execCommand('enableObjectResizing',false,false);}catch(ex){}}};t.onBeforeExecCommand.add(setOpts);t.onMouseDown.add(setOpts);}t.onMouseUp.add(t.nodeChanged);t.onClick.add(t.nodeChanged);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.keyCode==46||e.keyCode==8||e.ctrlKey)t.nodeChanged();});t.onReset.add(function(){t.setContent(t.startContent,{format:'raw'});});if(t.getParam('tab_focus')){function tabCancel(ed,e){if(e.keyCode===9)return Event.cancel(e);};function tabHandler(ed,e){var x,i,f,el,v;function find(d){f=DOM.getParent(ed.id,'form');el=f.elements;if(f){each(el,function(e,i){if(e.id==ed.id){x=i;return false;}});if(d>0){for(i=x+1;i<el.length;i++){if(el[i].type!='hidden')return el[i];}}else{for(i=x-1;i>=0;i--){if(el[i].type!='hidden')return el[i];}}}return null;};if(e.keyCode===9){v=explode(ed.getParam('tab_focus'));if(v.length==1){v[1]=v[0];v[0]=':prev';}if(e.shiftKey){if(v[0]==':prev')el=find(-1);else el=DOM.get(v[0]);}else{if(v[1]==':next')el=find(1);else el=DOM.get(v[1]);}if(el){if(ed=EditorManager.get(el.id||el.name))ed.focus();else window.setTimeout(function(){window.focus();el.focus();},10);return Event.cancel(e);}}};t.onKeyUp.add(tabCancel);if(isGecko){t.onKeyPress.add(tabHandler);t.onKeyDown.add(tabCancel);}else t.onKeyDown.add(tabHandler);}if(s.custom_shortcuts){if(s.custom_undo_redo_keyboard_shortcuts){t.addShortcut('ctrl+z',t.getLang('undo_desc'),'Undo');t.addShortcut('ctrl+y',t.getLang('redo_desc'),'Redo');}if(isGecko){t.addShortcut('ctrl+b',t.getLang('bold_desc'),'Bold');t.addShortcut('ctrl+i',t.getLang('italic_desc'),'Italic');t.addShortcut('ctrl+u',t.getLang('underline_desc'),'Underline');}for(i=1;i<=6;i++)t.addShortcut('ctrl+'+i,'',['FormatBlock',false,'<h'+i+'>']);t.addShortcut('ctrl+7','',['FormatBlock',false,'<p>']);t.addShortcut('ctrl+8','',['FormatBlock',false,'<div>']);t.addShortcut('ctrl+9','',['FormatBlock',false,'<address>']);function find(e){var v=null;if(!e.altKey&&!e.ctrlKey&&!e.metaKey)return v;each(t.shortcuts,function(o){if(o.ctrl!=e.ctrlKey&&(!tinymce.isMac||o.ctrl==e.metaKey))return;if(o.alt!=e.altKey)return;if(o.shift!=e.shiftKey)return;if(e.keyCode==o.keyCode||(e.charCode&&e.charCode==o.charCode)){v=o;return false;}});return v;};t.onKeyUp.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyPress.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyDown.add(function(ed,e){var o=find(e);if(o){o.func.call(o.scope);return Event.cancel(e);}});}if(tinymce.isIE){Event.add(t.getDoc(),'controlselect',function(e){var re=t.resizeInfo,cb;e=e.target;e.removeAttribute('mce_style');if(e.nodeName!=='IMG')return;if(re)Event.remove(re.node,re.ev,re.cb);if(!t.dom.hasClass(e,'mceItemNoResize')){ev='resizeend';cb=Event.add(e,ev,function(e){var v;e=e.target;if(v=t.dom.getStyle(e,'width')){t.dom.setAttrib(e,'width',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'width','');}if(v=t.dom.getStyle(e,'height')){t.dom.setAttrib(e,'height',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'height','');}});}else{ev='resizestart';cb=Event.add(e,'resizestart',Event.cancel,Event);}re=t.resizeInfo={node:e,ev:ev,cb:cb};});t.onKeyDown.add(function(ed,e){switch(e.keyCode){case 8:if(t.selection.getRng().item){t.selection.getRng().item(0).removeNode();return Event.cancel(e);}}});}if(tinymce.isOpera){t.onClick.add(function(ed,e){Event.prevent(e);});}if(s.custom_undo_redo){function addUndo(){t.undoManager.typing=0;t.undoManager.add();};if(tinymce.isIE){Event.add(t.getWin(),'blur',function(e){var n;if(t.selection){n=t.selection.getNode();if(!t.removed&&n.ownerDocument&&n.ownerDocument!=t.getDoc())addUndo();}});}else{Event.add(t.getDoc(),'blur',function(){if(t.selection&&!t.removed)addUndo();});}t.onMouseDown.add(addUndo);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.ctrlKey){t.undoManager.typing=0;t.undoManager.add();}});t.onKeyDown.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45){if(t.undoManager.typing){t.undoManager.add();t.undoManager.typing=0;}return;}if(!t.undoManager.typing){t.undoManager.add();t.undoManager.typing=1;}});}},_convertInlineElements:function(){var t=this,s=t.settings,dom=t.dom,v,e,na,st,sp;function convert(ed,o){if(!s.inline_styles)return;if(o.get){each(t.dom.select('table,u,strike',o.node),function(n){switch(n.nodeName){case'TABLE':if(v=dom.getAttrib(n,'height')){dom.setStyle(n,'height',v);dom.setAttrib(n,'height','');}break;case'U':case'STRIKE':sp=dom.create('span',{style:dom.getAttrib(n,'style')});sp.style.textDecoration=n.nodeName=='U'?'underline':'line-through';dom.setAttrib(sp,'mce_style','');dom.replace(sp,n,1);break;}});}else if(o.set){each(t.dom.select('table,span',o.node),function(n){if(n.nodeName=='TABLE'){if(v=dom.getStyle(n,'height'))dom.setAttrib(n,'height',v.replace(/[^0-9%]+/g,''));}else{if(n.style.textDecoration=='underline')na='u';else if(n.style.textDecoration=='line-through')na='strike';else na='';if(na){n.style.textDecoration='';dom.setAttrib(n,'mce_style','');e=dom.create(na,{style:dom.getAttrib(n,'style')});dom.replace(e,n,1);}}});}};t.onPreProcess.add(convert);if(!s.cleanup_on_startup){t.onInit.add(function(){convert(t,{node:t.getBody(),set:1});});}},_convertFonts:function(){var t=this,s=t.settings,dom=t.dom,fz,fzn,sl,cl;if(!s.inline_styles)return;fz=[8,10,12,14,18,24,36];fzn=['xx-small','x-small','small','medium','large','x-large','xx-large'];if(sl=s.font_size_style_values)sl=explode(sl);if(cl=s.font_size_classes)cl=explode(cl);function convertToFonts(no){var n,f,nl,x,i,v,st;if(tinymce.isWebKit||!s.inline_styles)return;nl=t.dom.select('span',no);for(x=nl.length-1;x>=0;x--){n=nl[x];f=dom.create('font',{color:dom.toHex(dom.getStyle(n,'color')),face:dom.getStyle(n,'fontFamily'),style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});st=f.style;if(st.color||st.fontFamily){st.color=st.fontFamily='';dom.setAttrib(f,'mce_style','');}if(sl){i=inArray(sl,dom.getStyle(n,'fontSize'));if(i!=-1){dom.setAttrib(f,'size',''+(i+1||1));f.style.fontSize='';}}else if(cl){i=inArray(cl,dom.getAttrib(n,'class'));v=dom.getStyle(n,'fontSize');if(i==-1&&v.indexOf('pt')>0)i=inArray(fz,parseInt(v));if(i==-1)i=inArray(fzn,v);if(i!=-1){dom.setAttrib(f,'size',''+(i+1||1));f.style.fontSize='';}}if(f.color||f.face||f.size){f.style.fontFamily='';dom.setAttrib(f,'mce_style','');dom.replace(f,n,1);}f=n=null;}};t.onSetContent.add(function(ed,o){convertToFonts(ed.getBody());});t.onPreProcess.add(function(ed,o){var n,sp,nl,x;if(!s.inline_styles)return;if(o.get){nl=t.dom.select('font',o.node);for(x=nl.length-1;x>=0;x--){n=nl[x];sp=dom.create('span',{style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});dom.setStyles(sp,{fontFamily:dom.getAttrib(n,'face'),color:dom.getAttrib(n,'color'),backgroundColor:n.style.backgroundColor});if(n.size){if(sl)dom.setStyle(sp,'fontSize',sl[parseInt(n.size)-1]);else dom.setAttrib(sp,'class',cl[parseInt(n.size)-1]);}dom.setAttrib(sp,'mce_style','');dom.replace(sp,n,1);}}});},_isHidden:function(){var s;if(!isGecko)return 0;s=this.selection.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},_fixNesting:function(s){var d=[],i;s=s.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(a,b,c){var e;if(b==='/'){if(!d.length)return'';if(c!==d[d.length-1].tag){for(i=d.length-1;i>=0;i--){if(d[i].tag===c){d[i].close=1;break;}}return'';}else{d.pop();if(d.length&&d[d.length-1].close){a=a+'</'+d[d.length-1].tag+'>';d.pop();}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(c))return a;if(/\/>$/.test(a))return a;d.push({tag:c});}return a;});for(i=d.length-1;i>=0;i--)s+='</'+d[i].tag+'>';return s;}});})();(function(){var each=tinymce.each,isIE=tinymce.isIE,isGecko=tinymce.isGecko,isOpera=tinymce.isOpera,isWebKit=tinymce.isWebKit;tinymce.create('tinymce.EditorCommands',{EditorCommands:function(ed){this.editor=ed;},execCommand:function(cmd,ui,val){var t=this,ed=t.editor,f;switch(cmd){case'Cut':case'Copy':case'Paste':try{ed.getDoc().execCommand(cmd,ui,val);}catch(ex){if(isGecko){ed.windowManager.confirm(ed.getLang('clipboard_msg'),function(s){if(s)window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');});}else ed.windowManager.alert(ed.getLang('clipboard_no_support'));}return true;case'mceResetDesignMode':case'mceBeginUndoLevel':return true;case'unlink':t.UnLink();return true;case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':t.mceJustify(cmd,cmd.substring(7).toLowerCase());return true;case'mceEndUndoLevel':case'mceAddUndoLevel':ed.undoManager.add();return true;default:f=this[cmd];if(f){f.call(this,ui,val);return true;}}return false;},Indent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){d.setStyle(e,'paddingLeft',(parseInt(e.style.paddingLeft||0)+iv)+iu);});return;}ed.getDoc().execCommand('Indent',false,null);if(isIE){d.getParent(s.getNode(),function(n){if(n.nodeName=='BLOCKQUOTE'){n.dir=n.style.cssText='';}});}},Outdent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,v,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){v=Math.max(0,parseInt(e.style.paddingLeft||0)-iv);d.setStyle(e,'paddingLeft',v?v+iu:'');});return;}ed.getDoc().execCommand('Outdent',false,null);},mceSetAttribute:function(u,v){var ed=this.editor,d=ed.dom,e;if(e=d.getParent(ed.selection.getNode(),d.isBlock))d.setAttrib(e,v.name,v.value);},mceSetContent:function(u,v){this.editor.setContent(v);},mceToggleVisualAid:function(){var ed=this.editor;ed.hasVisual=!ed.hasVisual;ed.addVisual();},mceReplaceContent:function(u,v){var s=this.editor.selection;s.setContent(v.replace(/\{\$selection\}/g,s.getContent({format:'text'})));},mceInsertLink:function(u,v){var ed=this.editor,e=ed.dom.getParent(ed.selection.getNode(),'A');if(tinymce.is(v,'string'))v={href:v};function set(e){each(v,function(v,k){ed.dom.setAttrib(e,k,v);});};if(!e){ed.execCommand('CreateLink',false,'javascript:mctmp(0);');each(ed.dom.select('a'),function(e){if(e.href=='javascript:mctmp(0);')set(e);});}else{if(v.href)set(e);else ed.dom.remove(e,1);}},UnLink:function(){var ed=this.editor,s=ed.selection;if(s.isCollapsed())s.select(s.getNode());ed.getDoc().execCommand('unlink',false,null);s.collapse(0);},FontName:function(u,v){var t=this,ed=t.editor,s=ed.selection,e;if(!v){if(s.isCollapsed())s.select(s.getNode());t.RemoveFormat();}else ed.getDoc().execCommand('FontName',false,v);},queryCommandValue:function(c){var f=this['queryValue'+c];if(f)return f.call(this,c);return false;},queryCommandState:function(cmd){var f;switch(cmd){case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':return this.queryStateJustify(cmd,cmd.substring(7).toLowerCase());default:if(f=this['queryState'+cmd])return f.call(this,cmd);}return-1;},_queryState:function(c){try{return this.editor.getDoc().queryCommandState(c);}catch(ex){}},_queryVal:function(c){try{return this.editor.getDoc().queryCommandValue(c);}catch(ex){}},queryValueFontSize:function(){var ed=this.editor,v=0,p;if(isOpera||isWebKit){if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.size;return v;}return this._queryVal('FontSize');},queryValueFontName:function(){var ed=this.editor,v=0,p;if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.face;if(!v)v=this._queryVal('FontName');return v;},mceJustify:function(c,v){var ed=this.editor,se=ed.selection,n=se.getNode(),nn=n.nodeName,bl,nb,dom=ed.dom,rm;if(ed.settings.inline_styles&&this.queryStateJustify(c,v))rm=1;bl=dom.getParent(n,ed.dom.isBlock);if(nn=='IMG'){if(v=='full')return;if(rm){if(v=='center')dom.setStyle(n.parentNode,'textAlign','');dom.setStyle(n,'float','');this.mceRepaint();return;}if(v=='center'){if(/^(TD|TH)$/.test(bl.nodeName))bl=0;if(!bl||bl.childNodes.length>1){nb=dom.create('p');nb.appendChild(n.cloneNode(false));if(bl)dom.insertAfter(nb,bl);else dom.insertAfter(nb,n);dom.remove(n);n=nb.firstChild;bl=nb;}dom.setStyle(bl,'textAlign',v);dom.setStyle(n,'float','');}else{dom.setStyle(n,'float',v);dom.setStyle(n.parentNode,'textAlign','');}this.mceRepaint();return;}if(ed.settings.inline_styles&&ed.settings.forced_root_block){if(rm)v='';each(this._getSelectedBlocks(dom.getParent(se.getStart(),dom.isBlock),dom.getParent(se.getEnd(),dom.isBlock)),function(e){dom.setAttrib(e,'align','');dom.setStyle(e,'textAlign',v=='full'?'justify':v);});return;}else if(!rm)ed.getDoc().execCommand(c,false,null);if(ed.settings.inline_styles){if(rm){dom.getParent(ed.selection.getNode(),function(n){if(n.style&&n.style.textAlign)dom.setStyle(n,'textAlign','');});return;}each(dom.select('*'),function(n){var v=n.align;if(v){if(v=='full')v='justify';dom.setStyle(n,'textAlign',v);dom.setAttrib(n,'align','');}});}},mceSetCSSClass:function(u,v){this.mceSetStyleInfo(0,{command:'setattrib',name:'class',value:v});},getSelectedElement:function(){var t=this,ed=t.editor,dom=ed.dom,se=ed.selection,r=se.getRng(),r1,r2,sc,ec,so,eo,e,sp,ep,re;if(se.isCollapsed()||r.item)return se.getNode();re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(isIE){r1=r.duplicate();r1.collapse(true);sc=r1.parentElement();r2=r.duplicate();r2.collapse(false);ec=r2.parentElement();if(sc!=ec){r1.move('character',1);sc=r1.parentElement();}if(sc==ec){r1=r.duplicate();r1.moveToElementText(sc);if(r1.compareEndPoints('StartToStart',r)==0&&r1.compareEndPoints('EndToEnd',r)==0)return re&&re.test(sc.nodeName)?null:sc;}}else{function getParent(n){return dom.getParent(n,function(n){return n.nodeType==1;});};sc=r.startContainer;ec=r.endContainer;so=r.startOffset;eo=r.endOffset;if(!r.collapsed){if(sc==ec){if(so-eo<2){if(sc.hasChildNodes()){sp=sc.childNodes[so];return re&&re.test(sp.nodeName)?null:sp;}}}}if(sc.nodeType!=3||ec.nodeType!=3)return null;if(so==0){sp=getParent(sc);if(sp&&sp.firstChild!=sc)sp=null;}if(so==sc.nodeValue.length){e=sc.nextSibling;if(e&&e.nodeType==1)sp=sc.nextSibling;}if(eo==0){e=ec.previousSibling;if(e&&e.nodeType==1)ep=e;}if(eo==ec.nodeValue.length){ep=getParent(ec);if(ep&&ep.lastChild!=ec)ep=null;}if(sp==ep)return re&&sp&&re.test(sp.nodeName)?null:sp;}return null;},InsertHorizontalRule:function(){if(isGecko||isIE)this.editor.selection.setContent('<hr />');else this.editor.getDoc().execCommand('InsertHorizontalRule',false,'');},RemoveFormat:function(){var t=this,ed=t.editor,s=ed.selection,b;if(isWebKit)s.setContent(s.getContent({format:'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g,''),{format:'raw'});else ed.getDoc().execCommand('RemoveFormat',false,null);t.mceSetStyleInfo(0,{command:'removeformat'});ed.addVisual();},mceSetStyleInfo:function(u,v){var t=this,ed=t.editor,d=ed.getDoc(),dom=ed.dom,e,b,s=ed.selection,nn=v.wrapper||'span',b=s.getBookmark(),re;function set(n,e){if(n.nodeType==1){switch(v.command){case'setattrib':return dom.setAttrib(n,v.name,v.value);case'setstyle':return dom.setStyle(n,v.name,v.value);case'removeformat':return dom.setAttrib(n,'class','');}}};re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(e=t.getSelectedElement())set(e,1);else{d.execCommand('FontName',false,'__');each(isWebKit?dom.select('span'):dom.select('font'),function(n){var sp,e;if(dom.getAttrib(n,'face')=='__'||n.style.fontFamily==='__'){sp=dom.create(nn,{mce_new:'1'});set(sp);each(n.childNodes,function(n){sp.appendChild(n.cloneNode(true));});dom.replace(sp,n);}});}each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!dom.getAttrib(n,'mce_new')){p=dom.getParent(n,function(n){return n.nodeType==1&&dom.getAttrib(n,'mce_new');});if(p)dom.remove(n,1);}});each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!p||!dom.getAttrib(n,'mce_new'))return;if(p.nodeName==nn.toUpperCase()&&p.childNodes.length==1)return dom.remove(p,1);if(n.nodeType==1&&(!re||!re.test(p.nodeName))&&p.childNodes.length==1){set(p);dom.setAttrib(n,'class','');}});each(dom.select(nn).reverse(),function(n){if(dom.getAttrib(n,'mce_new')||(dom.getAttribs(n).length<=1&&n.className==='')){if(!dom.getAttrib(n,'class')&&!dom.getAttrib(n,'style'))return dom.remove(n,1);dom.setAttrib(n,'mce_new','');}});s.moveToBookmark(b);},queryStateJustify:function(c,v){var ed=this.editor,n=ed.selection.getNode(),dom=ed.dom;if(n&&n.nodeName=='IMG'){if(dom.getStyle(n,'float')==v)return 1;return n.parentNode.style.textAlign==v;}n=dom.getParent(ed.selection.getStart(),function(n){return n.nodeType==1&&n.style.textAlign;});if(v=='full')v='justify';if(ed.settings.inline_styles)return(n&&n.style.textAlign==v);return this._queryState(c);},HiliteColor:function(ui,val){var t=this,ed=t.editor,d=ed.getDoc();function set(s){if(!isGecko)return;try{d.execCommand("styleWithCSS",0,s);}catch(ex){d.execCommand("useCSS",0,!s);}};if(isGecko||isOpera){set(true);d.execCommand('hilitecolor',false,val);set(false);}else d.execCommand('BackColor',false,val);},Undo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.undo();ed.nodeChanged();}else ed.getDoc().execCommand('Undo',false,null);},Redo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.redo();ed.nodeChanged();}else ed.getDoc().execCommand('Redo',false,null);},FormatBlock:function(ui,val){var t=this,ed=t.editor;val=ed.settings.forced_root_block?(val||'<p>'):val;if(/^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(ed.selection.getNode().nodeName))t.mceRemoveNode();if(val.indexOf('<')==-1)val='<'+val+'>';if(tinymce.isGecko)val=val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi,'$1');ed.getDoc().execCommand('FormatBlock',false,val);},mceCleanup:function(){var ed=this.editor,s=ed.selection,b=s.getBookmark();ed.setContent(ed.getContent());s.moveToBookmark(b);},mceRemoveNode:function(ui,val){var ed=this.editor,s=ed.selection,b,n=val||s.getNode();if(n==ed.getBody())return;b=s.getBookmark();ed.dom.remove(n,1);s.moveToBookmark(b);ed.nodeChanged();},mceSelectNodeDepth:function(ui,val){var ed=this.editor,s=ed.selection,c=0;ed.dom.getParent(s.getNode(),function(n){if(n.nodeType==1&&c++==val){s.select(n);ed.nodeChanged();return false;}},ed.getBody());},mceSelectNode:function(u,v){this.editor.selection.select(v);},mceInsertContent:function(ui,val){this.editor.selection.setContent(val);},mceInsertRawHTML:function(ui,val){var ed=this.editor;ed.selection.setContent('tiny_mce_marker');ed.setContent(ed.getContent().replace(/tiny_mce_marker/g,val));},mceRepaint:function(){var s,b,e=this.editor;if(tinymce.isGecko){try{s=e.selection;b=s.getBookmark(true);if(s.getSel())s.getSel().selectAllChildren(e.getBody());s.collapse(true);s.moveToBookmark(b);}catch(ex){}}},queryStateUnderline:function(){var ed=this.editor,n;if(n&&n.nodeName=='A')return false;return this._queryState('Underline');},queryStateOutdent:function(){var ed=this.editor,n;if(ed.settings.inline_styles){if((n=ed.dom.getParent(ed.selection.getStart(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;if((n=ed.dom.getParent(ed.selection.getEnd(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;}else return!!ed.dom.getParent(ed.selection.getNode(),'BLOCKQUOTE');return this.queryStateInsertUnorderedList()||this.queryStateInsertOrderedList();},queryStateInsertUnorderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'UL');},queryStateInsertOrderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'OL');},queryStatemceBlockQuote:function(){return!!this.editor.dom.getParent(this.editor.selection.getStart(),function(n){return n.nodeName==='BLOCKQUOTE';});},mceBlockQuote:function(){var t=this,ed=t.editor,s=ed.selection,dom=ed.dom,sb,eb,n,bm,bq,r,bq2,i,nl;function getBQ(e){return dom.getParent(e,function(n){return n.nodeName==='BLOCKQUOTE';});};sb=dom.getParent(s.getStart(),dom.isBlock);eb=dom.getParent(s.getEnd(),dom.isBlock);if(bq=getBQ(sb)){if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();if(getBQ(eb)){bq2=bq.cloneNode(false);while(n=eb.nextSibling)bq2.appendChild(n.parentNode.removeChild(n));}if(bq2)dom.insertAfter(bq2,bq);nl=t._getSelectedBlocks(sb,eb);for(i=nl.length-1;i>=0;i--){dom.insertAfter(nl[i],bq);}if(/^\s*$/.test(bq.innerHTML))dom.remove(bq,1);if(bq2&&/^\s*$/.test(bq2.innerHTML))dom.remove(bq2,1);if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(0);if(dom.getParent(s.getStart(),dom.isBlock)!=sb){r=s.getRng();r.move('character',-1);r.select();}}}else t.editor.selection.moveToBookmark(bm);return;}if(isIE&&!sb&&!eb){t.editor.getDoc().execCommand('Indent');n=getBQ(s.getNode());n.style.margin=n.dir='';return;}if(!sb||!eb)return;if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();each(t._getSelectedBlocks(getBQ(s.getStart()),getBQ(s.getEnd())),function(e){if(e.nodeName=='BLOCKQUOTE'&&!bq){bq=e;return;}if(!bq){bq=dom.create('blockquote');e.parentNode.insertBefore(bq,e);}if(e.nodeName=='BLOCKQUOTE'&&bq){n=e.firstChild;while(n){bq.appendChild(n.cloneNode(true));n=n.nextSibling;}dom.remove(e);return;}bq.appendChild(dom.remove(e));});if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(1);}}else s.moveToBookmark(bm);},_getSelectedBlocks:function(st,en){var ed=this.editor,dom=ed.dom,s=ed.selection,sb,eb,n,bl=[];sb=dom.getParent(st||s.getStart(),dom.isBlock);eb=dom.getParent(en||s.getEnd(),dom.isBlock);if(sb)bl.push(sb);if(sb&&eb&&sb!=eb){n=sb;while((n=n.nextSibling)&&n!=eb){if(dom.isBlock(n))bl.push(n);}}if(eb&&sb!=eb)bl.push(eb);return bl;}});})();tinymce.create('tinymce.UndoManager',{index:0,data:null,typing:0,UndoManager:function(ed){var t=this,Dispatcher=tinymce.util.Dispatcher;t.editor=ed;t.data=[];t.onAdd=new Dispatcher(this);t.onUndo=new Dispatcher(this);t.onRedo=new Dispatcher(this);},add:function(l){var t=this,i,ed=t.editor,b,s=ed.settings,la;l=l||{};l.content=l.content||ed.getContent({format:'raw',no_events:1});l.content=l.content.replace(/^\s*|\s*$/g,'');la=t.data[t.index>0?t.index-1:0];if(!l.initial&&la&&l.content==la.content)return null;if(s.custom_undo_redo_levels){if(t.data.length>s.custom_undo_redo_levels){for(i=0;i<t.data.length-1;i++)t.data[i]=t.data[i+1];t.data.length--;t.index=t.data.length;}}if(s.custom_undo_redo_restore_selection&&!l.initial)l.bookmark=b=l.bookmark||ed.selection.getBookmark();if(t.index<t.data.length&&t.data[t.index].initial)t.index++;t.data.length=t.index+1;t.data[t.index++]=l;if(l.initial)t.index=0;if(t.data.length==2&&t.data[0].initial)t.data[0].bookmark=b;t.onAdd.dispatch(t,l);ed.isNotDirty=0;return l;},undo:function(){var t=this,ed=t.editor,l=l,i;if(t.typing){t.add();t.typing=0;}if(t.index>0){if(t.index==t.data.length&&t.index>1){i=t.index;t.typing=0;if(!t.add())t.index=i;--t.index;}l=t.data[--t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onUndo.dispatch(t,l);}return l;},redo:function(){var t=this,ed=t.editor,l=null;if(t.index<t.data.length-1){l=t.data[++t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onRedo.dispatch(t,l);}return l;},clear:function(){var t=this;t.data=[];t.index=0;t.typing=0;t.add({initial:true});},hasUndo:function(){return this.index!=0||this.typing;},hasRedo:function(){return this.index<this.data.length-1;}});(function(){var Event,isIE,isGecko,isOpera,each,extend;Event=tinymce.dom.Event;isIE=tinymce.isIE;isGecko=tinymce.isGecko;isOpera=tinymce.isOpera;each=tinymce.each;extend=tinymce.extend;tinymce.create('tinymce.ForceBlocks',{ForceBlocks:function(ed){var t=this,s=ed.settings,elm;t.editor=ed;t.dom=ed.dom;elm=(s.forced_root_block||'p').toLowerCase();s.element=elm.toUpperCase();ed.onPreInit.add(t.setup,t);t.reOpera=new RegExp('(\\u00a0|&#160;|&nbsp;)<\/'+elm+'>','gi');t.rePadd=new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR1=new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR2=new RegExp('<p( )([^>]+)>(&nbsp;|&#160;)<\\\/p>|<p>(&nbsp;|&#160;)<\\\/p>'.replace(/p/g,elm),'gi');t.reBR2Nbsp=new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g,elm),'gi');t.reTrailBr=new RegExp('\\s*<br \\/>\\s*<\\\/p>'.replace(/p/g,elm),'gi');function padd(ed,o){if(isOpera)o.content=o.content.replace(t.reOpera,'</'+elm+'>');o.content=o.content.replace(t.rePadd,'<'+elm+'$1$2$3$4$5$6>\u00a0</'+elm+'>');if(!isIE&&!isOpera&&o.set){o.content=o.content.replace(t.reNbsp2BR1,'<'+elm+'$1$2><br /></'+elm+'>');o.content=o.content.replace(t.reNbsp2BR2,'<'+elm+'$1$2><br /></'+elm+'>');}else{o.content=o.content.replace(t.reBR2Nbsp,'<'+elm+'$1$2>\u00a0</'+elm+'>');o.content=o.content.replace(t.reTrailBr,'</'+elm+'>');}};ed.onBeforeSetContent.add(padd);ed.onPostProcess.add(padd);if(s.forced_root_block){ed.onInit.add(t.forceRoots,t);ed.onSetContent.add(t.forceRoots,t);ed.onBeforeGetContent.add(t.forceRoots,t);}},setup:function(){var t=this,ed=t.editor,s=ed.settings;if(s.forced_root_block){ed.onKeyUp.add(t.forceRoots,t);ed.onPreProcess.add(t.forceRoots,t);}if(s.force_br_newlines){if(isIE){ed.onKeyPress.add(function(ed,e){var n,s=ed.selection;if(e.keyCode==13&&s.getNode().nodeName!='LI'){s.setContent('<br id="__" /> ',{format:'raw'});n=ed.dom.get('__');n.removeAttribute('id');s.select(n);s.collapse();return Event.cancel(e);}});}return;}if(!isIE&&s.force_p_newlines){ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&!e.shiftKey){if(!t.insertPara(e))Event.cancel(e);}});if(isGecko){ed.onKeyDown.add(function(ed,e){if((e.keyCode==8||e.keyCode==46)&&!e.shiftKey)t.backspaceDelete(e,e.keyCode==8);});}}function ren(rn,na){var ne=ed.dom.create(na);each(rn.attributes,function(a){if(a.specified&&a.nodeValue)ne.setAttribute(a.nodeName.toLowerCase(),a.nodeValue);});each(rn.childNodes,function(n){ne.appendChild(n.cloneNode(true));});rn.parentNode.replaceChild(ne,rn);return ne;};if(isIE&&s.element!='P'){ed.onKeyPress.add(function(ed,e){t.lastElm=ed.selection.getNode().nodeName;});ed.onKeyUp.add(function(ed,e){var bl,sel=ed.selection,n=sel.getNode(),b=ed.getBody();if(b.childNodes.length===1&&n.nodeName=='P'){n=ren(n,s.element);sel.select(n);sel.collapse();ed.nodeChanged();}else if(e.keyCode==13&&!e.shiftKey&&t.lastElm!='P'){bl=ed.dom.getParent(n,'P');if(bl){ren(bl,s.element);ed.nodeChanged();}}});}},find:function(n,t,s){var ed=this.editor,w=ed.getDoc().createTreeWalker(n,4,null,false),c=-1;while(n=w.nextNode()){c++;if(t==0&&n==s)return c;if(t==1&&c==s)return n;}return-1;},forceRoots:function(ed,e){var t=this,ed=t.editor,b=ed.getBody(),d=ed.getDoc(),se=ed.selection,s=se.getSel(),r=se.getRng(),si=-2,ei,so,eo,tr,c=-0xFFFFFF;var nx,bl,bp,sp,le,nl=b.childNodes,i;if(e&&e.keyCode==13)return true;for(i=nl.length-1;i>=0;i--){nx=nl[i];if(nx.nodeType==3||(!t.dom.isBlock(nx)&&nx.nodeType!=8)){if(!bl){if(nx.nodeType!=3||/[^\s]/g.test(nx.nodeValue)){if(si==-2&&r){if(!isIE){so=r.startOffset;eo=r.endOffset;si=t.find(b,0,r.startContainer);ei=t.find(b,0,r.endContainer);}else{tr=d.body.createTextRange();tr.moveToElementText(b);tr.collapse(1);bp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(1);sp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(0);le=(tr.move('character',c)*-1)-sp;si=sp-bp;ei=le;}}bl=ed.dom.create(ed.settings.forced_root_block);bl.appendChild(nx.cloneNode(1));nx.parentNode.replaceChild(bl,nx);}}else{if(bl.hasChildNodes())bl.insertBefore(nx,bl.firstChild);else bl.appendChild(nx);}}else bl=null;}if(si!=-2){if(!isIE){bl=d.getElementsByTagName(ed.settings.element)[0];r=d.createRange();if(si!=-1)r.setStart(t.find(b,1,si),so);else r.setStart(bl,0);if(ei!=-1)r.setEnd(t.find(b,1,ei),eo);else r.setEnd(bl,0);if(s){s.removeAllRanges();s.addRange(r);}}else{try{r=s.createRange();r.moveToElementText(b);r.collapse(1);r.moveStart('character',si);r.moveEnd('character',ei);r.select();}catch(ex){}}}},getParentBlock:function(n){var d=this.dom;return d.getParent(n,d.isBlock);},insertPara:function(e){var t=this,ed=t.editor,d=ed.getDoc(),se=ed.settings,s=ed.selection.getSel(),r=s.getRangeAt(0),b=d.body;var rb,ra,dir,sn,so,en,eo,sb,eb,bn,bef,aft,sc,ec,n,vp=ed.dom.getViewPort(ed.getWin()),y,ch;function isEmpty(n){n=n.innerHTML;n=n.replace(/<(img|hr|table)/gi,'-');n=n.replace(/<[^>]+>/g,'');return n.replace(/[ \t\r\n]+/g,'')=='';};rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(true);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(true);dir=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;sn=dir?s.anchorNode:s.focusNode;so=dir?s.anchorOffset:s.focusOffset;en=dir?s.focusNode:s.anchorNode;eo=dir?s.focusOffset:s.anchorOffset;if(sn==b&&en==b&&b.firstChild&&ed.dom.isBlock(b.firstChild)){sn=en=sn.firstChild;so=eo=0;rb=d.createRange();rb.setStart(sn,0);ra=d.createRange();ra.setStart(en,0);}sn=sn.nodeName=="HTML"?d.body:sn;sn=sn.nodeName=="BODY"?sn.firstChild:sn;en=en.nodeName=="HTML"?d.body:en;en=en.nodeName=="BODY"?en.firstChild:en;sb=t.getParentBlock(sn);eb=t.getParentBlock(en);bn=sb?sb.nodeName:se.element;if(t.dom.getParent(sb,function(n){return/OL|UL|PRE/.test(n.nodeName);}))return true;if(sb&&(sb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(sb.style.position))){bn=se.element;sb=null;}if(eb&&(eb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(eb.style.position))){bn=se.element;eb=null;}if(/(TD|TABLE|TH|CAPTION)/.test(bn)||(sb&&bn=="DIV"&&/left|right/gi.test(sb.style.cssFloat))){bn=se.element;sb=eb=null;}bef=(sb&&sb.nodeName==bn)?sb.cloneNode(0):ed.dom.create(bn);aft=(eb&&eb.nodeName==bn)?eb.cloneNode(0):ed.dom.create(bn);aft.removeAttribute('id');if(/^(H[1-6])$/.test(bn)&&sn.nodeValue&&so==sn.nodeValue.length)aft=ed.dom.create(se.element);n=sc=sn;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;sc=n;}while((n=n.previousSibling?n.previousSibling:n.parentNode));n=ec=en;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;ec=n;}while((n=n.nextSibling?n.nextSibling:n.parentNode));if(sc.nodeName==bn)rb.setStart(sc,0);else rb.setStartBefore(sc);rb.setEnd(sn,so);bef.appendChild(rb.cloneContents()||d.createTextNode(''));try{ra.setEndAfter(ec);}catch(ex){}ra.setStart(en,eo);aft.appendChild(ra.cloneContents()||d.createTextNode(''));r=d.createRange();if(!sc.previousSibling&&sc.parentNode.nodeName==bn){r.setStartBefore(sc.parentNode);}else{if(rb.startContainer.nodeName==bn&&rb.startOffset==0)r.setStartBefore(rb.startContainer);else r.setStart(rb.startContainer,rb.startOffset);}if(!ec.nextSibling&&ec.parentNode.nodeName==bn)r.setEndAfter(ec.parentNode);else r.setEnd(ra.endContainer,ra.endOffset);r.deleteContents();if(isOpera)ed.getWin().scrollTo(0,vp.y);if(bef.firstChild&&bef.firstChild.nodeName==bn)bef.innerHTML=bef.firstChild.innerHTML;if(aft.firstChild&&aft.firstChild.nodeName==bn)aft.innerHTML=aft.firstChild.innerHTML;if(isEmpty(bef))bef.innerHTML='<br />';if(isEmpty(aft))aft.innerHTML=isOpera?'&nbsp;':'<br />';if(isOpera){r.insertNode(bef);r.insertNode(aft);}else{r.insertNode(aft);r.insertNode(bef);}aft.normalize();bef.normalize();r=d.createRange();r.selectNodeContents(aft);r.collapse(1);s.removeAllRanges();s.addRange(r);y=ed.dom.getPos(aft).y;ch=aft.clientHeight;if(y<vp.y||y+ch>vp.y+vp.h){ed.getWin().scrollTo(0,y<vp.y?y:y-vp.h+ch);}return false;},backspaceDelete:function(e,bs){var t=this,ed=t.editor,b=ed.getBody(),n,se=ed.selection,r=se.getRng(),sc=r.startContainer,n,w,tn;if(sc&&ed.dom.isBlock(sc)&&!/^(TD|TH)$/.test(sc.nodeName)&&bs){if(sc.childNodes.length==0||(sc.childNodes.length==1&&sc.firstChild.nodeName=='BR')){n=sc;while((n=n.previousSibling)&&!ed.dom.isBlock(n));if(n){if(sc!=b.firstChild){w=ed.dom.doc.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(tn=w.nextNode())n=tn;r=ed.getDoc().createRange();r.setStart(n,n.nodeValue?n.nodeValue.length:0);r.setEnd(n,n.nodeValue?n.nodeValue.length:0);se.setRng(r);ed.dom.remove(sc);}return Event.cancel(e);}}}function handler(e){e=e.target;if(e&&e.parentNode&&e.nodeName=='BR'&&(n=t.getParentBlock(e))){Event.remove(b,'DOMNodeInserted',handler);if(e.previousSibling||e.nextSibling)ed.dom.remove(e);}};Event._add(b,'DOMNodeInserted',handler);window.setTimeout(function(){Event._remove(b,'DOMNodeInserted',handler);},1);}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,extend=tinymce.extend;tinymce.create('tinymce.ControlManager',{ControlManager:function(ed,s){var t=this,i;s=s||{};t.editor=ed;t.controls={};t.onAdd=new tinymce.util.Dispatcher(t);t.onPostRender=new tinymce.util.Dispatcher(t);t.prefix=s.prefix||ed.id+'_';t._cls={};t.onPostRender.add(function(){each(t.controls,function(c){c.postRender();});});},get:function(id){return this.controls[this.prefix+id]||this.controls[id];},setActive:function(id,s){var c=null;if(c=this.get(id))c.setActive(s);return c;},setDisabled:function(id,s){var c=null;if(c=this.get(id))c.setDisabled(s);return c;},add:function(c){var t=this;if(c){t.controls[c.id]=c;t.onAdd.dispatch(c,t);}return c;},createControl:function(n){var c,t=this,ed=t.editor;each(ed.plugins,function(p){if(p.createControl){c=p.createControl(n,t);if(c)return false;}});switch(n){case"|":case"separator":return t.createSeparator();}if(!c&&ed.buttons&&(c=ed.buttons[n]))return t.createButton(n,c);return t.add(c);},createDropMenu:function(id,s,cc){var t=this,ed=t.editor,c,bm,v,cls;s=extend({'class':'mceDropDown',constrain:ed.settings.constrain_menus},s);s['class']=s['class']+' '+ed.getParam('skin')+'Skin';if(v=ed.getParam('skin_variant'))s['class']+=' '+ed.getParam('skin')+'Skin'+v.substring(0,1).toUpperCase()+v.substring(1);id=t.prefix+id;cls=cc||t._cls.dropmenu||tinymce.ui.DropMenu;c=t.controls[id]=new cls(id,s);c.onAddItem.add(function(c,o){var s=o.settings;s.title=ed.getLang(s.title,s.title);if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,s.value);};}});ed.onRemove.add(function(){c.destroy();});if(tinymce.isIE){c.onShowMenu.add(function(){var s=ed.selection,n=s.getNode();if(n.nodeName=='IMG')bm=s.getBookmark();else bm=0;});c.onHideMenu.add(function(){if(bm)ed.selection.moveToBookmark(bm);});}return t.add(c);},createListBox:function(id,s,cc){var t=this,ed=t.editor,cmd,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,scope:s.scope,control_manager:t},s);id=t.prefix+id;if(ed.settings.use_native_selects)c=new tinymce.ui.NativeListBox(id,s);else{cls=cc||t._cls.listbox||tinymce.ui.ListBox;c=new cls(id,s);}t.controls[id]=c;if(tinymce.isWebKit){c.onPostRender.add(function(c,n){Event.add(n,'mousedown',function(){ed.bookmark=ed.selection.getBookmark('simple');});Event.add(n,'focus',function(){ed.selection.moveToBookmark(ed.bookmark);ed.bookmark=null;});});}if(c.hideMenu)ed.onMouseDown.add(c.hideMenu,c);return t.add(c);},createButton:function(id,s,cc){var t=this,ed=t.editor,o,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick&&!s.menu_button){s.onclick=function(){ed.execCommand(s.cmd,s.ui||false,s.value);};}s=extend({title:s.title,'class':'mce_'+id,unavailable_prefix:ed.getLang('unavailable',''),scope:s.scope,control_manager:t},s);id=t.prefix+id;if(s.menu_button){cls=cc||t._cls.menubutton||tinymce.ui.MenuButton;c=new cls(id,s);ed.onMouseDown.add(c.hideMenu,c);}else{cls=t._cls.button||tinymce.ui.Button;c=new cls(id,s);}return t.add(c);},createMenuButton:function(id,s){s=s||{};s.menu_button=1;return this.createButton(id,s);},createSplitButton:function(id,s,cc){var t=this,ed=t.editor,cmd,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,scope:s.scope,control_manager:t},s);id=t.prefix+id;cls=cc||t._cls.splitbutton||tinymce.ui.SplitButton;c=t.add(new cls(id,s));ed.onMouseDown.add(c.hideMenu,c);return c;},createColorSplitButton:function(id,s,cc){var t=this,ed=t.editor,cmd,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,'menu_class':ed.getParam('skin')+'Skin',scope:s.scope,more_colors_title:ed.getLang('more_colors')},s);id=t.prefix+id;cls=cc||t._cls.colorsplitbutton||tinymce.ui.ColorSplitButton;c=new cls(id,s);ed.onMouseDown.add(c.hideMenu,c);ed.onRemove.add(function(){c.destroy();});return t.add(c);},createToolbar:function(id,s,cc){var c,t=this,cls;id=t.prefix+id;cls=cc||t._cls.toolbar||tinymce.ui.Toolbar;c=new cls(id,s);if(t.get(id))return null;return t.add(c);},createSeparator:function(cc){var cls=cc||this._cls.separator||tinymce.ui.Separator;return new cls();},setControlType:function(n,c){return this._cls[n.toLowerCase()]=c;},destroy:function(){each(this.controls,function(c){c.destroy();});this.controls=null;}});})();(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each,isIE=tinymce.isIE,isOpera=tinymce.isOpera;tinymce.create('tinymce.WindowManager',{WindowManager:function(ed){var t=this;t.editor=ed;t.onOpen=new Dispatcher(t);t.onClose=new Dispatcher(t);t.params={};t.features={};},open:function(s,p){var t=this,f='',x,y,mo=t.editor.settings.dialog_type=='modal',w,sw,sh,vp=tinymce.DOM.getViewPort(),u;s=s||{};p=p||{};sw=isOpera?vp.w:screen.width;sh=isOpera?vp.h:screen.height;s.name=s.name||'mc_'+new Date().getTime();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240);s.resizable=true;s.left=s.left||parseInt(sw/ 2.0) - (s.width /2.0);s.top=s.top||parseInt(sh/ 2.0) - (s.height /2.0);p.inline=false;p.mce_width=s.width;p.mce_height=s.height;p.mce_auto_focus=s.auto_focus;if(mo){if(isIE){s.center=true;s.help=false;s.dialogWidth=s.width+'px';s.dialogHeight=s.height+'px';s.scroll=s.scrollbars||false;}else s.modal=s.alwaysRaised=s.dialog=s.centerscreen=s.dependent=true;}each(s,function(v,k){if(tinymce.is(v,'boolean'))v=v?'yes':'no';if(!/^(name|url)$/.test(k)){if(isIE&&mo)f+=(f?';':'')+k+':'+v;else f+=(f?',':'')+k+'='+v;}});t.features=s;t.params=p;t.onOpen.dispatch(t,s,p);u=s.url||s.file;if(tinymce.relaxedDomain)u+=(u.indexOf('?')==-1?'?':'&')+'mce_rdomain='+tinymce.relaxedDomain;try{if(isIE&&mo){w=1;window.showModalDialog(s.url||s.file,window,f);}else w=window.open(u,s.name,f);}catch(ex){}if(!w)alert(t.editor.getLang('popup_blocked'));},close:function(w){w.close();this.onClose.dispatch(this);},createInstance:function(cl,a,b,c,d,e){var f=tinymce.resolve(cl);return new f(a,b,c,d,e);},confirm:function(t,cb,s){cb.call(s||this,confirm(this._decode(this.editor.getLang(t,t))));},alert:function(tx,cb,s){var t=this;alert(t._decode(t.editor.getLang(tx,tx)));if(cb)cb.call(s||t);},_decode:function(s){return tinymce.DOM.decode(s).replace(/\\n/g,'\n');}});}());
\ No newline at end of file
index 306a021d56be4a364dc3bdf8a4ca8e4485696c14..8ef7d8b1bd6a0732607304dab067e64a398eeb4e 100644 (file)
-// Some global instances, this will be filled later
-var tinyMCE = null, tinyMCELang = null;
-
-function TinyMCE_Popup() {
-};
-
-TinyMCE_Popup.prototype = {
-       findWin : function(w) {
-               var c;
-
-               // Check parents
-               c = w;
-               while (c && (c = c.parent) != null) {
-                       if (typeof(c.tinyMCE) != "undefined")
-                               return c;
-               }
-
-               // Check openers
-               c = w;
-               while (c && (c = c.opener) != null) {
-                       if (typeof(c.tinyMCE) != "undefined")
-                               return c;
-               }
-
-               // Try top
-               if (typeof(top.tinyMCE) != "undefined")
-                       return top;
-
-               return null;
-       },
-
-       init : function() {
-               var win = window.opener ? window.opener : window.dialogArguments, c;
-               var inst, re, title, divElm;
-
-               if (!win)
-                       win = this.findWin(window);
-
-               if (!win) {
-                       alert("tinyMCE object reference not found from popup.");
-                       return;
-               }
-
-               window.opener = win;
-               this.windowOpener = win;
-               this.onLoadEval = "";
-
-               // Setup parent references
-               tinyMCE = win.tinyMCE;
-               tinyMCELang = win.tinyMCELang;
-
-               inst = tinyMCE.selectedInstance;
-               this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;
-               this.storeSelection = (tinyMCE.isRealIE) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);
-
-               if (this.isWindow)
-                       window.focus();
-
-               // Store selection
-               if (this.storeSelection)
-                       inst.selectionBookmark = inst.selection.getBookmark(true);
-
-               // Setup dir
-               if (tinyMCELang.lang_dir)
-                       document.dir = tinyMCELang.lang_dir;
-
-               // Setup title
-               re = new RegExp('{|\\\$|}', 'g');
-               title = document.title.replace(re, "");
-               if (typeof(tinyMCELang[title]) != "undefined") {
-                       divElm = document.createElement("div");
-                       divElm.innerHTML = tinyMCELang[title];
-                       document.title = divElm.innerHTML;
-
-                       if (typeof(tinyMCE.setWindowTitle) != 'undefined')
-                               tinyMCE.setWindowTitle(window, divElm.innerHTML);
-               }
-
-               // Output Popup CSS class
-               document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');
-
-               if (tinyMCE.getParam("popups_css_add")) {
-                       c = tinyMCE.getParam("popups_css_add");
-
-                       // Is relative
-                       if (c.indexOf('://') == -1 && c.charAt(0) != '/')
-                               c = tinyMCE.documentBasePath + "/" + c;
-
-                       document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');
-               }
-
-               tinyMCE.addEvent(window, "load", this.onLoad);
-       },
-
-       onLoad : function() {
-               var dir, i, elms, body = document.body;
-
-               if (tinyMCE.getWindowArg('mce_replacevariables', true))
-                       body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
-
-               dir = tinyMCE.selectedInstance.settings.directionality;
-               if (dir == "rtl" && document.forms && document.forms.length > 0) {
-                       elms = document.forms[0].elements;
-                       for (i=0; i<elms.length; i++) {
-                               if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")
-                                       elms[i].dir = dir;
-                       }
-               }
-
-               if (body.style.display == 'none')
-                       body.style.display = 'block';
-
-               // Execute real onload (Opera fix)
-               if (tinyMCEPopup.onLoadEval !== '')
-                       eval(tinyMCEPopup.onLoadEval);
-       },
-
-       executeOnLoad : function(str) {
-               if (tinyMCE.isOpera && parseFloat(opera.version()) < 9.5)
-                       this.onLoadEval = str;
-               else
-                       eval(str);
-       },
-
-       resizeToInnerSize : function() {
-               var i, doc, body, oldMargin, wrapper, iframe, nodes, dx, dy;
-
-               // Netscape 7.1 workaround
-               if (this.isWindow && tinyMCE.isNS71) {
-                       window.resizeBy(0, 10);
-                       return;
-               }
-
-               if (this.isWindow) {
-                       doc = document;
-                       body = doc.body;
-
-                       if (body.style.display == 'none')
-                               body.style.display = 'block';
-
-                       // Remove margin
-                       oldMargin = body.style.margin;
-                       body.style.margin = '0';
-
-                       // Create wrapper
-                       wrapper = doc.createElement("div");
-                       wrapper.id = 'mcBodyWrapper';
-                       wrapper.style.display = 'none';
-                       wrapper.style.margin = '0';
-
-                       // Wrap body elements
-                       nodes = doc.body.childNodes;
-                       for (i=nodes.length-1; i>=0; i--) {
-                               if (wrapper.hasChildNodes())
-                                       wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
-                               else
-                                       wrapper.appendChild(nodes[i].cloneNode(true));
-
-                               nodes[i].parentNode.removeChild(nodes[i]);
-                       }
-
-                       // Add wrapper
-                       doc.body.appendChild(wrapper);
-
-                       // Create iframe
-                       iframe = document.createElement("iframe");
-                       iframe.id = "mcWinIframe";
-                       iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings.default_document;
-                       iframe.width = "100%";
-                       iframe.height = "100%";
-                       iframe.style.margin = '0';
-
-                       // Add iframe
-                       doc.body.appendChild(iframe);
-
-                       // Measure iframe
-                       iframe = document.getElementById('mcWinIframe');
-                       dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;
-                       dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;
-
-                       // Resize window
-                       // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);
-                       window.resizeBy(dx, dy);
-
-                       // Hide iframe and show wrapper
-                       body.style.margin = oldMargin;
-                       iframe.style.display = 'none';
-                       wrapper.style.display = 'block';
-               }
-       },
-
-       resizeToContent : function() {
-               var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
-               var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
-               var elm, width, height, x, y, dx, dy;
-
-               if (isOpera)
-                       return;
-
-               if (isMSIE) {
-                       try { window.resizeTo(10, 10); } catch (e) {}
-
-                       elm = document.body;
-                       width = elm.offsetWidth;
-                       height = elm.offsetHeight;
-                       dx = (elm.scrollWidth - width) + 4;
-                       dy = elm.scrollHeight - height;
-
-                       try { window.resizeBy(dx, dy); } catch (e) {}
-               } else {
-                       window.scrollBy(1000, 1000);
-                       if (window.scrollX > 0 || window.scrollY > 0) {
-                               window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
-                               window.sizeToContent();
-                               window.scrollTo(0, 0);
-                               x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
-                               y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
-                               window.moveTo(x, y);
-                       }
-               }
-       },
-
-       getWindowArg : function(name, default_value) {
-               return tinyMCE.getWindowArg(name, default_value);
-       },
-
-       restoreSelection : function() {
-               var inst;
-
-               if (this.storeSelection) {
-                       inst = tinyMCE.selectedInstance;
-
-                       inst.getWin().focus();
-
-                       if (inst.selectionBookmark)
-                               inst.selection.moveToBookmark(inst.selectionBookmark);
-               }
-       },
-
-       execCommand : function(command, user_interface, value) {
-               var inst = tinyMCE.selectedInstance;
-
-               this.restoreSelection();
-               inst.execCommand(command, user_interface, value);
-
-               // Store selection
-               if (this.storeSelection)
-                       inst.selectionBookmark = inst.selection.getBookmark(true);
-       },
-
-       close : function() {
-               tinyMCE.closeWindow(window);
-       },
-
-       pickColor : function(e, element_id) {
-               tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {
-                       element_id : element_id,
-                       document : document,
-                       window : window,
-                       store_selection : false
-               });
-       },
-
-       openBrowser : function(element_id, type, option) {
-               var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
-               var url = document.getElementById(element_id).value;
-
-               tinyMCE.setWindowArg("window", window);
-               tinyMCE.setWindowArg("document", document);
-
-               // Call to external callback
-               if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")
-                       alert("Callback function: " + cb + " could not be found.");
-               else
-                       eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");
-       },
-
-       importClass : function(c) {
-               var n;
-
-               window[c] = function() {};
-
-               for (n in window.opener[c].prototype)
-                       window[c].prototype[n] = window.opener[c].prototype[n];
-
-               window[c].constructor = window.opener[c].constructor;
-       }
-
-       };
-
-// Setup global instance
-var tinyMCEPopup = new TinyMCE_Popup();
-
-tinyMCEPopup.init();
+// Some global instances\r
+var tinymce = null, tinyMCEPopup, tinyMCE;\r
+\r
+tinyMCEPopup = {\r
+       init : function() {\r
+               var t = this, w, ti, li, q, i, it;\r
+\r
+               li = ('' + document.location.search).replace(/^\?/, '').split('&');\r
+               q = {};\r
+               for (i=0; i<li.length; i++) {\r
+                       it = li[i].split('=');\r
+                       q[unescape(it[0])] = unescape(it[1]);\r
+               }\r
+\r
+               if (q.mce_rdomain)\r
+                       document.domain = q.mce_rdomain;\r
+\r
+               // Find window & API\r
+               w = t.getWin();\r
+               tinymce = w.tinymce;\r
+               tinyMCE = w.tinyMCE;\r
+               t.editor = tinymce.EditorManager.activeEditor;\r
+               t.params = t.editor.windowManager.params;\r
+\r
+               // Setup local DOM\r
+               t.dom = t.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document);\r
+               t.dom.loadCSS(t.editor.settings.popup_css);\r
+\r
+               // Setup on init listeners\r
+               t.listeners = [];\r
+               t.onInit = {\r
+                       add : function(f, s) {\r
+                               t.listeners.push({func : f, scope : s});\r
+                       }\r
+               };\r
+\r
+               t.isWindow = !t.getWindowArg('mce_inline');\r
+               t.id = t.getWindowArg('mce_window_id');\r
+               t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window);\r
+       },\r
+\r
+       getWin : function() {\r
+               return window.dialogArguments || opener || parent || top;\r
+       },\r
+\r
+       getWindowArg : function(n, dv) {\r
+               var v = this.params[n];\r
+\r
+               return tinymce.is(v) ? v : dv;\r
+       },\r
+\r
+       getParam : function(n, dv) {\r
+               return this.editor.getParam(n, dv);\r
+       },\r
+\r
+       getLang : function(n, dv) {\r
+               return this.editor.getLang(n, dv);\r
+       },\r
+\r
+       execCommand : function(cmd, ui, val, a) {\r
+               a = a || {};\r
+               a.skip_focus = 1;\r
+\r
+               this.restoreSelection();\r
+               return this.editor.execCommand(cmd, ui, val, a);\r
+       },\r
+\r
+       resizeToInnerSize : function() {\r
+               var t = this, n, b = document.body, vp = t.dom.getViewPort(window), dw, dh;\r
+\r
+               dw = t.getWindowArg('mce_width') - vp.w;\r
+               dh = t.getWindowArg('mce_height') - vp.h;\r
+\r
+               if (t.isWindow)\r
+                       window.resizeBy(dw, dh);\r
+               else\r
+                       t.editor.windowManager.resizeBy(dw, dh, t.id);\r
+       },\r
+\r
+       executeOnLoad : function(s) {\r
+               this.onInit.add(function() {\r
+                       eval(s);\r
+               });\r
+       },\r
+\r
+       storeSelection : function() {\r
+               this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark('simple');\r
+       },\r
+\r
+       restoreSelection : function() {\r
+               var t = tinyMCEPopup;\r
+\r
+               if (!t.isWindow && tinymce.isIE)\r
+                       t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark);\r
+       },\r
+\r
+       requireLangPack : function() {\r
+               var u = this.getWindowArg('plugin_url') || this.getWindowArg('theme_url');\r
+\r
+               if (u && this.editor.settings.language) {\r
+                       u += '/langs/' + this.editor.settings.language + '_dlg.js';\r
+\r
+                       if (!tinymce.ScriptLoader.isDone(u)) {\r
+                               document.write('<script type="text/javascript" src="' + u + '"></script>');\r
+                               tinymce.ScriptLoader.markDone(u);\r
+                       }\r
+               }\r
+       },\r
+\r
+       pickColor : function(e, element_id) {\r
+               this.execCommand('mceColorPicker', true, {\r
+                       color : document.getElementById(element_id).value,\r
+                       func : function(c) {\r
+                               document.getElementById(element_id).value = c;\r
+\r
+                               try {\r
+                                       document.getElementById(element_id).onchange();\r
+                               } catch (ex) {\r
+                                       // Try fire event, ignore errors\r
+                               }\r
+                       }\r
+               });\r
+       },\r
+\r
+       openBrowser : function(element_id, type, option) {\r
+               tinyMCEPopup.restoreSelection();\r
+               this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);\r
+       },\r
+\r
+       close : function() {\r
+               var t = this;\r
+\r
+               // To avoid domain relaxing issue in Opera\r
+               function close() {\r
+                       t.editor.windowManager.close(window, t.id);\r
+                       tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup\r
+               };\r
+\r
+               if (tinymce.isOpera)\r
+                       t.getWin().setTimeout(close, 0);\r
+               else\r
+                       close();\r
+       },\r
+\r
+       // Internal functions   \r
+\r
+       _restoreSelection : function() {\r
+               var e = window.event.srcElement;\r
+\r
+               if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button'))\r
+                       tinyMCEPopup.restoreSelection();\r
+       },\r
+\r
+/*     _restoreSelection : function() {\r
+               var e = window.event.srcElement;\r
+\r
+               // If user focus a non text input or textarea\r
+               if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')\r
+                       tinyMCEPopup.restoreSelection();\r
+       },*/\r
+\r
+       _onDOMLoaded : function() {\r
+               var t = this, ti = document.title, bm, h;\r
+\r
+               // Translate page\r
+               h = document.body.innerHTML;\r
+\r
+               // Replace a=x with a="x" in IE\r
+               if (tinymce.isIE)\r
+                       h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"')\r
+\r
+               document.dir = t.editor.getParam('directionality','');\r
+               document.body.innerHTML = t.editor.translate(h);\r
+               document.title = ti = t.editor.translate(ti);\r
+               document.body.style.display = '';\r
+\r
+               // Restore selection in IE when focus is placed on a non textarea or input element of the type text\r
+               if (tinymce.isIE)\r
+                       document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);\r
+\r
+               t.restoreSelection();\r
+               t.resizeToInnerSize();\r
+\r
+               // Set inline title\r
+               if (!t.isWindow)\r
+                       t.editor.windowManager.setTitle(ti, t.id);\r
+               else\r
+                       window.focus();\r
+\r
+               if (!tinymce.isIE && !t.isWindow) {\r
+                       tinymce.dom.Event._add(document, 'focus', function() {\r
+                               t.editor.windowManager.focus(t.id)\r
+                       });\r
+               }\r
+\r
+               // Patch for accessibility\r
+               tinymce.each(t.dom.select('select'), function(e) {\r
+                       e.onkeydown = tinyMCEPopup._accessHandler;\r
+               });\r
+\r
+               // Call onInit\r
+               // Init must be called before focus so the selection won't get lost by the focus call\r
+               tinymce.each(t.listeners, function(o) {\r
+                       o.func.call(o.scope, t.editor);\r
+               });\r
+\r
+               // Move focus to window\r
+               if (t.getWindowArg('mce_auto_focus', true)) {\r
+                       window.focus();\r
+\r
+                       // Focus element with mceFocus class\r
+                       tinymce.each(document.forms, function(f) {\r
+                               tinymce.each(f.elements, function(e) {\r
+                                       if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {\r
+                                               e.focus();\r
+                                               return false; // Break loop\r
+                                       }\r
+                               });\r
+                       });\r
+               }\r
+\r
+               document.onkeyup = tinyMCEPopup._closeWinKeyHandler;\r
+       },\r
+\r
+       _accessHandler : function(e) {\r
+               e = e || window.event;\r
+\r
+               if (e.keyCode == 13 || e.keyCode == 32) {\r
+                       e = e.target || e.srcElement;\r
+\r
+                       if (e.onchange)\r
+                               e.onchange();\r
+\r
+                       return tinymce.dom.Event.cancel(e);\r
+               }\r
+       },\r
+\r
+       _closeWinKeyHandler : function(e) {\r
+               e = e || window.event;\r
+\r
+               if (e.keyCode == 27)\r
+                       tinyMCEPopup.close();\r
+       },\r
+\r
+       _wait : function() {\r
+               var t = this, ti;\r
+\r
+               if (tinymce.isIE && document.location.protocol != 'https:') {\r
+                       // Fake DOMContentLoaded on IE\r
+                       document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');\r
+                       document.getElementById("__ie_onload").onreadystatechange = function() {\r
+                               if (this.readyState == "complete") {\r
+                                       t._onDOMLoaded();\r
+                                       document.getElementById("__ie_onload").onreadystatechange = null; // Prevent leak\r
+                               }\r
+                       };\r
+               } else {\r
+                       if (tinymce.isIE || tinymce.isWebKit) {\r
+                               ti = setInterval(function() {\r
+                                       if (/loaded|complete/.test(document.readyState)) {\r
+                                               clearInterval(ti);\r
+                                               t._onDOMLoaded();\r
+                                       }\r
+                               }, 10);\r
+                       } else {\r
+                               window.addEventListener('DOMContentLoaded', function() {\r
+                                       t._onDOMLoaded();\r
+                               }, false);\r
+                       }\r
+               }\r
+       }\r
+};\r
+\r
+tinyMCEPopup.init();\r
+tinyMCEPopup._wait(); // Wait for DOM Content Loaded\r
index d14c858001ddc8ff06b01fc84db37df3ecf9eb8f..a4fa1a61ed889c554fef0879b45027e4307836c8 100644 (file)
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */
-
-function TinyMCE_Engine() {
-       var ua;
-
-       this.majorVersion = "2";
-       this.minorVersion = "1.3";
-       this.releaseDate = "2007-11-27";
-
-       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 = [];
-
-       // Browser check
-       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; // Will also be true on Safari
-       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;
-
-       // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those
-       if (this.isOpera) {
-               this.isMSIE = true;
-               this.isGecko = false;
-               this.isSafari =  false;
-       }
-
-       this.isIE = this.isMSIE;
-       this.isRealIE = this.isMSIE && !this.isOpera;
-
-       // TinyMCE editor id instance counter
-       this.idCounter = 0;
-};
-
-TinyMCE_Engine.prototype = {
-       init : function(settings) {
-               var theme, nl, baseHREF = "", i, cssPath, entities, h, p, src, elements = [], head;
-
-               // 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.
-               if (this.isMSIE5_0)
-                       return;
-
-               this.settings = settings;
-
-               // Check if valid browser has execcommand support
-               if (typeof(document.execCommand) == 'undefined')
-                       return;
-
-               // Get script base path
-               if (!tinyMCE.baseURL) {
-                       // Search through head
-                       head = document.getElementsByTagName('head')[0];
-
-                       if (head) {
-                               for (i=0, nl = head.getElementsByTagName('script'); i<nl.length; i++)
-                                       elements.push(nl[i]);
-                       }
-
-                       // Search through rest of document
-                       for (i=0, nl = document.getElementsByTagName('script'); i<nl.length; i++)
-                               elements.push(nl[i]);
-
-                       // If base element found, add that infront of baseURL
-                       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' : '';
-
-                                       // Force it absolute if page has a base href
-                                       if (baseHREF !== '' && src.indexOf('://') == -1)
-                                               tinyMCE.baseURL = baseHREF + src;
-                                       else
-                                               tinyMCE.baseURL = src;
-
-                                       break;
-                               }
-                       }
-               }
-
-               // Get document base path
-               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 not HTTP absolute
-               if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {
-                       // If site absolute
-                       tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;
-               }
-
-               // Set default values on settings
-               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);
-               this._def("save_on_tinymce_forms", false);
-
-               // Force strict loading mode to false on non Gecko browsers
-               if (this.isMSIE && !this.isOpera)
-                       this.settings.strict_loading_mode = false;
-
-               // Browser check IE
-               if (this.isMSIE && this.settings.browsers.indexOf('msie') == -1)
-                       return;
-
-               // Browser check Gecko
-               if (this.isGecko && this.settings.browsers.indexOf('gecko') == -1)
-                       return;
-
-               // Browser check Safari
-               if (this.isSafari && this.settings.browsers.indexOf('safari') == -1)
-                       return;
-
-               // Browser check Opera
-               if (this.isOpera && this.settings.browsers.indexOf('opera') == -1)
-                       return;
-
-               // If not super absolute make it so
-               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;
-               }
-
-               // Trim away query part
-               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);'; // Make unique URL non real URL
-               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'];
-
-               // Theme url
-               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", "");
-
-                       // Is relative
-                       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", "");
-
-                       // Is relative
-                       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";
-               }
-
-               // Only do this once
-               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);
-
-               // Add plugins
-               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');
-                       }
-               }
-
-               // Setup entities
-               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];
-               }
-
-               // Save away this config
-               settings.index = this.configs.length;
-               this.configs[this.configs.length] = settings;
-
-               // Start loading first one in chain
-               this.loadNextScript();
-
-               // Force flicker free CSS backgrounds in IE
-               if (this.isIE && !this.isOpera) {
-                       try {
-                               document.execCommand('BackgroundImageCache', false, true);
-                       } catch (e) {
-                               // Ignore
-                       }
-               }
-
-               // Setup XML encoding regexps
-               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];
-
-               // Use the previous plugin object base URL used when loading external plugins
-               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; // Done with loading
-       },
-
-       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) {
-                               /* Make sure it doesn't exist. */
-                               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) {
-                               // Is relative, make absolute
-                               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;
-
-               // Find MCE instance linked to given form element and copy it's value
-               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;
-
-               // Remove from instances
-               for (n in tinyMCE.instances) {
-                       i = tinyMCE.instances[n];
-
-                       if (tinyMCE.isInstance(i) && ti != i)
-                                       t[n] = i;
-               }
-
-               tinyMCE.instances = t;
-
-               // Remove from global undo/redo
-               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;
-
-               // Dispatch remove instance call
-               tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);
-
-               return ti;
-       },
-
-       removeMCEControl : function(editor_id) {
-               var inst = tinyMCE.getInstanceById(editor_id), h, re, ot, tn, n;
-
-               if (inst) {
-                       inst.switchSettings();
-
-                       editor_id = inst.editorId;
-                       h = tinyMCE.getContent(editor_id);
-
-                       this.removeInstance(inst);
-
-                       tinyMCE.selectedElement = null;
-                       tinyMCE.selectedInstance = null;
-
-                       tinyMCE.selectedElement = null;
-                       tinyMCE.selectedInstance = null;
-
-                       // Try finding an instance
-                       for (n in tinyMCE.instances) {
-                               if (!tinyMCE.isInstance(tinyMCE.instances[n]))
-                                       continue;
-
-                               tinyMCE.selectedInstance = tinyMCE.instances[n];
-                               break;
-                       }
-
-                       // Remove element
-                       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;
-
-               // Default to false
-               if (typeof(skip_cleanup) == "undefined")
-                       skip_cleanup = false;
-
-               // Default to false
-               if (typeof(skip_callback) == "undefined")
-                       skip_callback = false;
-
-               // Cleanup and set all form fields
-               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;
-
-                       // IE bug lost focus on images in absolute divs Bug #1534575
-                       if (focus && (!r || !r.item))
-                               inst.contentWindow.focus();
-
-                       // Reset design mode if lost
-                       inst.autoResetDesignMode();
-
-                       this.selectedElement = inst.getFocusElement();
-                       inst.select();
-                       tinyMCE.execCommand(command, user_interface, value);
-
-                       // Cancel event so it doesn't call onbeforeonunlaod
-                       if (tinyMCE.isIE && window.event != null)
-                               tinyMCE.cancelEvent(window.event);
-               }
-       },
-
-       execCommand : function(command, user_interface, value) {
-               var inst = tinyMCE.selectedInstance, n, pe, te;
-
-               // Default input
-               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":
-                               // Resets the designmode state of the editors in Gecko
-                               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) {
-                                                       // Ignore any errors
-                                               }
-                                       }
-                               }
-
-                               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");
-
-               // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs
-               if (tinyMCE.isRealIE)
-                       iframe.setAttribute("src", this.settings.default_document);
-
-               iframe.style.width = aw;
-               iframe.style.height = ah;
-
-               // Ugly hack for Gecko problem in strict mode
-               if (tinyMCE.settings.strict_loading_mode)
-                       iframe.style.marginBottom = '-5px';
-
-               // MSIE 5.0 issue
-               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;
-
-               // HTML values get XML encoded in strict mode
-               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();
-
-               // Not loaded correctly hit it again, Mozilla bug #997860
-               if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {
-                       // This part will remove the designMode status
-                       // Failes first time in Firefox 1.5b2 on Mac
-                       try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}
-                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);
-                       return;
-               }
-
-               // Wait for it to load
-               if (!head || !doc.body) {
-                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);
-                       return;
-               }
-
-               // Import theme specific content CSS the user specific
-               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);
-
-               // Setup keyboard shortcuts
-               if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {
-                       inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');
-                       inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');
-               }
-
-               // BlockFormat shortcuts keys
-               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>');
-
-               // Add default shortcuts for gecko
-               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');
-               }
-
-               // Setup span styles
-               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;
-
-               // Add on document element in Mozilla
-               if (!tinyMCE.isIE)
-                       doc.documentElement.editorId = editor_id;
-
-               inst.setBaseHREF(tinyMCE.settings.base_href);
-
-               // Replace new line characters to BRs
-               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");
-               }
-
-               // Open closed anchors
-       //      content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
-
-               // Call custom cleanup code
-               content = tinyMCE.storeAwayURLs(content);
-               content = tinyMCE._customCleanup(inst, "insert_to_editor", content);
-
-               if (tinyMCE.isIE) {
-                       // Ugly!!!
-                       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);
-
-               // Fix for bug #958637
-               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);
-
-                               // Produces permission denied error in MSIE 5.5
-                               try {
-                                       tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));
-                               } catch(e) {
-                                       // Ignore
-                               }
-                       } else
-                               tinyMCE._setHTML(inst.getDoc(), content);
-               }
-
-               // Fix for bug #957681
-               //inst.getDoc().designMode = inst.getDoc().designMode;
-
-               tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings.visual, inst);
-               tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());
-
-               // Re-add design mode on mozilla
-               if (!tinyMCE.isIE)
-                       tinyMCE.addEventHandlers(inst);
-
-               // Add blur handler
-               if (tinyMCE.isIE) {
-                       tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);
-                       tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953
-
-                       // Workaround for drag drop/copy paste base href bug
-                       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);
-                       }
-               }
-
-               // Trigger node change, this call locks buttons for tables and so forth
-               inst.select();
-               tinyMCE.selectedElement = inst.contentWindow.document.body;
-
-               // Call custom DOM cleanup
-               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 });
-
-               // Cleanup any mess left from storyAwayURLs
-               if (tinyMCE.isGecko) {
-                       // Remove mce_src from textnodes and comments
-                       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;
-                       });
-               }
-
-               // Remove Gecko spellchecking
-               if (tinyMCE.isGecko)
-                       inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck");
-
-               // Cleanup any mess left from storyAwayURLs
-               tinyMCE._removeInternal(inst.getBody());
-
-               inst.select();
-               tinyMCE.triggerNodeChange(false, true);
-       },
-
-       storeAwayURLs : function(s) {
-               // Remove all mce_src, mce_href and replace them with new ones
-               // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
-               // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
-
-               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) {
-                       // Remove mce_src from textnodes and comments
-                       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;
-
-               // Skip form element removal
-               if (!tinyMCE.getParam('hide_selects_on_submit'))
-                       return;
-
-               // Check if form is valid
-               if (typeof(form_obj) == "undefined" || form_obj == null)
-                       return;
-
-               // If not a form, find the form
-               if (form_obj.nodeName != "FORM") {
-                       if (form_obj.form)
-                               form_obj = form_obj.form;
-                       else
-                               form_obj = tinyMCE.getParentElement(form_obj, "form");
-               }
-
-               // Still nothing
-               if (form_obj == null)
-                       return;
-
-               // Disable all UI form elements that TinyMCE created
-               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;
-
-               // Remove odd, error
-               if (typeof(tinyMCE) == "undefined")
-                       return true;
-
-               //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));
-
-               if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))
-                       return false;
-
-               switch (e.type) {
-                       case "beforedeactivate": // Was added due to bug #1439953
-                       case "blur":
-                               if (tinyMCE.selectedInstance)
-                                       tinyMCE.selectedInstance.execCommand('mceEndTyping');
-
-                               tinyMCE.hideMenus();
-
-                               return;
-
-                       // Workaround for drag drop/copy paste base href bug
-                       case "drop":
-                       case "beforepaste":
-/*                             if (tinyMCE.selectedInstance)
-                                       tinyMCE.selectedInstance.setBaseHREF(null);
-
-                               // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks
-                               // This logic forces the width/height to be in pixels while the user is drag/dropping
-                               // NOTE: This has been disabled for now since it messes up copy/paste that is far more important than image drag
-                               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();
-
-                               // Insert P element
-                               if ((tinyMCE.isGecko || tinyMCE.isOpera || tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && e.keyCode == 13 && !e.shiftKey) {
-                                       // Insert P element instead of BR
-                                       if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {
-                                               // Cancel event
-                                               tinyMCE.execCommand("mceAddUndoLevel");
-                                               return tinyMCE.cancelEvent(e);
-                                       }
-                               }
-
-                               // Handle backspace
-                               if ((tinyMCE.isGecko && !tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
-                                       // Insert P element instead of BR
-                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
-                                               // Cancel event
-                                               tinyMCE.execCommand("mceAddUndoLevel");
-                                               return tinyMCE.cancelEvent(e);
-                                       }
-                               }
-
-                               // Return key pressed
-                               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;
-
-                                               // Cancel event
-                                               e.returnValue = false;
-                                               e.cancelBubble = true;
-
-                                               // Insert BR element
-                                               rng.pasteHTML("<br />");
-                                               rng.collapse(false);
-                                               rng.select();
-
-                                               tinyMCE.execCommand("mceAddUndoLevel");
-                                               tinyMCE.triggerNodeChange(false);
-                                               return false;
-                                       }
-                               }
-
-                               // Backspace or delete
-                               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;
-
-                               // Handle backspace
-                               if (tinyMCE.isGecko && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
-                                       // Insert P element instead of BR
-                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
-                                               // Cancel event
-                                               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;
-
-                               // Update visualaids on tabs
-                               if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)
-                                       tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings.visual, tinyMCE.selectedInstance);
-
-                               // Fix empty elements on return/enter, check where enter occured
-                               if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13)
-                                       tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
-
-                               // Fix empty elements on return/enter
-                               if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) {
-                                       elm = tinyMCE.enterKeyElement;
-                                       if (elm) {
-                                               var re = new RegExp('^HR|IMG|BR$','g'); // Skip these
-                                               var dre = new RegExp('^H[1-6]$','g'); // Add double on these
-
-                                               if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
-                                                       if (dre.test(elm.nodeName))
-                                                               elm.innerHTML = "&nbsp;&nbsp;";
-                                                       else
-                                                               elm.innerHTML = "&nbsp;";
-                                               }
-                                       }
-                               }
-
-                               // Check if it's a position key
-                               keys = tinyMCE.posKeyCodes;
-                               var posKey = false;
-                               for (i=0; i<keys.length; i++) {
-                                       if (keys[i] == e.keyCode) {
-                                               posKey = true;
-                                               break;
-                                       }
-                               }
-
-                               // MSIE custom key handling
-                               if (tinyMCE.isIE && tinyMCE.settings.custom_undo_redo) {
-                                       keys = [8, 46]; // Backspace,Delete
-
-                                       for (i=0; i<keys.length; i++) {
-                                               if (keys[i] == e.keyCode) {
-                                                       if (e.type == "keyup")
-                                                               tinyMCE.triggerNodeChange(false);
-                                               }
-                                       }
-                               }
-
-                               // If Ctrl key
-                               if (e.keyCode == 17)
-                                       return true;
-
-                               // Handle Undo/Redo when typing content
-
-                               if (tinyMCE.isGecko) {
-                                       // Start typing (not a position key or ctrl key, but ctrl+x and ctrl+p is ok)
-                                       if (!posKey && e.type == "keyup" && !e.ctrlKey || (e.ctrlKey && (e.keyCode == 86 || e.keyCode == 88)))
-                                               tinyMCE.execCommand("mceStartTyping");
-                               } else {
-                                       // IE seems to be working better with this setting
-                                       if (!posKey && e.type == "keyup")
-                                               tinyMCE.execCommand("mceStartTyping");
-                               }
-
-                               // Store undo bookmark
-                               if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)
-                                       inst.undoBookmark = inst.selection.getBookmark();
-
-                               // End typing (position key) or some Ctrl event
-                               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;
-                               }
-
-                               // Check instance event trigged on
-                               var targetBody = tinyMCE.getParentElement(e.target, "html");
-                               for (var instanceName in tinyMCE.instances) {
-                                       if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
-                                               continue;
-
-                                       inst = tinyMCE.instances[instanceName];
-
-                                       // Reset design mode if lost (on everything just in case)
-                                       inst.autoResetDesignMode();
-
-                                       // Use HTML element since users might click outside of body element
-                                       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;
-                                       }
-                               }
-
-                               // Add first bookmark location
-                               if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark && (e.type == "mouseup" || e.type == "dblclick"))
-                                       tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();
-
-                               // Reset selected node
-                               if (e.type != "focus")
-                                       tinyMCE.selectedNode = null;
-
-                               tinyMCE.triggerNodeChange(false);
-                               tinyMCE.execCommand("mceEndTyping");
-
-                               if (e.type == "mouseup")
-                                       tinyMCE.execCommand("mceAddUndoLevel");
-
-                               // Just in case
-                               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 += ');';
-
-               // Patch for IE7 bug with hover out not restoring correctly
-               if (tinyMCE.isRealIE)
-                       io = 'onmouseover="tinyMCE.lastHover = this;"';
-
-               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
-               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {
-                       // Tiled button
-                       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 {
-                       // Normal button
-                       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 += ');';
-
-               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
-               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;
-
-               // Is it a form that has a TinyMCE instance
-               if (tinyMCE.getParam('save_on_tinymce_forms')) {
-                       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;
-                                       }
-                               }
-                       }
-               } else
-                       found  = true;
-
-               // Is valid
-               if (found) {
-                       tinyMCE.removeTinyMCEFormElements(f);
-                       tinyMCE.triggerSave();
-               }
-
-               // Is it patched
-               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;
-
-               // Wait for everything to be loaded first
-               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;
-
-               // IE produces JS error if TinyMCE is placed in a frame
-               // It seems to have something to do with the selection not beeing
-               // correctly initialized in IE so this hack solves the problem
-               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 = [];
-
-                       // Add submit triggers
-                       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; // Do it only once
-
-                                       // Patch the form.submit function
-                                       if (tinyMCE.settings.submit_patch) {
-                                               try {
-                                                       form.mceOldSubmit = form.submit;
-                                                       form.submit = TinyMCE_Engine.prototype.submitPatch;
-                                               } catch (e) {
-                                                       // Do nothing
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Add editor instances based on mode
-                       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) {
-                                       // Focus breaks in Mozilla
-                                       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);});
-                                               // tinyMCE.addEvent(element, "mouseover", 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); });
-                                               // tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
-                                       }
-                               } else
-                                       tinyMCE.addMCEControl(element, elementId);
-                       }
-
-                       // Handle auto focus
-                       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];
-
-               // Fix bool values
-               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, st;
-
-               if (tinyMCE.selectedInstance) {
-                       inst = tinyMCE.selectedInstance;
-                       elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
-
-/*                     if (elm == inst.lastTriggerEl)
-                               return;
-
-                       inst.lastTriggerEl = elm;*/
-
-                       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();
-                       anySelection = !inst.selection.isCollapsed();
-
-                       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;
-
-               // Call custom cleanup
-               customCleanup = tinyMCE.settings.cleanup_callback;
-               if (customCleanup != '')
-                       content = tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback, window)(type, content, inst);
-
-               // Trigger theme cleanup
-               po = tinyMCE.themes[tinyMCE.settings.theme];
-               if (po && po.cleanup)
-                       content = po.cleanup(type, content, inst);
-
-               // Trigger plugin cleanups
-               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;
-
-               // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!
-               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;
-
-               // Replace all args as variables in URL
-               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) {
-                                       // Ignore
-                               }
-
-                               // Make it bigger if statusbar is forced
-                               if (tinyMCE.isGecko && win.document) {
-                                       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;
-
-               // Split
-               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;
-
-               // Glue
-               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 {
-                               // Why bother if there is no src or href broken
-                               if (!new RegExp('(src|href)=', 'g').test(h))
-                                       return h;
-
-                               // Restore src and href that gets messed up by Gecko
-                               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) {
-                                                       // Ignore, Firefox cast exception if local file wasn't found
-                                               }
-
-                                               n.removeAttribute("mce_tsrc");
-                                       }
-
-                                       if (xhref !== '') {
-                                               try {
-                                                       n.href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xhref);
-                                               } catch (e) {
-                                                       // Ignore, Firefox cast exception if local file wasn't found
-                                               }
-
-                                               n.removeAttribute("mce_thref");
-                                       }
-
-                                       return false;
-                               });
-
-                               // Restore text/comment nodes
-                               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;
-
-               // Force closed anchors open
-               //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
-
-               html_content = tinyMCE.cleanupHTMLCode(html_content);
-
-               // Try innerHTML if it fails use pasteHTML in MSIE
-               try {
-                       tinyMCE.setInnerHTML(doc.body, html_content);
-               } catch (e) {
-                       if (this.isMSIE)
-                               doc.body.createTextRange().pasteHTML(html_content);
-               }
-
-               // Content duplication bug fix
-               if (tinyMCE.isIE && tinyMCE.settings.fix_content_duplication) {
-                       // Remove P elements in P elements
-                       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;
-                               }
-                       }
-
-                       // Content duplication bug fix (Seems to be word crap)
-                       html = doc.body.innerHTML;
-
-                       // Always set the htmlText output
-                       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();
-
-               // Is cached, use that
-               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) {
-                                       // Just ignore any errors I know this is ugly!!
-                               }
-       
-                               if (!csses)
-                                       return [];
-
-                               for (i=0; i<csses.length; i++) {
-                                       selectorText = csses[i].selectorText;
-
-                                       // Can be multiple rules per selector
-                                       if (selectorText) {
-                                               rules = selectorText.split(',');
-                                               for (c=0; c<rules.length; c++) {
-                                                       rule = rules[c];
-
-                                                       // Strip spaces between selectors
-                                                       while (rule.indexOf(' ') == 0)
-                                                               rule = rule.substring(1);
-
-                                                       // Invalid rule
-                                                       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;
-
-                                                       // Is class rule
-                                                       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, ''); // Remove event blocker
-
-               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) {
-                       if (m.hasOwnProperty(n))
-                               c.prototype[n] = m[n];
-               }
-       },
-
-       extend : function(p, np) {
-               var o = {}, n;
-
-               o.parent = p;
-
-               for (n in p) {
-                       if (p.hasOwnProperty(n))
-                               o[n] = p[n];
-               }
-
-               for (n in np) {
-                       if (np.hasOwnProperty(n))
-                               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;
-               }
-       }
-
-       };
-
-// Global instances
-var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors
-var tinyMCE = new TinyMCE_Engine();
-var tinyMCELang = {};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */
-
-function TinyMCE_Control(settings) {
-       var t, i, tos, fu, p, x, fn, fu, pn, s = settings;
-
-       this.undoRedoLevel = true;
-       this.isTinyMCE_Control = true;
-
-       // Default settings
-       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
-       });
-
-       // Wrap old theme
-       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);
-       }
-
-       // Wrap old plugins
-       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) {
-                       // Ignore
-               }
-       },
-
-       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.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ?
-               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;
-
-               // Normal key press, then ignore it
-               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() {
-               // Add fix for tab/style.display none/block problems in Gecko
-               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();
-
-               // Weird, wheres that cursor selection?
-               return (!s || !s.rangeCount || s.rangeCount == 0);
-       },
-
-       isDirty : function() {
-               // Is content modified and not in a submit procedure
-               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");
-
-               // Removed class adding due to bug #1478272
-               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 text node or inline element wrap it in a block element
-                       if ((ne.nodeType == 3 && ne.nodeValue.replace(/\s+/g, '') != '') || (ne.nodeType == 1 && !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); // Select and collapse
-                       }
-               }
-       },
-
-       _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();
-
-               // Is not a undo specific command
-               if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))
-                       this.undoBookmark = null;
-
-               // Mozilla issue
-               if (!tinyMCE.isIE && !this.useCSS) {
-                       this._setUseCSS(false);
-                       this.useCSS = true;
-               }
-
-               //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
-               this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks
-
-               // Don't dispatch key commands
-               if (!/mceStartTyping|mceEndTyping/.test(command)) {
-                       if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))
-                               return;
-               }
-
-               // Fix align on images
-               if (focusElm && focusElm.nodeName == "IMG") {
-                       align = focusElm.getAttribute('align');
-                       img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;
-
-                       switch (command) {
-                               case "JustifyLeft":
-                                       if (align == 'left') {
-                                               img.setAttribute('align', ''); // Needed for IE
-                                               img.removeAttribute('align');
-                                       } else
-                                               img.setAttribute('align', 'left');
-
-                                       // Remove the div
-                                       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.setAttribute('align', ''); // Needed for IE
-                                       img.removeAttribute('align');
-
-                                       // Is centered
-                                       div = tinyMCE.getParentElement(focusElm, "div");
-                                       if (div && div.style.textAlign == "center") {
-                                               // Remove div
-                                               if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
-                                                       div.parentNode.replaceChild(img, div);
-                                       } else {
-                                               // Add div
-                                               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.setAttribute('align', ''); // Needed for IE
-                                               img.removeAttribute('align');
-                                       } else
-                                               img.setAttribute('align', 'right');
-
-                                       // Remove the div
-                                       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 "JustifyLeft":
-                       case "JustifyCenter":
-                       case "JustifyFull":
-                       case "JustifyRight":
-                               var el = tinyMCE.getParentNode(focusElm, function(n) {return tinyMCE.getAttrib(n, 'align');});
-
-                               if (el) {
-                                       el.setAttribute('align', ''); // Needed for IE
-                                       el.removeAttribute('align');
-                               } else
-                                       this.getDoc().execCommand(command, user_interface, value);
-
-                               tinyMCE.triggerNodeChange();
-
-                               return true;
-
-                       case "unlink":
-                               // Unlink if caret is inside link
-                               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 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;
-
-                               // Whole element selected check
-                               if (tinyMCE.isIE) {
-                                       // Control range
-                                       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;
-                               }
-
-                               // Whole element selected
-                               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', '');
-                                       }
-
-                                       // Remove style/attribs from all children
-                                       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); // Bug in FF when running in fullscreen
-                                       doc.execCommand("FontName", false, "#mce_temp_font#");
-                                       var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");
-
-                                       // Change them all
-                                       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);
-
-                                                       // Remove style/attribs from all children
-                                                       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', '');
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               // Cleaup wrappers
-                               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");
-
-                                       // Is only child a element
-                                       if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
-                                               //tinyMCE.debug("merge1" + isNew);
-                                               this._mergeElements(scmd, elm, elm.childNodes[0], isNew);
-                                               continue;
-                                       }
-
-                                       // Is I the only child
-                                       if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
-                                               //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);
-                                               if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
-                                                       this._mergeElements(scmd, elm.parentNode, elm, false);
-                                       }
-                               }
-
-                               // Remove empty wrappers
-                               var nodes = doc.getElementsByTagName(wrapper);
-                               for (i=nodes.length-1; i>=0; i--) {
-                                       var elm = nodes[i], isEmpty = true;
-
-                                       // Check if it has any attribs
-                                       var tmp = doc.createElement("body");
-                                       tmp.appendChild(elm.cloneNode(false));
-
-                                       // Is empty span, remove it
-                                       tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');
-                                       //tinyMCE.debug(tmp.innerHTML);
-                                       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);
-                                       }
-                               }
-
-                               // Re add the visual aids
-                               if (scmd == "removeformat")
-                                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
-
-                               tinyMCE.triggerNodeChange();
-
-                               break;
-
-                       case "FontName":
-                               if (value == null) {
-                                       var s = this.getSel();
-
-                                       // Find font and select it
-                                       if (tinyMCE.isGecko && s.isCollapsed) {
-                                               var f = tinyMCE.getParentElement(this.getFocusElement(), "font");
-
-                                               if (f != null)
-                                                       this.selection.selectNode(f, false);
-                                       }
-
-                                       // Remove format
-                                       this.getDoc().execCommand("RemoveFormat", false, null);
-
-                                       // Collapse range if font was found
-                                       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 || tinyMCE.isOpera) {
-                                       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;
-
-                               // Try executing command
-                               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.');
-
-                               // Alert error in gecko if command failed
-                               if (tinyMCE.isGecko && cmdFailed) {
-                                       // Confirm more info
-                                       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 = "";
-
-                               // Call custom cleanup code
-                               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());
-
-                               // Cleanup any mess left from storyAwayURLs
-                               tinyMCE._removeInternal(this.getBody());
-
-                               // When editing always use fonts internaly
-                               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);
-
-                               // When editing always use fonts internaly
-                               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":
-                               // Force empty string
-                               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');
-
-                               // Insert marker key
-                               this.execCommand('mceInsertContent', false, key);
-
-                               // Store away scroll pos
-                               var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft;
-                               var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop;
-
-                               // Find marker and replace with RAW HTML
-                               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));
-
-                               // Restore scoll pos
-                               this.contentWindow.scrollTo(scrollX, scrollY);
-
-                               this.execCommand('mceEndUndoLevel');
-
-                               break;
-
-                       case "mceInsertContent":
-                               // Force empty string
-                               if (!value)
-                                       value = '';
-
-                               var insertHTMLFailed = false;
-
-                               // Removed since it produced problems in IE
-                               // this.getWin().focus();
-
-                               if (tinyMCE.isGecko || tinyMCE.isOpera) {
-                                       try {
-                                               // Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF
-                                               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();
-
-                                                       // Insert text at cursor position
-                                                       s.removeAllRanges();
-                                                       r.deleteContents();
-                                                       r.insertNode(n);
-
-                                                       // Move the cursor to the end of text
-                                                       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 {
-                                               // Setup text node
-                                               value = doc.createTextNode(tinyMCE.entityDecode(value));
-                                       }
-
-                                       // Insert plain text in Safari
-                                       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 target node is text do special treatment, (Mozilla 1.3 fix)
-                                       if (rng.startContainer.nodeType == 3) {
-                                               var node = rng.startContainer.splitText(rng.startOffset);
-                                               node.parentNode.insertBefore(value, node); 
-                                       } else
-                                               rng.insertNode(value);
-
-                                       if (!isHTML) {
-                                               // Removes weird selection trails
-                                               sel.selectAllChildren(doc.body);
-                                               sel.removeAllRanges();
-
-                                               // Move cursor to end of content
-                                               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;
-
-                                       // Fix comment bug, add tag before comments
-                                       if (c)
-                                               value = tinyMCE.uniqueTag + value;
-
-                                       //      tmpRng = rng.duplicate(); // Store away range (Fixes Undo bookmark bug in IE)
-
-                                       if (rng.item)
-                                               rng.item(0).outerHTML = value;
-                                       else
-                                               rng.pasteHTML(value);
-
-                                       //if (tmpRng)
-                                       //      tmpRng.select(); // Restore range  (Fixes Undo bookmark bug in IE)
-
-                                       // Remove unique tag
-                                       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) {
-                                               // Do nothing
-                                       }
-
-                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
-                               } else {
-                                       this.getDoc().execCommand(command, user_interface, value);
-
-                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
-                               }
-
-                               // Remove class
-                               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();
-               }
-
-               // Add undo level after modification
-               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;
-
-               // Set default width, height
-               if (this.settings.width == -1)
-                       this.settings.width = replace_element.offsetWidth;
-
-               if (this.settings.height == -1)
-                       this.settings.height = replace_element.offsetHeight;
-
-               // Try the style width
-               if (this.settings.width == 0)
-                       this.settings.width = replace_element.style.width;
-
-               // Try the style height
-               if (this.settings.height == 0)
-                       this.settings.height = replace_element.style.height; 
-
-               // If no width/height then default to 320x240, better than nothing
-               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;
-
-               // Special % handling
-               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;
-
-               // Get replace_element contents
-               if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")
-                       this.startContent = replace_element.value;
-               else
-                       this.startContent = replace_element.innerHTML;
-
-               // If not text area or input
-               if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {
-                       this.oldTargetElement = replace_element;
-
-                       // Debug mode
-                       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;
-
-                       // Output HTML and set editable
-                       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>';
-
-                       // Just hide the textarea element
-                       this.oldTargetElement = replace_element;
-
-                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
-                       this.oldTargetElement.style.display = "none";
-
-                       // Output HTML and set editable
-                       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);
-               }
-
-               // Setup iframe
-               dynamicIFrame = false;
-               tElm = targetDoc.getElementById(this.editorId);
-
-               if (!tinyMCE.isIE) {
-                       // Node case is preserved in XML strict mode
-                       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;
-
-                       //this.getDoc().designMode = "on";
-               } 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";
-               }
-
-               // Setup base HTML
-               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) {
-                               // Failed Mozilla 1.3
-                               this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";
-                       }
-               }
-
-               // This timeout is needed in MSIE 5.5 for some odd reason
-               // it seems that the document.frames isn't initialized yet?
-               if (tinyMCE.isIE)
-                       window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);
-
-               // Setup element references
-               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;
-
-               // Force hidden tabs visible while serializing
-               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;
-
-               // Default to false
-               if (typeof(skip_cleanup) == "undefined")
-                       skip_cleanup = false;
-
-               // Default to false
-               if (typeof(skip_callback) == "undefined")
-                       skip_callback = false;
-
-               tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);
-
-               // Remove visual aids when cleanup is disabled
-               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());
-
-               // Use callback content if available
-               if ((typeof(content) != "undefined") && content != null)
-                       htm = content;
-
-               // Replace some weird entities (Bug: #1056343)
-               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;
-
-               // Hide them again (tabs in MSIE)
-               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;
-               }
-       }
-
-       };
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */
-
-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>');
-
-               // Fix close BR elements
-               s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');
-
-               // Open closed tags like <b/> to <b></b>
-               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>');
-
-               // Remove trailing space <b > to <b>
-               s = s.replace(new RegExp('\\s+></', 'gi'), '></');
-
-               // Close tags <img></img> to <img/>
-               s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');
-
-               // Weird MSIE bug, <p><hr /></p> breaks runtime?
-               if (tinyMCE.isIE)
-                       s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");
-
-               // Weird tags will make IE error #bug: 1538495
-               if (tinyMCE.isIE)
-                       s = s.replace(/<!(\s*)\/>/g, '');
-
-               // Convert relative anchors to absolute URLs ex: #something to file.htm#something
-               // Removed: Since local document anchors should never be forced absolute example edit.php?id=something
-               //if (tinyMCE.getParam('convert_urls'))
-               //      s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings.document_base_url + "#");
-
-               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('||');
-       //tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));
-                       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;
-
-                       if (i && box[i] != box[i-1])
-                               return;
-               }
-
-               // They are all the same
-               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;
-
-               // Compress box
-               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; // Force string
-
-                               // Fix style URL
-                               val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");
-
-                               // Convert URL
-                               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);") + "')";
-                               }
-
-                               // Force HEX colors
-                               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");
-
-               // Loops backwards due to bug #1467987
-               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);
-
-               // Call custom cleanup code
-               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++; // Unique ID needed for the content duplication bug
-               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();
-
-               // Post processing
-               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 \/>$/, ''); // Remove last BR for Gecko
-               h = h.replace(/<br \/><\/p>/g, '</p>'); // Remove last BR in P tags for Gecko
-               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>');
-
-               // Clean body
-               if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))
-                       h = '';
-
-               // If preformatted
-               if (s.preformatted) {
-                       h = h.replace(/^<pre>/, '');
-                       h = h.replace(/<\/pre>$/, '');
-                       h = '<pre>' + h + '</pre>';
-               }
-
-               // Gecko specific processing
-               if (tinyMCE.isGecko) {
-                       // Makes no sence but FF generates it!!
-                       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 />');
-
-               // Call custom cleanup code
-               h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);
-
-               // Remove internal classes
-               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 encoding (not recommended option)
-               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([]);
-
-       // Default config
-       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];
-
-               // Setup code formating
-               s = this.settings;
-
-               // Setup regexps
-               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 = [];
-               this.serializationId = 0;
-
-               if (s.invalid_elements !== '')
-                       this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');
-               else
-                       this.iveRe = null;
-
-               // Setup separator
-               st = '';
-               for (i=0; i<s.indent_levels; i++)
-                       st += s.indent_char;
-
-               this.inStr = st;
-
-               // If verify_html if false force *[*]
-               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(); // Will initialize cleanup rules
-
-               // Empty is true since it removes formatting
-               if (!n)
-                       return true;
-
-               // Clean the name up a bit
-               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];
-
-                       // Split tag/children
-                       p = this.split(/\[|\]/, s);
-                       if (p == null || p.length < 1)
-                               t = s.toUpperCase();
-                       else
-                               t = p[0].toUpperCase();
-
-                       // Handle all tag names
-                       tn = this.split('/', t);
-                       for (y=0; y<tn.length; y++) {
-                               r = "^(";
-
-                               // Build regex
-                               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;
-
-                       // Split tag/attrs
-                       p = this.split(/\[|\]/, s);
-                       if (p == null || p.length < 1)
-                               t = s.toUpperCase();
-                       else
-                               t = p[0].toUpperCase();
-
-                       // Handle all tag names
-                       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;
-
-                               // Handle prefixes
-                               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 + '$'));
-
-                               // Setup valid attributes
-                               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();
-
-                                       //tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);
-                               } 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: // Element
-                               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: // Text
-                               xn.appendChild(xd.createTextNode(n.nodeValue));
-                               return;
-
-                       case 8: // Comment
-                               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(); // Will initialize cleanup rules
-
-               if (tinyMCE.isRealIE && this._isDuplicate(n))
-                       return '';
-
-               // Skip non valid child elements
-               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: // Element
-                               hc = n.hasChildNodes();
-
-                               if (st)
-                                       break;
-
-                               nn = n.nodeName;
-
-                               if (tinyMCE.isRealIE) {
-                                       // MSIE sometimes produces <//tag>
-                                       if (n.nodeName.indexOf('/') != -1)
-                                               break;
-
-                                       // MSIE has it's NS in a separate attrib
-                                       if (n.scopeName && n.scopeName != 'HTML')
-                                               nn = n.scopeName.toUpperCase() + ':' + nn.toUpperCase();
-                               } else if (tinyMCE.isOpera && nn.indexOf(':') > 0)
-                                       nn = nn.toUpperCase();
-
-                               // Convert fonts to spans
-                               if (this.settings.convert_fonts_to_spans) {
-                                       // On get content FONT -> SPAN
-                                       if (this.settings.on_save && nn == 'FONT')
-                                               nn = 'SPAN';
-
-                                       // On insert content SPAN -> FONT
-                                       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) {
-                                               // Serialize wildcard attributes
-                                               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 {
-                                               // Serialize specific attributes
-                                               for (i=r.vAttribs.length-1; i>-1; i--)
-                                                       t += this._serializeAttribute(n, r, r.vAttribs[i]);
-                                       }
-
-                                       // Serialize mce_ atts
-                                       if (!this.settings.on_save) {
-                                               at = this.mceAttribs;
-
-                                               for (no in at) {
-                                                       if (at[no])
-                                                               t += this._serializeAttribute(n, r, at[no]);
-                                               }
-                                       }
-
-                                       // Check for required attribs
-                                       if (r.reqAttribsRe && !t.match(r.reqAttribsRe))
-                                               t = null;
-
-                                       // Close these
-                                       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: // Text
-                               if (st)
-                                       break;
-
-                               if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))
-                                       return this.isIE ? '' : n.nodeValue;
-
-                               return this.xmlEncode(n.nodeValue);
-
-                       case 8: // Comment
-                               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]);
-               }
-
-               // Fill empty nodes
-               if (f && !hc)
-                       h += this.fillStr;
-
-               // End element
-               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;
-
-               // Replace BR in pre elements to \n
-               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, ''); // Windows sux, isn't carriage return a thing of the past :)
-               h = '\n' + h;
-               h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting
-               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';
-
-               //tinyMCE.debug(h);
-
-               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;
-               }
-
-               //tinyMCE.debug(h);
-
-               return o;
-       },
-
-       xmlEncode : function(s) {
-               var cl = this, re = this.xmlEncodeRe;
-
-               if (!this.entitiesDone)
-                       this._setupEntities(); // Will intialize lookup table
-
-               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) {
-               // Remove mce_src, mce_href
-               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) {
-                       // IE 7 may cast exception on invalid attributes
-                       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;
-
-                       // Skip the default values that IE returns
-                       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 = "";
-
-                       // Images
-                       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;
-
-               // Setup entities
-               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;
-
-               // Setup default rule
-               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) {
-                       // Mark elements
-                       if (n.mce_serialized == this.serializationId)
-                               return true;
-
-                       n.setAttribute('mce_serialized', this.serializationId);
-               } else {
-                       sn = this.serializedNodes;
-
-                       // Search lookup table for text nodes  and comments
-                       for (i=0, l = sn.length; i<l; i++) {
-                               if (sn[i] == n)
-                                       return true;
-                       }
-
-                       sn.push(n);
-               }
-
-               return false;
-       }
-
-       };
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */
-
-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;
-
-               // Convert all strong/em to b/i in Gecko
-               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) {
-                       // Since MSIE handles invalid HTML better that valid XHTML we
-                       // need to make some things invalid. <hr /> gets converted to <hr>.
-                       h = h.replace(/\s\/>/g, '>');
-
-                       // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones
-                       h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
-                       h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
-                       h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
-
-                       // Remove first comment
-                       e.innerHTML = tinyMCE.uniqueTag + h;
-                       e.firstChild.removeNode(true);
-
-                       // Remove weird auto generated empty paragraphs unless it's supposed to be there
-                       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;
-
-               // Compatiblity with old scripts where f param was a attribute string
-               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 = "";
-
-               // Not a element
-               if (!elm || elm.nodeType != 1)
-                       return dv;
-
-               try {
-                       v = elm.getAttribute(name, 0);
-               } catch (ex) {
-                       // IE 7 may cast exception on invalid attributes
-                       v = elm.getAttribute(name, 2);
-               }
-
-               // Try className for class attrib
-               if (name == "class" && !v)
-                       v = elm.className;
-
-               // Workaround for a issue with Firefox 1.5rc2+
-               if (tinyMCE.isGecko) {
-                       if (name == "src" && elm.src != null && elm.src !== '')
-                               v = elm.src;
-
-                       // Workaround for a issue with Firefox 1.5rc2+
-                       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;
-
-               // Style attrib deleted in IE
-               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) {
-                       // Keep tile mode
-                       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;
-
-               // Gecko
-               if (tinyMCE.isGecko && n.ownerDocument.defaultView) {
-                       try {
-                               return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);
-                       } catch (n) {
-                               // Old safari might fail
-                               return null;
-                       }
-               }
-
-               // Camelcase it, if needed
-               na = na.replace(/-(\D)/g, function(a, b){
-                       return b.toUpperCase();
-               });
-
-               // IE & Opera
-               if (n.currentStyle)
-                       return n.currentStyle[na];
-
-               return false;
-       }
-
-       });
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */
-
-tinyMCE.add(TinyMCE_Engine, {
-       parseURL : function(url_str) {
-               var urlParts = [], i, pos, lastPos, chr;
-
-               if (url_str) {
-                       // Parse protocol part
-                       pos = url_str.indexOf('://');
-                       if (pos != -1) {
-                               urlParts.protocol = url_str.substring(0, pos);
-                               lastPos = pos + 3;
-                       }
-
-                       // Find port or path start
-                       for (i=lastPos; i<url_str.length; i++) {
-                               chr = url_str.charAt(i);
-
-                               if (chr == ':')
-                                       break;
-
-                               if (chr == '/')
-                                       break;
-                       }
-                       pos = i;
-
-                       // Get host
-                       urlParts.host = url_str.substring(lastPos, pos);
-
-                       // Get port
-                       urlParts.port = "";
-                       lastPos = pos;
-                       if (url_str.charAt(pos) == ':') {
-                               pos = url_str.indexOf('/', lastPos);
-                               urlParts.port = url_str.substring(lastPos+1, pos);
-                       }
-
-                       // Get path
-                       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);
-
-                       // Get query
-                       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);
-                       }
-
-                       // Get anchor
-                       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;
-
-               // Crop away last path part
-               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;
-
-               // Remove document prefix from local anchors
-               fileName = baseURL.path;
-
-               if ((pos = fileName.lastIndexOf('/')) != -1)
-                       fileName = fileName.substring(pos + 1);
-
-               // Is local anchor
-               if (fileName == targetURL.path && targetURL.anchor !== '')
-                       targetURL.path = "";
-
-               // If empty and not local anchor force filename or slash
-               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;
-
-               // Split parts
-               baseURLParts = baseURL.path.split('/');
-               relURLParts = relURL.path.split('/');
-
-               // Remove empty chunks
-               newBaseURLParts = [];
-               for (i=baseURLParts.length-1; i>=0; i--) {
-                       if (baseURLParts[i].length == 0)
-                               continue;
-
-                       newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
-               }
-               baseURLParts = newBaseURLParts.reverse();
-
-               // Merge relURLParts chunks
-               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();
-
-               // Remove end from absolute path
-               len = baseURLParts.length-numBack;
-               absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');
-               start = "";
-               end = "";
-
-               // Build output URL
-               relURL.protocol = baseURL.protocol;
-               relURL.host = baseURL.host;
-               relURL.port = baseURL.port;
-
-               // Re-add trailing slash if it's removed
-               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;
-
-               // Pass through file protocol
-               if (prot == "file:")
-                       return url;
-
-               // Something is wrong, remove weirdness
-               url = tinyMCE.regexpReplace(url, '(http|https):///', '/');
-
-               // Mailto link or anchor (Pass through)
-               if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || /^[ \t\r\n\+]*[#\?]/.test(url))
-                       return url;
-
-               // Fix relative/Mozilla
-               if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')
-                       return tinyMCE.settings.base_href + url;
-
-               // Handle relative URLs
-               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);
-
-                       // Force relative
-                       if (urlParts.host == tmpUrlParts.host && (urlParts.port == tmpUrlParts.port))
-                               return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url, curl);
-               }
-
-               // Handle absolute URLs
-               if (!tinyMCE.getParam('relative_urls')) {
-                       urlParts = tinyMCE.parseURL(url);
-                       baseUrlParts = tinyMCE.parseURL(tinyMCE.settings.base_href);
-
-                       // Force absolute URLs from relative URLs
-                       url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);
-
-                       // If anchor and path is the same page
-                       if (urlParts.anchor && urlParts.path == baseUrlParts.path)
-                               return "#" + urlParts.anchor;
-               }
-
-               // Remove current domain
-               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;
-
-               // Convert all image URL:s to absolute URL
-               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);
-                       }
-               }
-
-               // Convert all link URL:s to absolute URL
-               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);
-                       }
-               }
-       }
-
-       });
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */
-
-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;
-       }
-});
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */
-
-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;
-
-               // Remove odd, error
-               if (typeof(tinyMCE) == "undefined")
-                       return true;
-
-               try {
-                       // Try selected instance first
-                       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;
-                               }
-                       }
-
-                       // Search for it
-                       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) {
-                       // Ignore error if iframe is pointing to external URL
-               }
-       },
-
-       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);
-
-                       // Force designmode
-                       try {
-                               doc.designMode = "On";
-                       } catch (e) {
-                               // Ignore
-                       }
-               }
-       },
-
-       onMouseMove : function() {
-               var inst, lh;
-
-               // Fix for IE7 bug where it's not restoring hover on anchors correctly
-               if (tinyMCE.lastHover) {
-                       lh = tinyMCE.lastHover;
-
-                       // Call out on menus and refresh class on normal buttons
-                       if (lh.className.indexOf('mceMenu') != -1)
-                               tinyMCE._menuButtonEvent('out', lh);
-                       else
-                               lh.className = lh.className;
-
-                       tinyMCE.lastHover = null;
-               }
-
-               if (!tinyMCE.hasMouseMoved) {
-                       inst = tinyMCE.selectedInstance;
-
-                       // Workaround for bug #1437457 (Odd MSIE bug)
-                       if (inst.isFocused) {
-                               inst.undoBookmark = inst.selection.getBookmark();
-                               tinyMCE.hasMouseMoved = true;
-                       }
-               }
-
-       //      tinyMCE.cancelEvent(inst.getWin().event);
-       //      return false;
-       },
-
-       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) {
-               // Add cleanup for all non unload events
-               if (n != 'unload') {
-                       function clean() {
-                               var ex;
-
-                               try {
-                                       tinyMCE.removeEvent(o, n, h);
-                                       tinyMCE.removeEvent(window, 'unload', clean);
-                                       o = n = h = null;
-                               } catch (ex) {
-                                       // IE may produce access denied exception on unload
-                               }
-                       }
-
-                       // Add memory cleaner
-                       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) {
-               // Add event handlers 
-               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;
-
-               // Unpiggyback onchange on blur
-               if (e.type == "blur") {
-                       if (elm.oldonchange) {
-                               elm.onchange = elm.oldonchange;
-                               elm.oldonchange = null;
-                       }
-
-                       return true;
-               }
-
-               // Piggyback onchange
-               if (elm.nodeName == "SELECT" && !elm.oldonchange) {
-                       elm.oldonchange = elm.onchange;
-                       elm.onchange = null;
-               }
-
-               // Execute onchange and remove piggyback
-               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._oldWidth) {
-                               ife.style.width = ife._oldWidth;
-                               ife.width = ife._oldWidth;
-                       }*/
-
-                       if (ife._oldHeight) {
-                               ife.style.height = ife._oldHeight;
-                               ife.height = ife._oldHeight;
-                       }
-               }
-       }
-
-       });
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */
-
-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(document.importNode(r.cloneContents(), true));
-               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(); // Failed, use text for now
-
-               h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
-
-               // When editing always use fonts internaly
-               //if (tinyMCE.getParam("convert_fonts_to_spans"))
-               //      tinyMCE.convertSpansToFonts(inst.getDoc());
-
-               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') {
-                               /*nl = b.getElementsByTagName('IMG');
-                               for (i=0; i<nl.length; i++) {
-                                       if (e == nl[i]) {
-                                               sp = i;
-                                               break;
-                                       }
-                               }*/
-
-                               return {
-                                       start : -1,
-                                       end : -1,
-                                       index : sp,
-                                       scrollX : sx,
-                                       scrollY : sy
-                               };
-                       }
-
-                       // Caret or selection
-                       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) {
-                                       // Ignore
-                               }
-
-                               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) {
-                                               // Might be thrown if the node no longer exists
-                                       }
-                               }
-                       } else {
-                               // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs
-                               try {
-                                       // Incorrect bookmark
-                                       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) {
-                                       // Ignore
-                               }
-                       }
-
-                       /*
-                       if (typeof(bookmark.index) != 'undefined') {
-                               tinyMCE.selectElements(b, 'IMG', function (n) {
-                                       if (bookmark.index-- == 0) {
-                                               // Select image in Gecko here
-                                       }
-
-                                       return false;
-                               });
-                       }
-                       */
-
-                       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) {
-                               // Throws illigal agrument in MSIE some times
-                       }
-               } 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) {
-                               // Find first textnode in tree
-                               nodes = tinyMCE.getNodeTree(node, [], 3);
-                               if (nodes.length > 0)
-                                       rng.selectNodeContents(nodes[0]);
-                               else
-                                       rng.selectNodeContents(node);
-                       } else
-                               rng.selectNode(node);
-
-                       if (collapse) {
-                               // Special treatment of textnode 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);
-
-               // Set selected element
-               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;
-
-               // Only scroll if out of visible area
-               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);
-
-               // Scroll container window
-               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();
-
-       //              if (rng.collapse)
-       //                      rng.collapse(true);
-
-                       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;
-                       //elm = (sel && sel.anchorNode) ? sel.anchorNode : null;
-
-                       // Handle selection a image or other control like element such as anchors
-                       if (!rng.collapsed) {
-                               // Is selection small
-                               if (rng.startContainer == rng.endContainer) {
-                                       if (rng.startOffset - rng.endOffset < 2) {
-                                               if (rng.startContainer.hasChildNodes())
-                                                       elm = rng.startContainer.childNodes[rng.startOffset];
-                                       }
-                               }
-                       }
-
-                       // Get the element parent of the node
-                       elm = tinyMCE.getParentElement(elm);
-
-                       //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")
-                       //      elm = tinyMCE.selectedElement;
-               }
-
-               return elm;
-       }
-
-       };
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */
-
-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) {
-                       //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content);
-
-                       // Is dirty again
-                       inst.isNotDirty = false;
-
-                       tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);
-
-                       // Time to compress
-                       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--;
-
-                               // Todo: Implement global undo/redo logic here
-                       }
-
-                       b = inst.undoBookmark;
-
-                       if (!b)
-                               b = inst.selection.getBookmark();
-
-                       this.undoIndex++;
-                       this.undoLevels[this.undoIndex] = {
-                               content : newHTML,
-                               bookmark : b
-                       };
-
-                       // Remove all above from global undo/redo
-                       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--;
-                       }
-
-                       // Add global undo level
-                       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;
-
-               // Do undo
-               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();
-       }
-
-       };
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */
-
-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() == '';
-                       }
-
-                       // Check for images
-                       if (para.getElementsByTagName("img").length > 0)
-                               return false;
-
-                       // Check for tables
-                       if (para.getElementsByTagName("table").length > 0)
-                               return false;
-
-                       // Check for HRs
-                       if (para.getElementsByTagName("hr").length > 0)
-                               return false;
-
-                       // Check all textnodes
-                       nodes = tinyMCE.getNodeTree(para, [], 3);
-                       for (i=0; i<nodes.length; i++) {
-                               if (!isEmptyHTML(nodes[i].nodeValue))
-                                       return false;
-                       }
-
-                       // No images, no tables, no hrs, no text content then it's empty
-                       return true;
-               }
-
-       //      tinyMCE.debug(body.innerHTML);
-
-       //      debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());
-
-               // Setup before range
-               rngBefore = doc.createRange();
-               rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
-               rngBefore.collapse(true);
-
-               // Setup after range
-               rngAfter = doc.createRange();
-               rngAfter.setStart(sel.focusNode, sel.focusOffset);
-               rngAfter.collapse(true);
-
-               // Setup start/end points
-               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 == "HTML" ? doc.body : startNode; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes
-               startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;
-               endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;
-
-               // Get block elements
-               startBlock = inst.getParentBlockElement(startNode);
-               endBlock = inst.getParentBlockElement(endNode);
-
-               // If absolute force paragraph generation within
-               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;
-
-               // Use current block name
-               if (startBlock != null) {
-                       blockName = startBlock.nodeName;
-
-                       // Use P instead
-                       if (/(TD|TABLE|TH|CAPTION)/.test(blockName) || (blockName == "DIV" && /left|right/gi.test(startBlock.style.cssFloat)))
-                               blockName = "P";
-               }
-
-               // Within a list use normal behaviour
-               if (tinyMCE.getParentElement(startBlock, "OL,UL", null, body) != null)
-                       return false;
-
-               // Within a table create new paragraphs
-               if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))
-                       startBlock = endBlock = null;
-
-               // Setup new paragraphs
-               paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
-               paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
-
-               // Is header, then force paragraph under
-               if (/^(H[1-6])$/.test(blockName))
-                       paraAfter = doc.createElement("p");
-
-               // Setup chop nodes
-               startChop = startNode;
-               endChop = endNode;
-
-               // Get startChop node
-               node = startChop;
-               do {
-                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
-                               break;
-
-                       startChop = node;
-               } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));
-
-               // Get endChop node
-               node = endChop;
-               do {
-                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
-                               break;
-
-                       endChop = node;
-               } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));
-
-               // Fix when only a image is within the TD
-               if (startChop.nodeName == "TD")
-                       startChop = startChop.firstChild;
-
-               if (endChop.nodeName == "TD")
-                       endChop = endChop.lastChild;
-
-               // If not in a block element
-               if (startBlock == null) {
-                       // Delete selection
-                       rng.deleteContents();
-
-                       if (!tinyMCE.isSafari)
-                               sel.removeAllRanges();
-
-                       if (startChop != rootElm && endChop != rootElm) {
-                               // Insert paragraph before
-                               rngBefore = rng.cloneRange();
-
-                               if (startChop == body)
-                                       rngBefore.setStart(startChop, 0);
-                               else
-                                       rngBefore.setStartBefore(startChop);
-
-                               paraBefore.appendChild(rngBefore.cloneContents());
-
-                               // Insert paragraph after
-                               if (endChop.parentNode.nodeName == blockName)
-                                       endChop = endChop.parentNode;
-
-                               // If not after image
-                               //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")
-                                       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);
-
-                               // Check if it's a empty paragraph
-                               if (isEmpty(paraBefore))
-                                       paraBefore.innerHTML = "&nbsp;";
-
-                               // Check if it's a empty paragraph
-                               if (isEmpty(paraAfter))
-                                       paraAfter.innerHTML = "&nbsp;";
-
-                               // Delete old contents
-                               rng.deleteContents();
-                               rngAfter.deleteContents();
-                               rngBefore.deleteContents();
-
-                               // Insert new paragraphs
-                               if (tinyMCE.isOpera) {
-                                       paraBefore.normalize();
-                                       rngBefore.insertNode(paraBefore);
-                                       paraAfter.normalize();
-                                       rngBefore.insertNode(paraAfter);
-                               } else {
-                                       paraAfter.normalize();
-                                       rngBefore.insertNode(paraAfter);
-                                       paraBefore.normalize();
-                                       rngBefore.insertNode(paraBefore);
-                               }
-
-                               //tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);
-                       } 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;
-               }
-
-               // Place first part within new paragraph
-               if (startChop.nodeName == blockName)
-                       rngBefore.setStart(startChop, 0);
-               else
-                       rngBefore.setStartBefore(startChop);
-
-               rngBefore.setEnd(startNode, startOffset);
-               paraBefore.appendChild(rngBefore.cloneContents());
-
-               // Place secound part within new paragraph
-               rngAfter.setEndAfter(endChop);
-               rngAfter.setStart(endNode, endOffset);
-               contents = rngAfter.cloneContents();
-
-               if (contents.firstChild && contents.firstChild.nodeName == blockName) {
-       /*              var nodes = contents.firstChild.childNodes;
-                       for (i=0; i<nodes.length; i++) {
-                               //tinyMCE.debug(nodes[i].nodeName);
-                               if (nodes[i].nodeName != "BODY")
-                                       paraAfter.appendChild(nodes[i]);
-                       }
-       */
-                       paraAfter.innerHTML = contents.firstChild.innerHTML;
-               } else
-                       paraAfter.appendChild(contents);
-
-               // Check if it's a empty paragraph
-               if (isEmpty(paraBefore))
-                       paraBefore.innerHTML = "&nbsp;";
-
-               // Check if it's a empty paragraph
-               if (isEmpty(paraAfter))
-                       paraAfter.innerHTML = "&nbsp;";
-
-               // Create a range around everything
-               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);
-
-               // Delete all contents and insert new paragraphs
-               rng.deleteContents();
-
-               if (tinyMCE.isOpera) {
-                       rng.insertNode(paraBefore);
-                       rng.insertNode(paraAfter);
-               } else {
-                       rng.insertNode(paraAfter);
-                       rng.insertNode(paraBefore);
-               }
-
-               //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);
-
-               // Normalize
-               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;
-
-               // Added body check for bug #1527787
-               if (sn && sn.nextSibling && sn.nextSibling.nodeName == "BR" && sn.parentNode.nodeName != "BODY") {
-                       nv = sn.nodeValue;
-
-                       // Handle if a backspace is pressed after a space character #bug 1466054 removed since fix for #1527787
-                       /*if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')
-                               s = true;*/
-
-                       // Only remove BRs if we are at the end of line #bug 1464152
-                       if (nv != null && r.startOffset == nv.length)
-                               sn.nextSibling.parentNode.removeChild(sn.nextSibling);
-               }
-
-               if (inst.settings.auto_resize)
-                       inst.resizeToContent();
-
-               return s;
-       }
-
-       };
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */
-
-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);
-       }
-
-       };
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */
-
-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;
-
-               // Default params
-               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) {
-                       // Accessibility stuff
-/*                     nl = this.getElement().getElementsByTagName("a");
-                       if (nl.length > 0)
-                               nl[0].focus();*/
-               }
-
-               tinyMCE.lastMenu = this;
-       }
-
-       });
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */
-
-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;
-       }
-
-       });
-
+\r
+/* file:jscripts/tiny_mce/classes/tinymce.js */\r
+\r
+var tinymce = {\r
+       majorVersion : '3',\r
+       minorVersion : '0.6.2',\r
+       releaseDate : '2008-04-07',\r
+\r
+       _init : function() {\r
+               var t = this, ua = navigator.userAgent, i, nl, n, base;\r
+\r
+               // Browser checks\r
+               t.isOpera = window.opera && opera.buildNumber;\r
+               t.isWebKit = /WebKit/.test(ua);\r
+               t.isOldWebKit = t.isWebKit && !window.getSelection().getRangeAt;\r
+               t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(navigator.appName);\r
+               t.isIE6 = t.isIE && /MSIE [56]/.test(ua);\r
+               t.isGecko = !t.isWebKit && /Gecko/.test(ua);\r
+               t.isMac = ua.indexOf('Mac') != -1;\r
+\r
+               // TinyMCE .NET webcontrol might be setting the values for TinyMCE\r
+               if (window.tinyMCEPreInit) {\r
+                       t.suffix = tinyMCEPreInit.suffix;\r
+                       t.baseURL = tinyMCEPreInit.base;\r
+                       return;\r
+               }\r
+\r
+               // Get suffix and base\r
+               t.suffix = '';\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
+                               base = nl[i].href;\r
+               }\r
+\r
+               function getBase(n) {\r
+                       if (n.src && /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)) {\r
+                               if (/_(src|dev)\.js/g.test(n.src))\r
+                                       t.suffix = '_src';\r
+\r
+                               t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));\r
+\r
+                               // If path to script is relative and a base href was found add that one infront\r
+                               if (base && t.baseURL.indexOf('://') == -1)\r
+                                       t.baseURL = base + t.baseURL;\r
+\r
+                               return t.baseURL;\r
+                       }\r
+\r
+                       return null;\r
+               };\r
+\r
+               // Check document\r
+               nl = document.getElementsByTagName('script');\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (getBase(nl[i]))\r
+                               return;\r
+               }\r
+\r
+               // Check head\r
+               n = document.getElementsByTagName('head')[0];\r
+               if (n) {\r
+                       nl = n.getElementsByTagName('script');\r
+                       for (i=0; i<nl.length; i++) {\r
+                               if (getBase(nl[i]))\r
+                                       return;\r
+                       }\r
+               }\r
+\r
+               return;\r
+       },\r
+\r
+       is : function(o, t) {\r
+               var n = typeof(o);\r
+\r
+               if (!t)\r
+                       return n != 'undefined';\r
+\r
+               if (t == 'array' && (o instanceof Array))\r
+                       return true;\r
+\r
+               return n == t;\r
+       },\r
+\r
+       // #if !jquery\r
+\r
+       each : function(o, cb, s) {\r
+               var n, l;\r
+\r
+               if (!o)\r
+                       return 0;\r
+\r
+               s = s || o;\r
+\r
+               if (typeof(o.length) != 'undefined') {\r
+                       // Indexed arrays, needed for Safari\r
+                       for (n=0, l = o.length; n<l; n++) {\r
+                               if (cb.call(s, o[n], n, o) === false)\r
+                                       return 0;\r
+                       }\r
+               } else {\r
+                       // Hashtables\r
+                       for (n in o) {\r
+                               if (o.hasOwnProperty(n)) {\r
+                                       if (cb.call(s, o[n], n, o) === false)\r
+                                               return 0;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return 1;\r
+       },\r
+\r
+       map : function(a, f) {\r
+               var o = [];\r
+\r
+               tinymce.each(a, function(v) {\r
+                       o.push(f(v));\r
+               });\r
+\r
+               return o;\r
+       },\r
+\r
+       grep : function(a, f) {\r
+               var o = [];\r
+\r
+               tinymce.each(a, function(v) {\r
+                       if (!f || f(v))\r
+                               o.push(v);\r
+               });\r
+\r
+               return o;\r
+       },\r
+\r
+       inArray : function(a, v) {\r
+               var i, l;\r
+\r
+               if (a) {\r
+                       for (i = 0, l = a.length; i < l; i++) {\r
+                               if (a[i] === v)\r
+                                       return i;\r
+                       }\r
+               }\r
+\r
+               return -1;\r
+       },\r
+\r
+       extend : function(o, e) {\r
+               var i, a = arguments;\r
+\r
+               for (i=1; i<a.length; i++) {\r
+                       e = a[i];\r
+\r
+                       tinymce.each(e, function(v, n) {\r
+                               if (typeof(v) !== 'undefined')\r
+                                       o[n] = v;\r
+                       });\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       trim : function(s) {\r
+               return (s ? '' + s : '').replace(/^\s*|\s*$/g, '');\r
+       },\r
+\r
+       // #endif\r
+\r
+       create : function(s, p) {\r
+               var t = this, sp, ns, cn, scn, c, de = 0;\r
+\r
+               // Parse : <prefix> <class>:<super class>\r
+               s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);\r
+               cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name\r
+\r
+               // Create namespace for new class\r
+               ns = t.createNS(s[3].replace(/\.\w+$/, ''));\r
+\r
+               // Class already exists\r
+               if (ns[cn])\r
+                       return;\r
+\r
+               // Make pure static class\r
+               if (s[2] == 'static') {\r
+                       ns[cn] = p;\r
+\r
+                       if (this.onCreate)\r
+                               this.onCreate(s[2], s[3], ns[cn]);\r
+\r
+                       return;\r
+               }\r
+\r
+               // Create default constructor\r
+               if (!p[cn]) {\r
+                       p[cn] = function() {};\r
+                       de = 1;\r
+               }\r
+\r
+               // Add constructor and methods\r
+               ns[cn] = p[cn];\r
+               t.extend(ns[cn].prototype, p);\r
+\r
+               // Extend\r
+               if (s[5]) {\r
+                       sp = t.resolve(s[5]).prototype;\r
+                       scn = s[5].match(/\.(\w+)$/i)[1]; // Class name\r
+\r
+                       // Extend constructor\r
+                       c = ns[cn];\r
+                       if (de) {\r
+                               // Add passthrough constructor\r
+                               ns[cn] = function() {\r
+                                       return sp[scn].apply(this, arguments);\r
+                               };\r
+                       } else {\r
+                               // Add inherit constructor\r
+                               ns[cn] = function() {\r
+                                       this.parent = sp[scn];\r
+                                       return c.apply(this, arguments);\r
+                               };\r
+                       }\r
+                       ns[cn].prototype[cn] = ns[cn];\r
+\r
+                       // Add super methods\r
+                       t.each(sp, function(f, n) {\r
+                               ns[cn].prototype[n] = sp[n];\r
+                       });\r
+\r
+                       // Add overridden methods\r
+                       t.each(p, function(f, n) {\r
+                               // Extend methods if needed\r
+                               if (sp[n]) {\r
+                                       ns[cn].prototype[n] = function() {\r
+                                               this.parent = sp[n];\r
+                                               return f.apply(this, arguments);\r
+                                       };\r
+                               } else {\r
+                                       if (n != cn)\r
+                                               ns[cn].prototype[n] = f;\r
+                               }\r
+                       });\r
+               }\r
+\r
+               // Add static methods\r
+               t.each(p['static'], function(f, n) {\r
+                       ns[cn][n] = f;\r
+               });\r
+\r
+               if (this.onCreate)\r
+                       this.onCreate(s[2], s[3], ns[cn].prototype);\r
+       },\r
+\r
+       walk : function(o, f, n, s) {\r
+               s = s || this;\r
+\r
+               if (o) {\r
+                       if (n)\r
+                               o = o[n];\r
+\r
+                       tinymce.each(o, function(o, i) {\r
+                               if (f.call(s, o, i, n) === false)\r
+                                       return false;\r
+\r
+                               tinymce.walk(o, f, n, s);\r
+                       });\r
+               }\r
+       },\r
+\r
+       createNS : function(n, o) {\r
+               var i, v;\r
+\r
+               o = o || window;\r
+\r
+               n = n.split('.');\r
+               for (i=0; i<n.length; i++) {\r
+                       v = n[i];\r
+\r
+                       if (!o[v])\r
+                               o[v] = {};\r
+\r
+                       o = o[v];\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       resolve : function(n, o) {\r
+               var i, l;\r
+\r
+               o = o || window;\r
+\r
+               n = n.split('.');\r
+               for (i=0, l = n.length; i<l; i++) {\r
+                       o = o[n[i]];\r
+\r
+                       if (!o)\r
+                               break;\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       addUnload : function(f, s) {\r
+               var t = this, w = window, unload;\r
+\r
+               f = {func : f, scope : s || this};\r
+\r
+               if (!t.unloads) {\r
+                       unload = function() {\r
+                               var li = t.unloads, o, n;\r
+\r
+                               // Call unload handlers\r
+                               for (n in li) {\r
+                                       o = li[n];\r
+\r
+                                       if (o && o.func)\r
+                                               o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy\r
+                               }\r
+\r
+                               // Detach unload function\r
+                               if (w.detachEvent)\r
+                                       w.detachEvent('onunload', unload);\r
+                               else if (w.removeEventListener)\r
+                                       w.removeEventListener('unload', unload, false);\r
+\r
+                               // Destroy references\r
+                               o = li = w = unload = null;\r
+\r
+                               // Run garbarge collector on IE\r
+                               if (window.CollectGarbage)\r
+                                       window.CollectGarbage();\r
+                       };\r
+\r
+                       // Attach unload handler\r
+                       if (w.attachEvent)\r
+                               w.attachEvent('onunload', unload);\r
+                       else if (w.addEventListener)\r
+                               w.addEventListener('unload', unload, false);\r
+\r
+                       // Setup initial unload handler array\r
+                       t.unloads = [f];\r
+               } else\r
+                       t.unloads.push(f);\r
+\r
+               return f;\r
+       },\r
+\r
+       removeUnload : function(f) {\r
+               var u = this.unloads, r = null;\r
+\r
+               tinymce.each(u, function(o, i) {\r
+                       if (o && o.func == f) {\r
+                               u.splice(i, 1);\r
+                               r = f;\r
+                               return false;\r
+                       }\r
+               });\r
+\r
+               return r;\r
+       },\r
+\r
+       explode : function(s, d) {\r
+               return tinymce.map(s.split(d || ','), tinymce.trim);\r
+       }\r
+\r
+       };\r
+\r
+// Required for GZip AJAX loading\r
+window.tinymce = tinymce;\r
+\r
+// Initialize the API\r
+tinymce._init();\r
+\r
+/* file:jscripts/tiny_mce/classes/adapter/jquery/adapter.js */\r
+\r
+\r
+/* file:jscripts/tiny_mce/classes/adapter/prototype/adapter.js */\r
+\r
+\r
+/* file:jscripts/tiny_mce/classes/util/Dispatcher.js */\r
+\r
+tinymce.create('tinymce.util.Dispatcher', {\r
+       scope : null,\r
+       listeners : null,\r
+\r
+       Dispatcher : function(s) {\r
+               this.scope = s || this;\r
+               this.listeners = [];\r
+       },\r
+\r
+       add : function(cb, s) {\r
+               this.listeners.push({cb : cb, scope : s || this.scope});\r
+\r
+               return cb;\r
+       },\r
+\r
+       addToTop : function(cb, s) {\r
+               this.listeners.unshift({cb : cb, scope : s || this.scope});\r
+\r
+               return cb;\r
+       },\r
+\r
+       remove : function(cb) {\r
+               var l = this.listeners, o = null;\r
+\r
+               tinymce.each(l, function(c, i) {\r
+                       if (cb == c.cb) {\r
+                               o = cb;\r
+                               l.splice(i, 1);\r
+                               return false;\r
+                       }\r
+               });\r
+\r
+               return o;\r
+       },\r
+\r
+       dispatch : function() {\r
+               var s, a = arguments, i, li = this.listeners, c;\r
+\r
+               // Needs to be a real loop since the listener count might change while looping\r
+               // And this is also more efficient\r
+               for (i = 0; i<li.length; i++) {\r
+                       c = li[i];\r
+                       s = c.cb.apply(c.scope, a);\r
+\r
+                       if (s === false)\r
+                               break;\r
+               }\r
+\r
+               return s;\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/util/URI.js */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.util.URI', {\r
+               URI : function(u, s) {\r
+                       var t = this, o, a, b;\r
+\r
+                       // Default settings\r
+                       s = t.settings = s || {};\r
+\r
+                       // Strange app protocol or local anchor\r
+                       if (/^(mailto|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) {\r
+                               t.source = u;\r
+                               return;\r
+                       }\r
+\r
+                       // Absolute path with no host, fake host and protocol\r
+                       if (u.indexOf('/') === 0 && u.indexOf('//') !== 0)\r
+                               u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u;\r
+\r
+                       // Relative path\r
+                       if (u.indexOf('://') === -1 && u.indexOf('//') !== 0)\r
+                               u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u);\r
+\r
+                       // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri)\r
+                       u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something\r
+                       u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);\r
+                       each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) {\r
+                               var s = u[i];\r
+\r
+                               // Zope 3 workaround, they use @@something\r
+                               if (s)\r
+                                       s = s.replace(/\(mce_at\)/g, '@@');\r
+\r
+                               t[v] = s;\r
+                       });\r
+\r
+                       if (b = s.base_uri) {\r
+                               if (!t.protocol)\r
+                                       t.protocol = b.protocol;\r
+\r
+                               if (!t.userInfo)\r
+                                       t.userInfo = b.userInfo;\r
+\r
+                               if (!t.port && t.host == 'mce_host')\r
+                                       t.port = b.port;\r
+\r
+                               if (!t.host || t.host == 'mce_host')\r
+                                       t.host = b.host;\r
+\r
+                               t.source = '';\r
+                       }\r
+\r
+                       //t.path = t.path || '/';\r
+               },\r
+\r
+               setPath : function(p) {\r
+                       var t = this;\r
+\r
+                       p = /^(.*?)\/?(\w+)?$/.exec(p);\r
+\r
+                       // Update path parts\r
+                       t.path = p[0];\r
+                       t.directory = p[1];\r
+                       t.file = p[2];\r
+\r
+                       // Rebuild source\r
+                       t.source = '';\r
+                       t.getURI();\r
+               },\r
+\r
+               toRelative : function(u) {\r
+                       var t = this, o;\r
+\r
+                       u = new tinymce.util.URI(u, {base_uri : t});\r
+\r
+                       // Not on same domain/port or protocol\r
+                       if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol)\r
+                               return u.getURI();\r
+\r
+                       o = t.toRelPath(t.path, u.path);\r
+\r
+                       // Add query\r
+                       if (u.query)\r
+                               o += '?' + u.query;\r
+\r
+                       // Add anchor\r
+                       if (u.anchor)\r
+                               o += '#' + u.anchor;\r
+\r
+                       return o;\r
+               },\r
+       \r
+               toAbsolute : function(u, nh) {\r
+                       var u = new tinymce.util.URI(u, {base_uri : this});\r
+\r
+                       return u.getURI(this.host == u.host ? nh : 0);\r
+               },\r
+\r
+               toRelPath : function(base, path) {\r
+                       var items, bp = 0, out = '', i;\r
+\r
+                       // Split the paths\r
+                       base = base.substring(0, base.lastIndexOf('/'));\r
+                       base = base.split('/');\r
+                       items = path.split('/');\r
+\r
+                       if (base.length >= items.length) {\r
+                               for (i = 0; i < base.length; i++) {\r
+                                       if (i >= items.length || base[i] != items[i]) {\r
+                                               bp = i + 1;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if (base.length < items.length) {\r
+                               for (i = 0; i < items.length; i++) {\r
+                                       if (i >= base.length || base[i] != items[i]) {\r
+                                               bp = i + 1;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if (bp == 1)\r
+                               return path;\r
+\r
+                       for (i = 0; i < base.length - (bp - 1); i++)\r
+                               out += "../";\r
+\r
+                       for (i = bp - 1; i < items.length; i++) {\r
+                               if (i != bp - 1)\r
+                                       out += "/" + items[i];\r
+                               else\r
+                                       out += items[i];\r
+                       }\r
+\r
+                       return out;\r
+               },\r
+\r
+               toAbsPath : function(base, path) {\r
+                       var i, nb = 0, o = [];\r
+\r
+                       // Split paths\r
+                       base = base.split('/');\r
+                       path = path.split('/');\r
+\r
+                       // Remove empty chunks\r
+                       each(base, function(k) {\r
+                               if (k)\r
+                                       o.push(k);\r
+                       });\r
+\r
+                       base = o;\r
+\r
+                       // Merge relURLParts chunks\r
+                       for (i = path.length - 1, o = []; i >= 0; i--) {\r
+                               // Ignore empty or .\r
+                               if (path[i].length == 0 || path[i] == ".")\r
+                                       continue;\r
+\r
+                               // Is parent\r
+                               if (path[i] == '..') {\r
+                                       nb++;\r
+                                       continue;\r
+                               }\r
+\r
+                               // Move up\r
+                               if (nb > 0) {\r
+                                       nb--;\r
+                                       continue;\r
+                               }\r
+\r
+                               o.push(path[i]);\r
+                       }\r
+\r
+                       i = base.length - nb;\r
+\r
+                       // If /a/b/c or /\r
+                       if (i <= 0)\r
+                               return '/' + o.reverse().join('/');\r
+\r
+                       return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/');\r
+               },\r
+\r
+               getURI : function(nh) {\r
+                       var s, t = this;\r
+\r
+                       // Rebuild source\r
+                       if (!t.source || nh) {\r
+                               s = '';\r
+\r
+                               if (!nh) {\r
+                                       if (t.protocol)\r
+                                               s += t.protocol + '://';\r
+\r
+                                       if (t.userInfo)\r
+                                               s += t.userInfo + '@';\r
+\r
+                                       if (t.host)\r
+                                               s += t.host;\r
+\r
+                                       if (t.port)\r
+                                               s += ':' + t.port;\r
+                               }\r
+\r
+                               if (t.path)\r
+                                       s += t.path;\r
+\r
+                               if (t.query)\r
+                                       s += '?' + t.query;\r
+\r
+                               if (t.anchor)\r
+                                       s += '#' + t.anchor;\r
+\r
+                               t.source = s;\r
+                       }\r
+\r
+                       return t.source;\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/util/Cookie.js */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('static tinymce.util.Cookie', {\r
+               getHash : function(n) {\r
+                       var v = this.get(n), h;\r
+\r
+                       if (v) {\r
+                               each(v.split('&'), function(v) {\r
+                                       v = v.split('=');\r
+                                       h = h || {};\r
+                                       h[unescape(v[0])] = unescape(v[1]);\r
+                               });\r
+                       }\r
+\r
+                       return h;\r
+               },\r
+\r
+               setHash : function(n, v, e, p, d, s) {\r
+                       var o = '';\r
+\r
+                       each(v, function(v, k) {\r
+                               o += (!o ? '' : '&') + escape(k) + '=' + escape(v);\r
+                       });\r
+\r
+                       this.set(n, o, e, p, d, s);\r
+               },\r
+\r
+               get : function(n) {\r
+                       var c = document.cookie, e, p = n + "=", b;\r
+\r
+                       // Strict mode\r
+                       if (!c)\r
+                               return;\r
+\r
+                       b = c.indexOf("; " + p);\r
+\r
+                       if (b == -1) {\r
+                               b = c.indexOf(p);\r
+\r
+                               if (b != 0)\r
+                                       return null;\r
+                       } else\r
+                               b += 2;\r
+\r
+                       e = c.indexOf(";", b);\r
+\r
+                       if (e == -1)\r
+                               e = c.length;\r
+\r
+                       return unescape(c.substring(b + p.length, e));\r
+               },\r
+\r
+               set : function(n, v, e, p, d, s) {\r
+                       document.cookie = n + "=" + escape(v) +\r
+                               ((e) ? "; expires=" + e.toGMTString() : "") +\r
+                               ((p) ? "; path=" + escape(p) : "") +\r
+                               ((d) ? "; domain=" + d : "") +\r
+                               ((s) ? "; secure" : "");\r
+               },\r
+\r
+               remove : function(n, p) {\r
+                       var d = new Date();\r
+\r
+                       d.setTime(d.getTime() - 1000);\r
+\r
+                       this.set(n, '', d, p, d);\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/util/JSON.js */\r
+\r
+tinymce.create('static tinymce.util.JSON', {\r
+       serialize : function(o) {\r
+               var i, v, s = tinymce.util.JSON.serialize, t;\r
+\r
+               if (o == null)\r
+                       return 'null';\r
+\r
+               t = typeof o;\r
+\r
+               if (t == 'string') {\r
+                       v = '\bb\tt\nn\ff\rr\""\'\'\\\\';\r
+\r
+                       return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g, function(a, b) {\r
+                               i = v.indexOf(b);\r
+\r
+                               if (i + 1)\r
+                                       return '\\' + v.charAt(i + 1);\r
+\r
+                               a = b.charCodeAt().toString(16);\r
+\r
+                               return '\\u' + '0000'.substring(a.length) + a;\r
+                       }) + '"';\r
+               }\r
+\r
+               if (t == 'object') {\r
+                       if (o instanceof Array) {\r
+                                       for (i=0, v = '['; i<o.length; i++)\r
+                                               v += (i > 0 ? ',' : '') + s(o[i]);\r
+\r
+                                       return v + ']';\r
+                               }\r
+\r
+                               v = '{';\r
+\r
+                               for (i in o)\r
+                                       v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : '';\r
+\r
+                               return v + '}';\r
+               }\r
+\r
+               return '' + o;\r
+       },\r
+\r
+       parse : function(s) {\r
+               try {\r
+                       return eval('(' + s + ')');\r
+               } catch (ex) {\r
+                       // Ignore\r
+               }\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/util/XHR.js */\r
+\r
+tinymce.create('static tinymce.util.XHR', {\r
+       send : function(o) {\r
+               var x, t, w = window, c = 0;\r
+\r
+               // Default settings\r
+               o.scope = o.scope || this;\r
+               o.success_scope = o.success_scope || o.scope;\r
+               o.error_scope = o.error_scope || o.scope;\r
+               o.async = o.async === false ? false : true;\r
+               o.data = o.data || '';\r
+\r
+               function get(s) {\r
+                       x = 0;\r
+\r
+                       try {\r
+                               x = new ActiveXObject(s);\r
+                       } catch (ex) {\r
+                       }\r
+\r
+                       return x;\r
+               };\r
+\r
+               x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP');\r
+\r
+               if (x) {\r
+                       if (x.overrideMimeType)\r
+                               x.overrideMimeType(o.content_type);\r
+\r
+                       x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async);\r
+\r
+                       if (o.content_type)\r
+                               x.setRequestHeader('Content-Type', o.content_type);\r
+\r
+                       x.send(o.data);\r
+\r
+                       // Wait for response, onReadyStateChange can not be used since it leaks memory in IE\r
+                       t = w.setInterval(function() {\r
+                               if (x.readyState == 4 || c++ > 10000) {\r
+                                       w.clearInterval(t);\r
+\r
+                                       if (o.success && c < 10000 && x.status == 200)\r
+                                               o.success.call(o.success_scope, '' + x.responseText, x, o);\r
+                                       else if (o.error)\r
+                                               o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o);\r
+\r
+                                       x = null;\r
+                               }\r
+                       }, 10);\r
+               }\r
+\r
+               }\r
+});\r
+\r
+/* file:jscripts/tiny_mce/classes/util/JSONRequest.js */\r
+\r
+(function() {\r
+       var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR;\r
+\r
+       tinymce.create('tinymce.util.JSONRequest', {\r
+               JSONRequest : function(s) {\r
+                       this.settings = extend({\r
+                       }, s);\r
+                       this.count = 0;\r
+               },\r
+\r
+               send : function(o) {\r
+                       var ecb = o.error, scb = o.success;\r
+\r
+                       o = extend(this.settings, o);\r
+\r
+                       o.success = function(c, x) {\r
+                               c = JSON.parse(c);\r
+\r
+                               if (typeof(c) == 'undefined') {\r
+                                       c = {\r
+                                               error : 'JSON Parse error.'\r
+                                       };\r
+                               }\r
+\r
+                               if (c.error)\r
+                                       ecb.call(o.error_scope || o.scope, c.error, x);\r
+                               else\r
+                                       scb.call(o.success_scope || o.scope, c.result);\r
+                       };\r
+\r
+                       o.error = function(ty, x) {\r
+                               ecb.call(o.error_scope || o.scope, ty, x);\r
+                       };\r
+\r
+                       o.data = JSON.serialize({\r
+                               id : o.id || 'c' + (this.count++),\r
+                               method : o.method,\r
+                               params : o.params\r
+                       });\r
+\r
+                       // JSON content type for Ruby on rails. Bug: #1883287\r
+                       o.content_type = 'application/json';\r
+\r
+                       XHR.send(o);\r
+               },\r
+\r
+               'static' : {\r
+                       sendRPC : function(o) {\r
+                               return new tinymce.util.JSONRequest().send(o);\r
+                       }\r
+               }\r
+\r
+               });\r
+}());\r
+/* file:jscripts/tiny_mce/classes/dom/DOMUtils.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var each = tinymce.each, is = tinymce.is;\r
+       var isWebKit = tinymce.isWebKit, isIE = tinymce.isIE;\r
+\r
+       tinymce.create('tinymce.dom.DOMUtils', {\r
+               doc : null,\r
+               root : null,\r
+               files : null,\r
+               listeners : {},\r
+               pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/,\r
+               cache : {},\r
+               idPattern : /^#[\w]+$/,\r
+               elmPattern : /^[\w_*]+$/,\r
+               elmClassPattern : /^([\w_]*)\.([\w_]+)$/,\r
+\r
+               DOMUtils : function(d, s) {\r
+                       var t = this;\r
+\r
+                       t.doc = d;\r
+                       t.win = window;\r
+                       t.files = {};\r
+                       t.cssFlicker = false;\r
+                       t.counter = 0;\r
+                       t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat"; \r
+                       t.stdMode = d.documentMode === 8;\r
+\r
+                       this.settings = s = tinymce.extend({\r
+                               keep_values : false,\r
+                               hex_colors : 1,\r
+                               process_html : 1\r
+                       }, s);\r
+\r
+                       // Fix IE6SP2 flicker and check it failed for pre SP2\r
+                       if (tinymce.isIE6) {\r
+                               try {\r
+                                       d.execCommand('BackgroundImageCache', false, true);\r
+                               } catch (e) {\r
+                                       t.cssFlicker = true;\r
+                               }\r
+                       }\r
+\r
+                       tinymce.addUnload(t.destroy, t);\r
+               },\r
+\r
+               getRoot : function() {\r
+                       var t = this, s = t.settings;\r
+\r
+                       return (s && t.get(s.root_element)) || t.doc.body;\r
+               },\r
+\r
+               getViewPort : function(w) {\r
+                       var d, b;\r
+\r
+                       w = !w ? this.win : w;\r
+                       d = w.document;\r
+                       b = this.boxModel ? d.documentElement : d.body;\r
+\r
+                       // Returns viewport size excluding scrollbars\r
+                       return {\r
+                               x : w.pageXOffset || b.scrollLeft,\r
+                               y : w.pageYOffset || b.scrollTop,\r
+                               w : w.innerWidth || b.clientWidth,\r
+                               h : w.innerHeight || b.clientHeight\r
+                       };\r
+               },\r
+\r
+               getRect : function(e) {\r
+                       var p, t = this, w, h;\r
+\r
+                       e = t.get(e);\r
+                       p = t.getPos(e);\r
+                       w = t.getStyle(e, 'width');\r
+                       h = t.getStyle(e, 'height');\r
+\r
+                       // Non pixel value, then force offset/clientWidth\r
+                       if (w.indexOf('px') === -1)\r
+                               w = 0;\r
+\r
+                       // Non pixel value, then force offset/clientWidth\r
+                       if (h.indexOf('px') === -1)\r
+                               h = 0;\r
+\r
+                       return {\r
+                               x : p.x,\r
+                               y : p.y,\r
+                               w : parseInt(w) || e.offsetWidth || e.clientWidth,\r
+                               h : parseInt(h) || e.offsetHeight || e.clientHeight\r
+                       };\r
+               },\r
+\r
+               getParent : function(n, f, r) {\r
+                       var na, se = this.settings;\r
+\r
+                       n = this.get(n);\r
+\r
+                       if (se.strict_root)\r
+                               r = r || this.getRoot();\r
+\r
+                       // Wrap node name as func\r
+                       if (is(f, 'string')) {\r
+                               na = f.toUpperCase();\r
+\r
+                               f = function(n) {\r
+                                       var s = false;\r
+\r
+                                       // Any element\r
+                                       if (n.nodeType == 1 && na === '*') {\r
+                                               s = true;\r
+                                               return false;\r
+                                       }\r
+\r
+                                       each(na.split(','), function(v) {\r
+                                               if (n.nodeType == 1 && ((se.strict && n.nodeName.toUpperCase() == v) || n.nodeName == v)) {\r
+                                                       s = true;\r
+                                                       return false; // Break loop\r
+                                               }\r
+                                       });\r
+\r
+                                       return s;\r
+                               };\r
+                       }\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
+               get : function(e) {\r
+                       var n;\r
+\r
+                       if (this.doc && typeof(e) == 'string') {\r
+                               n = e;\r
+                               e = this.doc.getElementById(e);\r
+\r
+                               // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick\r
+                               if (e && e.id !== n)\r
+                                       return this.doc.getElementsByName(n)[1];\r
+                       }\r
+\r
+                       return e;\r
+               },\r
+\r
+               // #if !jquery\r
+\r
+               select : function(pa, s) {\r
+                       var t = this, cs, c, pl, o = [], x, i, l, n;\r
+\r
+                       s = t.get(s) || t.doc;\r
+\r
+                       // Look for native support and use that if it's found\r
+                       if (s.querySelectorAll) {\r
+                               // Element scope then use temp id\r
+                               // We need to do this to be compatible with other implementations\r
+                               // See bug report: http://bugs.webkit.org/show_bug.cgi?id=17461\r
+                               if (s != t.doc) {\r
+                                       i = s.id;\r
+                                       s.id = '_mc_tmp';\r
+                                       pa = '#_mc_tmp ' + pa;\r
+                               }\r
+\r
+                               // Select elements\r
+                               l = tinymce.grep(s.querySelectorAll(pa));\r
+\r
+                               // Restore old id\r
+                               s.id = i;\r
+\r
+                               return l;\r
+                       }\r
+\r
+                       if (t.settings.strict) {\r
+                               function get(s, n) {\r
+                                       return s.getElementsByTagName(n.toLowerCase());\r
+                               };\r
+                       } else {\r
+                               function get(s, n) {\r
+                                       return s.getElementsByTagName(n);\r
+                               };\r
+                       }\r
+\r
+                       // Simple element pattern. For example: "p" or "*"\r
+                       if (t.elmPattern.test(pa)) {\r
+                               x = get(s, pa);\r
+\r
+                               for (i = 0, l = x.length; i<l; i++)\r
+                                       o.push(x[i]);\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       // Simple class pattern. For example: "p.class" or ".class"\r
+                       if (t.elmClassPattern.test(pa)) {\r
+                               pl = t.elmClassPattern.exec(pa);\r
+                               x = get(s, pl[1] || '*');\r
+                               c = ' ' + pl[2] + ' ';\r
+\r
+                               for (i = 0, l = x.length; i<l; i++) {\r
+                                       n = x[i];\r
+\r
+                                       if (n.className && (' ' + n.className + ' ').indexOf(c) !== -1)\r
+                                               o.push(n);\r
+                               }\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       function collect(n) {\r
+                               if (!n.mce_save) {\r
+                                       n.mce_save = 1;\r
+                                       o.push(n);\r
+                               }\r
+                       };\r
+\r
+                       function collectIE(n) {\r
+                               if (!n.getAttribute('mce_save')) {\r
+                                       n.setAttribute('mce_save', '1');\r
+                                       o.push(n);\r
+                               }\r
+                       };\r
+\r
+                       function find(n, f, r) {\r
+                               var i, l, nl = get(r, n);\r
+\r
+                               for (i = 0, l = nl.length; i < l; i++)\r
+                                       f(nl[i]);\r
+                       };\r
+\r
+                       each(pa.split(','), function(v, i) {\r
+                               v = tinymce.trim(v);\r
+\r
+                               // Simple element pattern, most common in TinyMCE\r
+                               if (t.elmPattern.test(v)) {\r
+                                       each(get(s, v), function(n) {\r
+                                               collect(n);\r
+                                       });\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               // Simple element pattern with class, fairly common in TinyMCE\r
+                               if (t.elmClassPattern.test(v)) {\r
+                                       x = t.elmClassPattern.exec(v);\r
+\r
+                                       each(get(s, x[1]), function(n) {\r
+                                               if (t.hasClass(n, x[2]))\r
+                                                       collect(n);\r
+                                       });\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               if (!(cs = t.cache[pa])) {\r
+                                       cs = 'x=(function(cf, s) {';\r
+                                       pl = v.split(' ');\r
+\r
+                                       each(pl, function(v) {\r
+                                               var p = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v);\r
+\r
+                                               // Find elements\r
+                                               p[1] = p[1] || '*';\r
+                                               cs += 'find("' + p[1] + '", function(n) {';\r
+\r
+                                               // Check id\r
+                                               if (p[2])\r
+                                                       cs += 'if (n.id !== "' + p[2] + '") return;';\r
+\r
+                                               // Check classes\r
+                                               if (p[3]) {\r
+                                                       cs += 'var c = " " + n.className + " ";';\r
+                                                       cs += 'if (';\r
+                                                       c = '';\r
+                                                       each(p[3].split('.'), function(v) {\r
+                                                               if (v)\r
+                                                                       c += (c ? '||' : '') + 'c.indexOf(" ' + v + ' ") === -1';\r
+                                                       });\r
+                                                       cs += c + ') return;';\r
+                                               }\r
+                                       });\r
+\r
+                                       cs += 'cf(n);';\r
+\r
+                                       for (i = pl.length - 1; i >= 0; i--)\r
+                                               cs += '}, ' + (i ? 'n' : 's') + ');';\r
+\r
+                                       cs += '})';\r
+\r
+                                       // Compile CSS pattern function\r
+                                       t.cache[pa] = cs = eval(cs);\r
+                               }\r
+\r
+                               // Run selector function\r
+                               cs(isIE ? collectIE : collect, s);\r
+                       });\r
+\r
+                       // Cleanup\r
+                       each(o, function(n) {\r
+                               if (isIE)\r
+                                       n.removeAttribute('mce_save');\r
+                               else\r
+                                       delete n.mce_save;\r
+                       });\r
+\r
+                       return o;\r
+               },\r
+\r
+               // #endif\r
+\r
+               add : function(p, n, a, h, c) {\r
+                       var t = this;\r
+\r
+                       return this.run(p, function(p) {\r
+                               var e, k;\r
+\r
+                               e = is(n, 'string') ? t.doc.createElement(n) : n;\r
+\r
+                               if (a) {\r
+                                       for (k in a) {\r
+                                               if (a.hasOwnProperty(k) && !is(a[k], 'object'))\r
+                                                       t.setAttrib(e, k, '' + a[k]);\r
+                                       }\r
+\r
+                                       if (a.style && !is(a.style, 'string')) {\r
+                                               each(a.style, function(v, n) {\r
+                                                       t.setStyle(e, n, v);\r
+                                               });\r
+                                       }\r
+                               }\r
+\r
+                               if (h) {\r
+                                       if (h.nodeType)\r
+                                               e.appendChild(h);\r
+                                       else\r
+                                               t.setHTML(e, h);\r
+                               }\r
+\r
+                               return !c ? p.appendChild(e) : e;\r
+                       });\r
+               },\r
+\r
+               create : function(n, a, h) {\r
+                       return this.add(this.doc.createElement(n), n, a, h, 1);\r
+               },\r
+\r
+               createHTML : function(n, a, h) {\r
+                       var o = '', t = this, k;\r
+\r
+                       o += '<' + n;\r
+\r
+                       for (k in a) {\r
+                               if (a.hasOwnProperty(k))\r
+                                       o += ' ' + k + '="' + t.encode(a[k]) + '"';\r
+                       }\r
+\r
+                       if (tinymce.is(h))\r
+                               return o + '>' + h + '</' + n + '>';\r
+\r
+                       return o + ' />';\r
+               },\r
+\r
+               remove : function(n, k) {\r
+                       return this.run(n, function(n) {\r
+                               var p, g;\r
+\r
+                               p = n.parentNode;\r
+\r
+                               if (!p)\r
+                                       return null;\r
+\r
+                               if (k) {\r
+                                       each (n.childNodes, function(c) {\r
+                                               p.insertBefore(c.cloneNode(true), n);\r
+                                       });\r
+                               }\r
+\r
+                               // Fix IE psuedo leak\r
+               /*              if (isIE) {\r
+                                       p = n.cloneNode(true);\r
+                                       n.outerHTML = '';\r
+\r
+                                       return p;\r
+                               }*/\r
+\r
+                               return p.removeChild(n);\r
+                       });\r
+               },\r
+\r
+               // #if !jquery\r
+\r
+               setStyle : function(n, na, v) {\r
+                       var t = this;\r
+\r
+                       return t.run(n, function(e) {\r
+                               var s, i;\r
+\r
+                               s = e.style;\r
+\r
+                               // Camelcase it, if needed\r
+                               na = na.replace(/-(\D)/g, function(a, b){\r
+                                       return b.toUpperCase();\r
+                               });\r
+\r
+                               // Default px suffix on these\r
+                               if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v)))\r
+                                       v += 'px';\r
+\r
+                               switch (na) {\r
+                                       case 'opacity':\r
+                                               // IE specific opacity\r
+                                               if (isIE) {\r
+                                                       s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")";\r
+\r
+                                                       if (!n.currentStyle || !n.currentStyle.hasLayout)\r
+                                                               s.display = 'inline-block';\r
+                                               }\r
+\r
+                                               // Fix for older browsers\r
+                                               s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || '';\r
+                                               break;\r
+\r
+                                       case 'float':\r
+                                               isIE ? s.styleFloat = v : s.cssFloat = v;\r
+                                               break;\r
+                                       \r
+                                       default:\r
+                                               s[na] = v || '';\r
+                               }\r
+\r
+                               // Force update of the style data\r
+                               if (t.settings.update_styles)\r
+                                       t.setAttrib(e, 'mce_style');\r
+                       });\r
+               },\r
+\r
+               getStyle : function(n, na, c) {\r
+                       n = this.get(n);\r
+\r
+                       if (!n)\r
+                               return false;\r
+\r
+                       // Gecko\r
+                       if (this.doc.defaultView && c) {\r
+                               // Remove camelcase\r
+                               na = na.replace(/[A-Z]/g, function(a){\r
+                                       return '-' + a;\r
+                               });\r
+\r
+                               try {\r
+                                       return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na);\r
+                               } catch (ex) {\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
+                       if (na == 'float')\r
+                               na = isIE ? 'styleFloat' : 'cssFloat';\r
+\r
+                       // IE & Opera\r
+                       if (n.currentStyle && c)\r
+                               return n.currentStyle[na];\r
+\r
+                       return n.style[na];\r
+               },\r
+\r
+               setStyles : function(e, o) {\r
+                       var t = this, s = t.settings, ol;\r
+\r
+                       ol = s.update_styles;\r
+                       s.update_styles = 0;\r
+\r
+                       each(o, function(v, n) {\r
+                               t.setStyle(e, n, v);\r
+                       });\r
+\r
+                       // Update style info\r
+                       s.update_styles = ol;\r
+                       if (s.update_styles)\r
+                               t.setAttrib(e, s.cssText);\r
+               },\r
+\r
+               setAttrib : function(e, n, v) {\r
+                       var t = this;\r
+\r
+                       // Strict XML mode\r
+                       if (t.settings.strict)\r
+                               n = n.toLowerCase();\r
+\r
+                       return this.run(e, function(e) {\r
+                               var s = t.settings;\r
+\r
+                               switch (n) {\r
+                                       case "style":\r
+                                               if (s.keep_values) {\r
+                                                       if (v)\r
+                                                               e.setAttribute('mce_style', v, 2);\r
+                                                       else\r
+                                                               e.removeAttribute('mce_style', 2);\r
+                                               }\r
+\r
+                                               e.style.cssText = v;\r
+                                               break;\r
+\r
+                                       case "class":\r
+                                               e.className = v || ''; // Fix IE null bug\r
+                                               break;\r
+\r
+                                       case "src":\r
+                                       case "href":\r
+                                               if (s.keep_values) {\r
+                                                       if (s.url_converter)\r
+                                                               v = s.url_converter.call(s.url_converter_scope || t, v, n, e);\r
+\r
+                                                       t.setAttrib(e, 'mce_' + n, v, 2);\r
+                                               }\r
+\r
+                                               break;\r
+                               }\r
+\r
+                               if (is(v) && v !== null && v.length !== 0)\r
+                                       e.setAttribute(n, '' + v, 2);\r
+                               else\r
+                                       e.removeAttribute(n, 2);\r
+                       });\r
+               },\r
+\r
+               setAttribs : function(e, o) {\r
+                       var t = this;\r
+\r
+                       return this.run(e, function(e) {\r
+                               each(o, function(v, n) {\r
+                                       t.setAttrib(e, n, v);\r
+                               });\r
+                       });\r
+               },\r
+\r
+               // #endif\r
+\r
+               getAttrib : function(e, n, dv) {\r
+                       var v, t = this;\r
+\r
+                       e = t.get(e);\r
+\r
+                       if (!e)\r
+                               return false;\r
+\r
+                       if (!is(dv))\r
+                               dv = "";\r
+\r
+                       // Try the mce variant for these\r
+                       if (/^(src|href|style|coords)$/.test(n)) {\r
+                               v = e.getAttribute("mce_" + n);\r
+\r
+                               if (v)\r
+                                       return v;\r
+                       }\r
+\r
+                       v = e.getAttribute(n, 2);\r
+\r
+                       if (!v) {\r
+                               switch (n) {\r
+                                       case 'class':\r
+                                               v = e.className;\r
+                                               break;\r
+\r
+                                       default:\r
+                                               // Fix for IE crash Bug: #1884376 probably due to invalid DOM structure\r
+                                               if (isIE && n === 'name' && e.nodeName === 'A') {\r
+                                                       v = e.name;\r
+                                                       break;\r
+                                               }\r
+\r
+                                               v = e.attributes[n];\r
+                                               v = v && is(v.nodeValue) ? v.nodeValue : v;\r
+                               }\r
+                       }\r
+\r
+                       switch (n) {\r
+                               case 'style':\r
+                                       v = v || e.style.cssText;\r
+\r
+                                       if (v) {\r
+                                               v = t.serializeStyle(t.parseStyle(v));\r
+\r
+                                               if (t.settings.keep_values)\r
+                                                       e.setAttribute('mce_style', v);\r
+                                       }\r
+\r
+                                       break;\r
+                       }\r
+\r
+                       // Remove Apple and WebKit stuff\r
+                       if (isWebKit && n === "class" && v)\r
+                               v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, '');\r
+\r
+                       // Handle IE issues\r
+                       if (isIE) {\r
+                               switch (n) {\r
+                                       case 'rowspan':\r
+                                       case 'colspan':\r
+                                               // IE returns 1 as default value\r
+                                               if (v === 1)\r
+                                                       v = '';\r
+\r
+                                               break;\r
+\r
+                                       case 'size':\r
+                                               // IE returns +0 as default value for size\r
+                                               if (v === '+0')\r
+                                                       v = '';\r
+\r
+                                               break;\r
+\r
+                                       case 'hspace':\r
+                                               // IE returns -1 as default value\r
+                                               if (v === -1)\r
+                                                       v = '';\r
+\r
+                                               break;\r
+\r
+                                       case 'tabindex':\r
+                                               // IE returns 32768 as default value\r
+                                               if (v === 32768)\r
+                                                       v = '';\r
+\r
+                                               break;\r
+\r
+                                       case 'shape':\r
+                                               v = v.toLowerCase();\r
+                                               break;\r
+\r
+                                       default:\r
+                                               // IE has odd anonymous function for event attributes\r
+                                               if (n.indexOf('on') === 0 && v)\r
+                                                       v = ('' + v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');\r
+                               }\r
+                       }\r
+\r
+                       return (v && v != '') ? '' + v : dv;\r
+               },\r
+\r
+               getPos : function(n) {\r
+                       var t = this, x = 0, y = 0, e, d = t.doc, r;\r
+\r
+                       n = t.get(n);\r
+\r
+                       // Use getBoundingClientRect on IE, Opera has it but it's not perfect\r
+                       if (n && isIE) {\r
+                               n = n.getBoundingClientRect();\r
+                               e = t.boxModel ? d.documentElement : d.body;\r
+                               x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border\r
+                               x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x;\r
+                               n.top += t.win.self != t.win.top ? 2 : 0; // IE adds some strange extra cord if used in a frameset\r
+\r
+                               return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x};\r
+                       }\r
+\r
+                       r = n;\r
+                       while (r) {\r
+                               x += r.offsetLeft || 0;\r
+                               y += r.offsetTop || 0;\r
+                               r = r.offsetParent;\r
+                       }\r
+\r
+                       r = n;\r
+                       while (r) {\r
+                               // Opera 9.25 bug fix, fixed in 9.50\r
+                               if (!/^table-row|inline.*/i.test(t.getStyle(r, "display", 1))) {\r
+                                       x -= r.scrollLeft || 0;\r
+                                       y -= r.scrollTop || 0;\r
+                               }\r
+\r
+                               r = r.parentNode;\r
+\r
+                               if (r == d.body)\r
+                                       break;\r
+                       }\r
+\r
+                       return {x : x, y : y};\r
+               },\r
+\r
+               parseStyle : function(st) {\r
+                       var t = this, s = t.settings, o = {};\r
+\r
+                       if (!st)\r
+                               return o;\r
+\r
+                       function compress(p, s, ot) {\r
+                               var t, r, b, l;\r
+\r
+                               // Get values and check it it needs compressing\r
+                               t = o[p + '-top' + s];\r
+                               if (!t)\r
+                                       return;\r
+\r
+                               r = o[p + '-right' + s];\r
+                               if (t != r)\r
+                                       return;\r
+\r
+                               b = o[p + '-bottom' + s];\r
+                               if (r != b)\r
+                                       return;\r
+\r
+                               l = o[p + '-left' + s];\r
+                               if (b != l)\r
+                                       return;\r
+\r
+                               // Compress\r
+                               o[ot] = l;\r
+                               delete o[p + '-top' + s];\r
+                               delete o[p + '-right' + s];\r
+                               delete o[p + '-bottom' + s];\r
+                               delete o[p + '-left' + s];\r
+                       };\r
+\r
+                       function compress2(ta, a, b, c) {\r
+                               var t;\r
+\r
+                               t = o[a];\r
+                               if (!t)\r
+                                       return;\r
+\r
+                               t = o[b];\r
+                               if (!t)\r
+                                       return;\r
+\r
+                               t = o[c];\r
+                               if (!t)\r
+                                       return;\r
+\r
+                               // Compress\r
+                               o[ta] = o[a] + ' ' + o[b] + ' ' + o[c];\r
+                               delete o[a];\r
+                               delete o[b];\r
+                               delete o[c];\r
+                       };\r
+\r
+                       each(st.split(';'), function(v) {\r
+                               var sv, ur = [];\r
+\r
+                               if (v) {\r
+                                       v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';});\r
+                                       v = v.split(':');\r
+                                       sv = tinymce.trim(v[1]);\r
+                                       sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];});\r
+\r
+                                       sv = sv.replace(/rgb\([^\)]+\)/g, function(v) {\r
+                                               return t.toHex(v);\r
+                                       });\r
+\r
+                                       if (s.url_converter) {\r
+                                               sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) {\r
+                                                       return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null)) + ')';\r
+                                               });\r
+                                       }\r
+\r
+                                       o[tinymce.trim(v[0]).toLowerCase()] = sv;\r
+                               }\r
+                       });\r
+\r
+                       compress("border", "", "border");\r
+                       compress("border", "-width", "border-width");\r
+                       compress("border", "-color", "border-color");\r
+                       compress("border", "-style", "border-style");\r
+                       compress("padding", "", "padding");\r
+                       compress("margin", "", "margin");\r
+                       compress2('border', 'border-width', 'border-style', 'border-color');\r
+\r
+                       if (isIE) {\r
+                               // Remove pointless border\r
+                               if (o.border == 'medium none')\r
+                                       o.border = '';\r
+                       }\r
+\r
+                       return o;\r
+               },\r
+\r
+               serializeStyle : function(o) {\r
+                       var s = '';\r
+\r
+                       each(o, function(v, k) {\r
+                               if (k && v) {\r
+                                       switch (k) {\r
+                                               case 'color':\r
+                                               case 'background-color':\r
+                                                       v = v.toLowerCase();\r
+                                                       break;\r
+                                       }\r
+\r
+                                       s += (s ? ' ' : '') + k + ': ' + v + ';';\r
+                               }\r
+                       });\r
+\r
+                       return s;\r
+               },\r
+\r
+               loadCSS : function(u) {\r
+                       var t = this, d = t.doc;\r
+\r
+                       if (!u)\r
+                               u = '';\r
+\r
+                       each(u.split(','), function(u) {\r
+                               if (t.files[u])\r
+                                       return;\r
+\r
+                               t.files[u] = true;\r
+                               t.add(t.select('head')[0], 'link', {rel : 'stylesheet', href : u});\r
+                       });\r
+               },\r
+\r
+               // #if !jquery\r
+\r
+               addClass : function(e, c) {\r
+                       return this.run(e, function(e) {\r
+                               var o;\r
+\r
+                               if (!c)\r
+                                       return 0;\r
+\r
+                               if (this.hasClass(e, c))\r
+                                       return e.className;\r
+\r
+                               o = this.removeClass(e, c);\r
+\r
+                               return e.className = (o != '' ? (o + ' ') : '') + c;\r
+                       });\r
+               },\r
+\r
+               removeClass : function(e, c) {\r
+                       var t = this, re;\r
+\r
+                       return t.run(e, function(e) {\r
+                               var v;\r
+\r
+                               if (t.hasClass(e, c)) {\r
+                                       if (!re)\r
+                                               re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");\r
+\r
+                                       v = e.className.replace(re, ' ');\r
+\r
+                                       return e.className = tinymce.trim(v != ' ' ? v : '');\r
+                               }\r
+\r
+                               return e.className;\r
+                       });\r
+               },\r
+\r
+               hasClass : function(n, c) {\r
+                       n = this.get(n);\r
+\r
+                       if (!n || !c)\r
+                               return false;\r
+\r
+                       return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1;\r
+               },\r
+\r
+               show : function(e) {\r
+                       return this.setStyle(e, 'display', 'block');\r
+               },\r
+\r
+               hide : function(e) {\r
+                       return this.setStyle(e, 'display', 'none');\r
+               },\r
+\r
+               isHidden : function(e) {\r
+                       e = this.get(e);\r
+\r
+                       return e.style.display == 'none' || this.getStyle(e, 'display') == 'none';\r
+               },\r
+\r
+               // #endif\r
+\r
+               uniqueId : function(p) {\r
+                       return (!p ? 'mce_' : p) + (this.counter++);\r
+               },\r
+\r
+               setHTML : function(e, h) {\r
+                       var t = this;\r
+\r
+                       return this.run(e, function(e) {\r
+                               var x, i, nl, n, p, x;\r
+\r
+                               h = t.processHTML(h);\r
+\r
+                               if (isIE) {\r
+                                       function set() {\r
+                                               try {\r
+                                                       // IE will remove comments from the beginning\r
+                                                       // unless you padd the contents with something\r
+                                                       e.innerHTML = '<br />' + h;\r
+                                                       e.removeChild(e.firstChild);\r
+                                               } catch (ex) {\r
+                                                       // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p\r
+                                                       // This seems to fix this problem\r
+\r
+                                                       // Remove all child nodes\r
+                                                       while (e.firstChild)\r
+                                                               e.firstChild.removeNode();\r
+\r
+                                                       // Create new div with HTML contents and a BR infront to keep comments\r
+                                                       x = t.create('div');\r
+                                                       x.innerHTML = '<br />' + h;\r
+\r
+                                                       // Add all children from div to target\r
+                                                       each (x.childNodes, function(n, i) {\r
+                                                               // Skip br element\r
+                                                               if (i)\r
+                                                                       e.appendChild(n);\r
+                                                       });\r
+                                               }\r
+                                       };\r
+\r
+                                       // IE has a serious bug when it comes to paragraphs it can produce an invalid\r
+                                       // DOM tree if contents like this <p><ul><li>Item 1</li></ul></p> is inserted\r
+                                       // It seems to be that IE doesn't like a root block element placed inside another root block element\r
+                                       if (t.settings.fix_ie_paragraphs)\r
+                                               h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 mce_keep="true">&nbsp;</p>');\r
+\r
+                                       set();\r
+\r
+                                       if (t.settings.fix_ie_paragraphs) {\r
+                                               // Check for odd paragraphs this is a sign of a broken DOM\r
+                                               nl = e.getElementsByTagName("p");\r
+                                               for (i = nl.length - 1, x = 0; i >= 0; i--) {\r
+                                                       n = nl[i];\r
+\r
+                                                       if (!n.hasChildNodes()) {\r
+                                                               if (!n.mce_keep) {\r
+                                                                       x = 1; // Is broken\r
+                                                                       break;\r
+                                                               }\r
+\r
+                                                               n.removeAttribute('mce_keep');\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Time to fix the madness IE left us\r
+                                       if (x) {\r
+                                               // So if we replace the p elements with divs and mark them and then replace them back to paragraphs\r
+                                               // after we use innerHTML we can fix the DOM tree\r
+                                               h = h.replace(/<p([^>]+)>|<p>/g, '<div$1 mce_tmp="1">');\r
+                                               h = h.replace(/<\/p>/g, '</div>');\r
+\r
+                                               // Set the new HTML with DIVs\r
+                                               set();\r
+\r
+                                               // Replace all DIV elements with he mce_tmp attibute back to paragraphs\r
+                                               // This is needed since IE has a annoying bug see above for details\r
+                                               // This is a slow process but it has to be done. :(\r
+                                               if (t.settings.fix_ie_paragraphs) {\r
+                                                       nl = e.getElementsByTagName("DIV");\r
+                                                       for (i = nl.length - 1; i >= 0; i--) {\r
+                                                               n = nl[i];\r
+\r
+                                                               // Is it a temp div\r
+                                                               if (n.mce_tmp) {\r
+                                                                       // Create new paragraph\r
+                                                                       p = t.doc.createElement('p');\r
+\r
+                                                                       // Copy all attributes\r
+                                                                       n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) {\r
+                                                                               var v;\r
+\r
+                                                                               if (b !== 'mce_tmp') {\r
+                                                                                       v = n.getAttribute(b);\r
+\r
+                                                                                       if (!v && b === 'class')\r
+                                                                                               v = n.className;\r
+\r
+                                                                                       p.setAttribute(b, v);\r
+                                                                               }\r
+                                                                       });\r
+\r
+                                                                       // Append all children to new paragraph\r
+                                                                       for (x = 0; x<n.childNodes.length; x++)\r
+                                                                               p.appendChild(n.childNodes[x].cloneNode(true));\r
+\r
+                                                                       // Replace div with new paragraph\r
+                                                                       n.swapNode(p);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               } else\r
+                                       e.innerHTML = h;\r
+\r
+                               return h;\r
+                       });\r
+               },\r
+\r
+               processHTML : function(h) {\r
+                       var t = this, s = t.settings;\r
+\r
+                       if (!s.process_html)\r
+                               return h;\r
+\r
+                       // Convert strong and em to b and i in FF since it can't handle them\r
+                       if (tinymce.isGecko) {\r
+                               h = h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi, '<$1b$2>');\r
+                               h = h.replace(/<(\/?)em>|<em( [^>]+)>/gi, '<$1i$2>');\r
+                       }\r
+\r
+                       // Fix some issues\r
+                       h = h.replace(/<a( )([^>]+)\/>|<a\/>/gi, '<a$1$2></a>'); // Force open\r
+\r
+                       // Store away src and href in mce_src and mce_href since browsers mess them up\r
+                       if (s.keep_values) {\r
+                               // Wrap scripts in comments for serialization purposes\r
+                               if (h.indexOf('<script') !== -1) {\r
+                                       h = h.replace(/<script>/g, '<script type="text/javascript">');\r
+                                       h = h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g, '<mce:script$1><!--\n');\r
+                                       h = h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g, '\n// --></mce:script>');\r
+                                       h = h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g, '<mce:script$1></mce:script>');\r
+                               }\r
+\r
+                               // Process all tags with src, href or style\r
+                               h = h.replace(/<([\w:]+) [^>]*(src|href|style|coords)[^>]*>/gi, function(a, n) {\r
+                                       function handle(m, b, c) {\r
+                                               var u = c;\r
+\r
+                                               // Tag already got a mce_ version\r
+                                               if (a.indexOf('mce_' + b) != -1)\r
+                                                       return m;\r
+\r
+                                               if (b == 'style') {\r
+                                                       // Why did I need this one?\r
+                                                       //if (isIE)\r
+                                                       //      u = t.serializeStyle(t.parseStyle(u));\r
+\r
+                                                       if (s.hex_colors) {\r
+                                                               u = u.replace(/rgb\([^\)]+\)/g, function(v) {\r
+                                                                       return t.toHex(v);\r
+                                                               });\r
+                                                       }\r
+\r
+                                                       if (s.url_converter) {\r
+                                                               u = u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g, function(x, c) {\r
+                                                                       return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n)) + ')';\r
+                                                               });\r
+                                                       }\r
+                                               } else if (b != 'coords') {\r
+                                                       if (s.url_converter)\r
+                                                               u = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n));\r
+                                               }\r
+\r
+                                               return ' ' + b + '="' + c + '" mce_' + b + '="' + u + '"';\r
+                                       };\r
+\r
+                                       a = a.replace(/ (src|href|style|coords)=[\"]([^\"]+)[\"]/gi, handle); // W3C\r
+                                       a = a.replace(/ (src|href|style|coords)=[\']([^\']+)[\']/gi, handle); // W3C\r
+\r
+                                       return a.replace(/ (src|href|style|coords)=([^\s\"\'>]+)/gi, handle); // IE\r
+                               });\r
+                       }\r
+\r
+                       return h;\r
+               },\r
+\r
+               getOuterHTML : function(e) {\r
+                       var d;\r
+\r
+                       e = this.get(e);\r
+\r
+                       if (!e)\r
+                               return null;\r
+\r
+                       if (isIE)\r
+                               return e.outerHTML;\r
+\r
+                       d = (e.ownerDocument || this.doc).createElement("body");\r
+                       d.appendChild(e.cloneNode(true));\r
+\r
+                       return d.innerHTML;\r
+               },\r
+\r
+               setOuterHTML : function(e, h, d) {\r
+                       var t = this;\r
+\r
+                       return this.run(e, function(e) {\r
+                               var n, tp;\r
+\r
+                               e = t.get(e);\r
+                               d = d || e.ownerDocument || t.doc;\r
+\r
+                               if (isIE && e.nodeType == 1)\r
+                                       e.outerHTML = h;\r
+                               else {\r
+                                       tp = d.createElement("body");\r
+                                       tp.innerHTML = h;\r
+\r
+                                       n = tp.lastChild;\r
+                                       while (n) {\r
+                                               t.insertAfter(n.cloneNode(true), e);\r
+                                               n = n.previousSibling;\r
+                                       }\r
+\r
+                                       t.remove(e);\r
+                               }\r
+                       });\r
+               },\r
+\r
+               decode : function(s) {\r
+                       var e;\r
+\r
+                       // Look for entities to decode\r
+                       if (/&[^;]+;/.test(s)) {\r
+                               // Decode the entities using a div element not super efficient but less code\r
+                               e = this.doc.createElement("div");\r
+                               e.innerHTML = s;\r
+\r
+                               return !e.firstChild ? s : e.firstChild.nodeValue;\r
+                       }\r
+\r
+                       return s;\r
+               },\r
+\r
+               encode : function(s) {\r
+                       return s ? ('' + s).replace(/[<>&\"]/g, function (c, b) {\r
+                               switch (c) {\r
+                                       case '&':\r
+                                               return '&amp;';\r
+\r
+                                       case '"':\r
+                                               return '&quot;';\r
+\r
+                                       case '<':\r
+                                               return '&lt;';\r
+\r
+                                       case '>':\r
+                                               return '&gt;';\r
+                               }\r
+\r
+                               return c;\r
+                       }) : s;\r
+               },\r
+\r
+               // #if !jquery\r
+\r
+               insertAfter : function(n, r) {\r
+                       var t = this;\r
+\r
+                       r = t.get(r);\r
+\r
+                       return this.run(n, function(n) {\r
+                               var p, ns;\r
+\r
+                               p = r.parentNode;\r
+                               ns = r.nextSibling;\r
+\r
+                               if (ns)\r
+                                       p.insertBefore(n, ns);\r
+                               else\r
+                                       p.appendChild(n);\r
+\r
+                               return n;\r
+                       });\r
+               },\r
+\r
+               // #endif\r
+\r
+               isBlock : function(n) {\r
+                       if (n.nodeType && n.nodeType !== 1)\r
+                               return false;\r
+\r
+                       n = n.nodeName || n;\r
+\r
+                       return /^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);\r
+               },\r
+\r
+               // #if !jquery\r
+\r
+               replace : function(n, o, k) {\r
+                       if (is(o, 'array'))\r
+                               n = n.cloneNode(true);\r
+\r
+                       return this.run(o, function(o) {\r
+                               if (k) {\r
+                                       each(o.childNodes, function(c) {\r
+                                               n.appendChild(c.cloneNode(true));\r
+                                       });\r
+                               }\r
+\r
+                               // Fix IE psuedo leak for elements since replacing elements if fairly common\r
+                               if (isIE && o.nodeType === 1) {\r
+                                       o.parentNode.insertBefore(n, o);\r
+                                       o.outerHTML = '';\r
+                                       return n;\r
+                               }\r
+\r
+                               return o.parentNode.replaceChild(n, o);\r
+                       });\r
+               },\r
+\r
+               // #endif\r
+\r
+               toHex : function(s) {\r
+                       var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);\r
+\r
+                       function hex(s) {\r
+                               s = parseInt(s).toString(16);\r
+\r
+                               return s.length > 1 ? s : '0' + s; // 0 -> 00\r
+                       };\r
+\r
+                       if (c) {\r
+                               s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]);\r
+\r
+                               return s;\r
+                       }\r
+\r
+                       return s;\r
+               },\r
+\r
+               getClasses : function() {\r
+                       var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov;\r
+\r
+                       if (t.classes)\r
+                               return t.classes;\r
+\r
+                       function addClasses(s) {\r
+                               // IE style imports\r
+                               each(s.imports, function(r) {\r
+                                       addClasses(r);\r
+                               });\r
+\r
+                               each(s.cssRules || s.rules, function(r) {\r
+                                       // Real type or fake it on IE\r
+                                       switch (r.type || 1) {\r
+                                               // Rule\r
+                                               case 1:\r
+                                                       if (r.selectorText) {\r
+                                                               each(r.selectorText.split(','), function(v) {\r
+                                                                       v = v.replace(/^\s*|\s*$|^\s\./g, "");\r
+\r
+                                                                       // Is internal or it doesn't contain a class\r
+                                                                       if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v))\r
+                                                                               return;\r
+\r
+                                                                       // Remove everything but class name\r
+                                                                       ov = v;\r
+                                                                       v = v.replace(/.*\.([a-z0-9_\-]+).*/i, '$1');\r
+\r
+                                                                       // Filter classes\r
+                                                                       if (f && !(v = f(v, ov)))\r
+                                                                               return;\r
+\r
+                                                                       if (!lo[v]) {\r
+                                                                               cl.push({'class' : v});\r
+                                                                               lo[v] = 1;\r
+                                                                       }\r
+                                                               });\r
+                                                       }\r
+                                                       break;\r
+\r
+                                               // Import\r
+                                               case 3:\r
+                                                       addClasses(r.styleSheet);\r
+                                                       break;\r
+                                       }\r
+                               });\r
+                       };\r
+\r
+                       try {\r
+                               each(t.doc.styleSheets, addClasses);\r
+                       } catch (ex) {\r
+                               // Ignore\r
+                       }\r
+\r
+                       if (cl.length > 0)\r
+                               t.classes = cl;\r
+\r
+                       return cl;\r
+               },\r
+\r
+               run : function(e, f, s) {\r
+                       var t = this, o;\r
+\r
+                       if (t.doc && typeof(e) === 'string')\r
+                               e = t.doc.getElementById(e);\r
+\r
+                       if (!e)\r
+                               return false;\r
+\r
+                       s = s || this;\r
+                       if (!e.nodeType && (e.length || e.length === 0)) {\r
+                               o = [];\r
+\r
+                               each(e, function(e, i) {\r
+                                       if (e) {\r
+                                               if (typeof(e) == 'string')\r
+                                                       e = t.doc.getElementById(e);\r
+\r
+                                               o.push(f.call(s, e, i));\r
+                                       }\r
+                               });\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       return f.call(s, e);\r
+               },\r
+\r
+               getAttribs : function(n) {\r
+                       var o;\r
+\r
+                       n = this.get(n);\r
+\r
+                       if (!n)\r
+                               return [];\r
+\r
+                       if (isIE) {\r
+                               o = [];\r
+\r
+                               // Object will throw exception in IE\r
+                               if (n.nodeName == 'OBJECT')\r
+                                       return n.attributes;\r
+\r
+                               // It's crazy that this is faster in IE but it's because it returns all attributes all the time\r
+                               n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi, function(a, b) {\r
+                                       o.push({specified : 1, nodeName : b});\r
+                               });\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       return n.attributes;\r
+               },\r
+\r
+               destroy : function(s) {\r
+                       var t = this;\r
+\r
+                       t.win = t.doc = t.root = null;\r
+\r
+                       // Manual destroy then remove unload handler\r
+                       if (!s)\r
+                               tinymce.removeUnload(t.destroy);\r
+               }\r
+\r
+               /*\r
+               walk : function(n, f, s) {\r
+                       var d = this.doc, w;\r
+\r
+                       if (d.createTreeWalker) {\r
+                               w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);\r
+\r
+                               while ((n = w.nextNode()) != null)\r
+                                       f.call(s || this, n);\r
+                       } else\r
+                               tinymce.walk(n, f, 'childNodes', s);\r
+               }\r
+               */\r
+\r
+               /*\r
+               toRGB : function(s) {\r
+                       var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s);\r
+\r
+                       if (c) {\r
+                               // #FFF -> #FFFFFF\r
+                               if (!is(c[3]))\r
+                                       c[3] = c[2] = c[1];\r
+\r
+                               return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")";\r
+                       }\r
+\r
+                       return s;\r
+               }\r
+               */\r
+\r
+               });\r
+\r
+       // Setup page DOM\r
+       tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0});\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/Event.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event;\r
+\r
+       tinymce.create('static tinymce.dom.Event', {\r
+               inits : [],\r
+               events : [],\r
+\r
+               // #if !jquery\r
+\r
+               add : function(o, n, f, s) {\r
+                       var cb, t = this, el = t.events, r;\r
+\r
+                       // Handle array\r
+                       if (o && o instanceof Array) {\r
+                               r = [];\r
+\r
+                               each(o, function(o) {\r
+                                       o = DOM.get(o);\r
+                                       r.push(t.add(o, n, f, s));\r
+                               });\r
+\r
+                               return r;\r
+                       }\r
+\r
+                       o = DOM.get(o);\r
+\r
+                       if (!o)\r
+                               return;\r
+\r
+                       // Setup event callback\r
+                       cb = function(e) {\r
+                               e = e || window.event;\r
+\r
+                               // Patch in target in IE it's W3C valid\r
+                               if (e && !e.target && isIE)\r
+                                       e.target = e.srcElement;\r
+\r
+                               if (!s)\r
+                                       return f(e);\r
+\r
+                               return f.call(s, e);\r
+                       };\r
+\r
+                       if (n == 'unload') {\r
+                               tinymce.unloads.unshift({func : cb});\r
+                               return cb;\r
+                       }\r
+\r
+                       if (n == 'init') {\r
+                               if (t.domLoaded)\r
+                                       cb();\r
+                               else\r
+                                       t.inits.push(cb);\r
+\r
+                               return cb;\r
+                       }\r
+\r
+                       // Store away listener reference\r
+                       el.push({\r
+                               obj : o,\r
+                               name : n,\r
+                               func : f,\r
+                               cfunc : cb,\r
+                               scope : s\r
+                       });\r
+\r
+                       t._add(o, n, cb);\r
+\r
+                       return f;\r
+               },\r
+\r
+               remove : function(o, n, f) {\r
+                       var t = this, a = t.events, s = false, r;\r
+\r
+                       // Handle array\r
+                       if (o && o instanceof Array) {\r
+                               r = [];\r
+\r
+                               each(o, function(o) {\r
+                                       o = DOM.get(o);\r
+                                       r.push(t.remove(o, n, f));\r
+                               });\r
+\r
+                               return r;\r
+                       }\r
+\r
+                       o = DOM.get(o);\r
+\r
+                       each(a, function(e, i) {\r
+                               if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) {\r
+                                       a.splice(i, 1);\r
+                                       t._remove(o, n, e.cfunc);\r
+                                       s = true;\r
+                                       return false;\r
+                               }\r
+                       });\r
+\r
+                       return s;\r
+               },\r
+\r
+               clear : function(o) {\r
+                       var t = this, a = t.events, i, e;\r
+\r
+                       if (o) {\r
+                               o = DOM.get(o);\r
+\r
+                               for (i = a.length - 1; i >= 0; i--) {\r
+                                       e = a[i];\r
+\r
+                                       if (e.obj === o) {\r
+                                               t._remove(e.obj, e.name, e.cfunc);\r
+                                               e.obj = e.cfunc = null;\r
+                                               a.splice(i, 1);\r
+                                       }\r
+                               }\r
+                       }\r
+               },\r
+\r
+               // #endif\r
+\r
+               cancel : function(e) {\r
+                       if (!e)\r
+                               return false;\r
+\r
+                       this.stop(e);\r
+                       return this.prevent(e);\r
+               },\r
+\r
+               stop : function(e) {\r
+                       if (e.stopPropagation)\r
+                               e.stopPropagation();\r
+                       else\r
+                               e.cancelBubble = true;\r
+\r
+                       return false;\r
+               },\r
+\r
+               prevent : function(e) {\r
+                       if (e.preventDefault)\r
+                               e.preventDefault();\r
+                       else\r
+                               e.returnValue = false;\r
+\r
+                       return false;\r
+               },\r
+\r
+               _unload : function() {\r
+                       var t = Event;\r
+\r
+                       each(t.events, function(e, i) {\r
+                               t._remove(e.obj, e.name, e.cfunc);\r
+                               e.obj = e.cfunc = null;\r
+                       });\r
+\r
+                       t.events = [];\r
+                       t = null;\r
+               },\r
+\r
+               _add : function(o, n, f) {\r
+                       if (o.attachEvent)\r
+                               o.attachEvent('on' + n, f);\r
+                       else if (o.addEventListener)\r
+                               o.addEventListener(n, f, false);\r
+                       else\r
+                               o['on' + n] = f;\r
+               },\r
+\r
+               _remove : function(o, n, f) {\r
+                       if (o) {\r
+                               try {\r
+                                       if (o.detachEvent)\r
+                                               o.detachEvent('on' + n, f);\r
+                                       else if (o.removeEventListener)\r
+                                               o.removeEventListener(n, f, false);\r
+                                       else\r
+                                               o['on' + n] = null;\r
+                               } catch (ex) {\r
+                                       // Might fail with permission denined on IE so we just ignore that\r
+                               }\r
+                       }\r
+               },\r
+\r
+               _pageInit : function() {\r
+                       var e = Event;\r
+\r
+                       e._remove(window, 'DOMContentLoaded', e._pageInit);\r
+                       e.domLoaded = true;\r
+\r
+                       each(e.inits, function(c) {\r
+                               c();\r
+                       });\r
+\r
+                       e.inits = [];\r
+               },\r
+\r
+               _wait : function() {\r
+                       var t;\r
+\r
+                       // No need since the document is already loaded\r
+                       if (window.tinyMCE_GZ && tinyMCE_GZ.loaded)\r
+                               return;\r
+\r
+                       if (isIE && document.location.protocol != 'https:') {\r
+                               // Fake DOMContentLoaded on IE\r
+                               document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');\r
+                               DOM.get("__ie_onload").onreadystatechange = function() {\r
+                                       if (this.readyState == "complete") {\r
+                                               Event._pageInit();\r
+                                               DOM.get("__ie_onload").onreadystatechange = null; // Prevent leak\r
+                                       }\r
+                               };\r
+                       } else {\r
+                               Event._add(window, 'DOMContentLoaded', Event._pageInit, Event);\r
+\r
+                               if (isIE || isWebKit) {\r
+                                       t = setInterval(function() {\r
+                                               if (/loaded|complete/.test(document.readyState)) {\r
+                                                       clearInterval(t);\r
+                                                       Event._pageInit();\r
+                                               }\r
+                                       }, 10);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               });\r
+\r
+       // Shorten name\r
+       Event = tinymce.dom.Event;\r
+\r
+       // Dispatch DOM content loaded event for IE and Safari\r
+       Event._wait();\r
+       tinymce.addUnload(Event._unload);\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/Element.js */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.dom.Element', {\r
+               Element : function(id, s) {\r
+                       var t = this, dom, el;\r
+\r
+                       s = s || {};\r
+                       t.id = id;\r
+                       t.dom = dom = s.dom || tinymce.DOM;\r
+                       t.settings = s;\r
+\r
+                       // Only IE leaks DOM references, this is a lot faster\r
+                       if (!tinymce.isIE)\r
+                               el = t.dom.get(t.id);\r
+\r
+                       each([\r
+                               'getPos',\r
+                               'getRect',\r
+                               'getParent',\r
+                               'add',\r
+                               'setStyle',\r
+                               'getStyle',\r
+                               'setStyles',\r
+                               'setAttrib',\r
+                               'setAttribs',\r
+                               'getAttrib',\r
+                               'addClass',\r
+                               'removeClass',\r
+                               'hasClass',\r
+                               'getOuterHTML',\r
+                               'setOuterHTML',\r
+                               'remove',\r
+                               'show',\r
+                               'hide',\r
+                               'isHidden',\r
+                               'setHTML',\r
+                               'get'\r
+                       ], function(k) {\r
+                               t[k] = function() {\r
+                                       var a = arguments, o;\r
+\r
+                                       // Opera fails\r
+                                       if (tinymce.isOpera) {\r
+                                               a = [id];\r
+\r
+                                               each(arguments, function(v) {\r
+                                                       a.push(v);\r
+                                               });\r
+                                       } else\r
+                                               Array.prototype.unshift.call(a, el || id);\r
+\r
+                                       o = dom[k].apply(dom, a);\r
+                                       t.update(k);\r
+\r
+                                       return o;\r
+                               };\r
+                       });\r
+               },\r
+\r
+               on : function(n, f, s) {\r
+                       return tinymce.dom.Event.add(this.id, n, f, s);\r
+               },\r
+\r
+               getXY : function() {\r
+                       return {\r
+                               x : parseInt(this.getStyle('left')),\r
+                               y : parseInt(this.getStyle('top'))\r
+                       };\r
+               },\r
+\r
+               getSize : function() {\r
+                       var n = this.dom.get(this.id);\r
+\r
+                       return {\r
+                               w : parseInt(this.getStyle('width') || n.clientWidth),\r
+                               h : parseInt(this.getStyle('height') || n.clientHeight)\r
+                       };\r
+               },\r
+\r
+               moveTo : function(x, y) {\r
+                       this.setStyles({left : x, top : y});\r
+               },\r
+\r
+               moveBy : function(x, y) {\r
+                       var p = this.getXY();\r
+\r
+                       this.moveTo(p.x + x, p.y + y);\r
+               },\r
+\r
+               resizeTo : function(w, h) {\r
+                       this.setStyles({width : w, height : h});\r
+               },\r
+\r
+               resizeBy : function(w, h) {\r
+                       var s = this.getSize();\r
+\r
+                       this.resizeTo(s.w + w, s.h + h);\r
+               },\r
+\r
+               update : function(k) {\r
+                       var t = this, b, dom = t.dom;\r
+\r
+                       if (tinymce.isIE6 && t.settings.blocker) {\r
+                               k = k || '';\r
+\r
+                               // Ignore getters\r
+                               if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0)\r
+                                       return;\r
+\r
+                               // Remove blocker on remove\r
+                               if (k == 'remove') {\r
+                                       dom.remove(t.blocker);\r
+                                       return;\r
+                               }\r
+\r
+                               if (!t.blocker) {\r
+                                       t.blocker = dom.uniqueId();\r
+                                       b = dom.add(t.settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'});\r
+                                       dom.setStyle(b, 'opacity', 0);\r
+                               } else\r
+                                       b = dom.get(t.blocker);\r
+\r
+                               dom.setStyle(b, 'left', t.getStyle('left', 1));\r
+                               dom.setStyle(b, 'top', t.getStyle('top', 1));\r
+                               dom.setStyle(b, 'width', t.getStyle('width', 1));\r
+                               dom.setStyle(b, 'height', t.getStyle('height', 1));\r
+                               dom.setStyle(b, 'display', t.getStyle('display', 1));\r
+                               dom.setStyle(b, 'zIndex', parseInt(t.getStyle('zIndex', 1) || 0) - 1);\r
+                       }\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/Selection.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.dom.Selection', {\r
+               Selection : function(dom, win, serializer) {\r
+                       var t = this;\r
+\r
+                       t.dom = dom;\r
+                       t.win = win;\r
+                       t.serializer = serializer;\r
+\r
+                       // Prevent leaks\r
+                       tinymce.addUnload(t.destroy, t);\r
+               },\r
+\r
+               getContent : function(s) {\r
+                       var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n;\r
+\r
+                       s = s || {};\r
+                       wb = wa = '';\r
+                       s.get = true;\r
+                       s.format = s.format || 'html';\r
+\r
+                       if (s.format == 'text')\r
+                               return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : ''));\r
+\r
+                       if (r.cloneContents) {\r
+                               n = r.cloneContents();\r
+\r
+                               if (n)\r
+                                       e.appendChild(n);\r
+                       } else if (is(r.item) || is(r.htmlText))\r
+                               e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;\r
+                       else\r
+                               e.innerHTML = r.toString();\r
+\r
+                       // Keep whitespace before and after\r
+                       if (/^\s/.test(e.innerHTML))\r
+                               wb = ' ';\r
+\r
+                       if (/\s+$/.test(e.innerHTML))\r
+                               wa = ' ';\r
+\r
+                       s.getInner = true;\r
+\r
+                       return t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa;\r
+               },\r
+\r
+               setContent : function(h, s) {\r
+                       var t = this, r = t.getRng(), d;\r
+\r
+                       s = s || {format : 'html'};\r
+                       s.set = true;\r
+                       h = t.dom.processHTML(h);\r
+\r
+                       if (r.insertNode) {\r
+                               d = t.win.document;\r
+\r
+                               // Gecko has a bug where if you insert &nbsp; using InsertHTML it will insert a space instead\r
+                               // So we simply check if the input is HTML or text and then insert text using the insertNode method\r
+                               if (tinymce.isGecko && h.indexOf('<') == -1) {\r
+                                       r.deleteContents();\r
+                                       r.insertNode(t.getRng().createContextualFragment(h + '<span id="__caret">_</span>'));\r
+                                       t.select(t.dom.get('__caret'));\r
+                                       t.getRng().deleteContents();\r
+                                       return;\r
+                               }\r
+\r
+                               // Use insert HTML if it exists (places cursor after content)\r
+                               try {\r
+                                       // This might fail with an exception see bug #1893736\r
+                                       if (d.queryCommandEnabled('InsertHTML'))\r
+                                               return d.execCommand('InsertHTML', false, h);\r
+                               } catch (ex) {\r
+                                       // Use old school method\r
+                                       r.deleteContents();\r
+                                       r.insertNode(t.getRng().createContextualFragment(h));\r
+                               }\r
+                       } else {\r
+                               if (r.item)\r
+                                       r.item(0).outerHTML = h;\r
+                               else\r
+                                       r.pasteHTML(h);\r
+                       }\r
+               },\r
+\r
+               getStart : function() {\r
+                       var t = this, r = t.getRng(), e;\r
+\r
+                       if (isIE) {\r
+                               if (r.item)\r
+                                       return r.item(0);\r
+\r
+                               r = r.duplicate();\r
+                               r.collapse(1);\r
+                               e = r.parentElement();\r
+\r
+                               if (e.nodeName == 'BODY')\r
+                                       return e.firstChild;\r
+\r
+                               return e;\r
+                       } else {\r
+                               e = r.startContainer;\r
+\r
+                               if (e.nodeName == 'BODY')\r
+                                       return e.firstChild;\r
+\r
+                               return t.dom.getParent(e, function(n) {return n.nodeType == 1;});\r
+                       }\r
+               },\r
+\r
+               getEnd : function() {\r
+                       var t = this, r = t.getRng(), e;\r
+\r
+                       if (isIE) {\r
+                               if (r.item)\r
+                                       return r.item(0);\r
+\r
+                               r = r.duplicate();\r
+                               r.collapse(0);\r
+                               e = r.parentElement();\r
+\r
+                               if (e.nodeName == 'BODY')\r
+                                       return e.lastChild;\r
+\r
+                               return e;\r
+                       } else {\r
+                               e = r.endContainer;\r
+\r
+                               if (e.nodeName == 'BODY')\r
+                                       return e.lastChild;\r
+\r
+                               return t.dom.getParent(e, function(n) {return n.nodeType == 1;});\r
+                       }\r
+               },\r
+\r
+               getBookmark : function(si) {\r
+                       var t = this, r = t.getRng(), tr, sx, sy, vp = t.dom.getViewPort(t.win), e, sp, bp, le, c = -0xFFFFFF, s, ro = t.dom.getRoot(), wb = 0, wa = 0, nv;\r
+                       sx = vp.x;\r
+                       sy = vp.y;\r
+\r
+                       // Simple bookmark fast but not as persistent\r
+                       if (si == 'simple')\r
+                               return {rng : r, scrollX : sx, scrollY : sy};\r
+\r
+                       // Handle IE\r
+                       if (isIE) {\r
+                               // Control selection\r
+                               if (r.item) {\r
+                                       e = r.item(0);\r
+\r
+                                       each(t.dom.select(e.nodeName), function(n, i) {\r
+                                               if (e == n) {\r
+                                                       sp = i;\r
+                                                       return false;\r
+                                               }\r
+                                       });\r
+\r
+                                       return {\r
+                                               tag : e.nodeName,\r
+                                               index : sp,\r
+                                               scrollX : sx,\r
+                                               scrollY : sy\r
+                                       };\r
+                               }\r
+\r
+                               // Text selection\r
+                               tr = t.dom.doc.body.createTextRange();\r
+                               tr.moveToElementText(ro);\r
+                               tr.collapse(true);\r
+                               bp = Math.abs(tr.move('character', c));\r
+\r
+                               tr = r.duplicate();\r
+                               tr.collapse(true);\r
+                               sp = Math.abs(tr.move('character', c));\r
+\r
+                               tr = r.duplicate();\r
+                               tr.collapse(false);\r
+                               le = Math.abs(tr.move('character', c)) - sp;\r
+\r
+                               return {\r
+                                       start : sp - bp,\r
+                                       length : le,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+\r
+                       // Handle W3C\r
+                       e = t.getNode();\r
+                       s = t.getSel();\r
+\r
+                       if (!s)\r
+                               return null;\r
+\r
+                       // Image selection\r
+                       if (e && e.nodeName == 'IMG') {\r
+                               return {\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+\r
+                       // Text selection\r
+\r
+                       function getPos(r, sn, en) {\r
+                               var w = t.dom.doc.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
+\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 += tinymce.trim(n.nodeValue || '').length;\r
+                               }\r
+\r
+                               return null;\r
+                       };\r
+\r
+                       // Caret or selection\r
+                       if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {\r
+                               e = getPos(ro, s.anchorNode, s.focusNode);\r
+\r
+                               if (!e)\r
+                                       return {scrollX : sx, scrollY : sy};\r
+\r
+                               // Count whitespace before\r
+                               (s.anchorNode.nodeValue || '').replace(/^\s+/, function(a) {wb = a.length;});\r
+\r
+                               return {\r
+                                       start : Math.max(e.start + s.anchorOffset - wb, 0),\r
+                                       end : Math.max(e.end + s.focusOffset - wb, 0),\r
+                                       scrollX : sx,\r
+                                       scrollY : sy,\r
+                                       beg : s.anchorOffset - wb == 0\r
+                               };\r
+                       } else {\r
+                               e = getPos(ro, r.startContainer, r.endContainer);\r
+\r
+                               // Count whitespace before start and end container\r
+                               (r.startContainer.nodeValue || '').replace(/^\s+/, function(a) {wb = a.length;});\r
+                               (r.endContainer.nodeValue || '').replace(/^\s+/, function(a) {wa = a.length;});\r
+\r
+                               if (!e)\r
+                                       return {scrollX : sx, scrollY : sy};\r
+\r
+                               return {\r
+                                       start : Math.max(e.start + r.startOffset - wb, 0),\r
+                                       end : Math.max(e.end + r.endOffset - wa, 0),\r
+                                       scrollX : sx,\r
+                                       scrollY : sy,\r
+                                       beg : r.startOffset - wb == 0\r
+                               };\r
+                       }\r
+               },\r
+\r
+               moveToBookmark : function(b) {\r
+                       var t = this, r = t.getRng(), s = t.getSel(), ro = t.dom.getRoot(), sd, nvl, nv;\r
+\r
+                       function getPos(r, sp, ep) {\r
+                               var w = t.dom.doc.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}, o, v, wa, wb;\r
+\r
+                               while ((n = w.nextNode()) != null) {\r
+                                       wa = wb = 0;\r
+\r
+                                       nv = n.nodeValue || '';\r
+                                       nv.replace(/^\s+[^\s]/, function(a) {wb = a.length - 1;});\r
+                                       nv.replace(/[^\s]\s+$/, function(a) {wa = a.length - 1;});\r
+\r
+                                       nvl = tinymce.trim(nv).length;\r
+                                       p += nvl;\r
+\r
+                                       if (p >= sp && !d.startNode) {\r
+                                               o = sp - (p - nvl);\r
+\r
+                                               // Fix for odd quirk in FF\r
+                                               if (b.beg && o >= nvl)\r
+                                                       continue;\r
+\r
+                                               d.startNode = n;\r
+                                               d.startOffset = o + wb;\r
+                                       }\r
+\r
+                                       if (p >= ep) {\r
+                                               d.endNode = n;\r
+                                               d.endOffset = ep - (p - nvl) + wb;\r
+                                               return d;\r
+                                       }\r
+                               }\r
+\r
+                               return null;\r
+                       };\r
+\r
+                       if (!b)\r
+                               return false;\r
+\r
+                       t.win.scrollTo(b.scrollX, b.scrollY);\r
+\r
+                       // Handle explorer\r
+                       if (isIE) {\r
+                               // Handle simple\r
+                               if (r = b.rng) {\r
+                                       try {\r
+                                               r.select();\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+\r
+                                       return true;\r
+                               }\r
+\r
+                               t.win.focus();\r
+\r
+                               // Handle control bookmark\r
+                               if (b.tag) {\r
+                                       r = ro.createControlRange();\r
+\r
+                                       each(t.dom.select(b.tag), function(n, i) {\r
+                                               if (i == b.index)\r
+                                                       r.addElement(n);\r
+                                       });\r
+                               } else {\r
+                                       // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs\r
+                                       try {\r
+                                               // Incorrect bookmark\r
+                                               if (b.start < 0)\r
+                                                       return true;\r
+\r
+                                               r = s.createRange();\r
+                                               r.moveToElementText(ro);\r
+                                               r.collapse(true);\r
+                                               r.moveStart('character', b.start);\r
+                                               r.moveEnd('character', b.length);\r
+                                       } catch (ex2) {\r
+                                               return true;\r
+                                       }\r
+                               }\r
+\r
+                               try {\r
+                                       r.select();\r
+                               } catch (ex) {\r
+                                       // Needed for some odd IE bug #1843306\r
+                               }\r
+\r
+                               return true;\r
+                       }\r
+\r
+                       // Handle W3C\r
+                       if (!s)\r
+                               return false;\r
+\r
+                       // Handle simple\r
+                       if (b.rng) {\r
+                               s.removeAllRanges();\r
+                               s.addRange(b.rng);\r
+                       } else {\r
+                               if (is(b.start) && is(b.end)) {\r
+                                       try {\r
+                                               sd = getPos(ro, b.start, b.end);\r
+\r
+                                               if (sd) {\r
+                                                       r = t.dom.doc.createRange();\r
+                                                       r.setStart(sd.startNode, sd.startOffset);\r
+                                                       r.setEnd(sd.endNode, sd.endOffset);\r
+                                                       s.removeAllRanges();\r
+                                                       s.addRange(r);\r
+                                               }\r
+\r
+                                               if (!tinymce.isOpera)\r
+                                                       t.win.focus();\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+                               }\r
+                       }\r
+               },\r
+\r
+               select : function(n, c) {\r
+                       var t = this, r = t.getRng(), s = t.getSel(), b, fn, ln, d = t.win.document;\r
+\r
+                       function first(n) {\r
+                               return n ? d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false).nextNode() : null;\r
+                       };\r
+\r
+                       function last(n) {\r
+                               var c, o, w;\r
+\r
+                               if (!n)\r
+                                       return null;\r
+\r
+                               w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);\r
+                               while (c = w.nextNode())\r
+                                       o = c;\r
+\r
+                               return o;\r
+                       };\r
+\r
+                       if (isIE) {\r
+                               try {\r
+                                       b = d.body;\r
+\r
+                                       if (/^(IMG|TABLE)$/.test(n.nodeName)) {\r
+                                               r = b.createControlRange();\r
+                                               r.addElement(n);\r
+                                       } else {\r
+                                               r = b.createTextRange();\r
+                                               r.moveToElementText(n);\r
+                                       }\r
+\r
+                                       r.select();\r
+                               } catch (ex) {\r
+                                       // Throws illigal agrument in IE some times\r
+                               }\r
+                       } else {\r
+                               if (c) {\r
+                                       fn = first(n);\r
+                                       ln = last(n);\r
+\r
+                                       if (fn && ln) {\r
+                                               //console.debug(fn, ln);\r
+                                               r = d.createRange();\r
+                                               r.setStart(fn, 0);\r
+                                               r.setEnd(ln, ln.nodeValue.length);\r
+                                       } else\r
+                                               r.selectNode(n);\r
+                               } else\r
+                                       r.selectNode(n);\r
+\r
+                               t.setRng(r);\r
+                       }\r
+\r
+                       return n;\r
+               },\r
+\r
+               isCollapsed : function() {\r
+                       var t = this, r = t.getRng(), s = t.getSel();\r
+\r
+                       if (!r || r.item)\r
+                               return false;\r
+\r
+                       return !s || r.boundingWidth == 0 || s.isCollapsed;\r
+               },\r
+\r
+               collapse : function(b) {\r
+                       var t = this, r = t.getRng(), n;\r
+\r
+                       // Control range on IE\r
+                       if (r.item) {\r
+                               n = r.item(0);\r
+                               r = this.win.document.body.createTextRange();\r
+                               r.moveToElementText(n);\r
+                       }\r
+\r
+                       r.collapse(!!b);\r
+                       t.setRng(r);\r
+               },\r
+\r
+               getSel : function() {\r
+                       var t = this, w = this.win;\r
+\r
+                       return w.getSelection ? w.getSelection() : w.document.selection;\r
+               },\r
+\r
+               getRng : function() {\r
+                       var t = this, s = t.getSel(), r;\r
+\r
+                       try {\r
+                               if (s)\r
+                                       r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : t.win.document.createRange());\r
+                       } catch (ex) {\r
+                               // IE throws unspecified error here if TinyMCE is placed in a frame/iframe\r
+                       }\r
+\r
+                       // No range found then create an empty one\r
+                       // This can occur when the editor is placed in a hidden container element on Gecko\r
+                       // Or on IE when there was an exception\r
+                       if (!r)\r
+                               r = isIE ? t.win.document.body.createTextRange() : t.win.document.createRange();\r
+\r
+                       return r;\r
+               },\r
+\r
+               setRng : function(r) {\r
+                       var s;\r
+\r
+                       if (!isIE) {\r
+                               s = this.getSel();\r
+\r
+                               if (s) {\r
+                                       s.removeAllRanges();\r
+                                       s.addRange(r);\r
+                               }\r
+                       } else {\r
+                               try {\r
+                                       r.select();\r
+                               } catch (ex) {\r
+                                       // Needed for some odd IE bug #1843306\r
+                               }\r
+                       }\r
+               },\r
+\r
+               setNode : function(n) {\r
+                       var t = this;\r
+\r
+                       t.setContent(t.dom.getOuterHTML(n));\r
+\r
+                       return n;\r
+               },\r
+\r
+               getNode : function() {\r
+                       var t = this, r = t.getRng(), s = t.getSel(), e;\r
+\r
+                       if (!isIE) {\r
+                               // Range maybe lost after the editor is made visible again\r
+                               if (!r)\r
+                                       return t.dom.getRoot();\r
+\r
+                               e = r.commonAncestorContainer;\r
+\r
+                               // Handle selection a image or other control like element such as anchors\r
+                               if (!r.collapsed) {\r
+                                       if (r.startContainer == r.endContainer || (tinymce.isWebKit && r.startContainer == r.endContainer.parentNode)) {\r
+                                               if (r.startOffset - r.endOffset < 2 || tinymce.isWebKit) {\r
+                                                       if (r.startContainer.hasChildNodes())\r
+                                                               e = r.startContainer.childNodes[r.startOffset];\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               return t.dom.getParent(e, function(n) {\r
+                                       return n.nodeType == 1;\r
+                               });\r
+                       }\r
+\r
+                       return r.item ? r.item(0) : r.parentElement();\r
+               },\r
+\r
+               destroy : function(s) {\r
+                       var t = this;\r
+\r
+                       t.win = null;\r
+\r
+                       // Manual destroy then remove unload handler\r
+                       if (!s)\r
+                               tinymce.removeUnload(t.destroy);\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/XMLWriter.js */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.dom.XMLWriter', {\r
+               node : null,\r
+\r
+               XMLWriter : function(s) {\r
+                       // Get XML document\r
+                       function getXML() {\r
+                               var i = document.implementation;\r
+\r
+                               if (!i || !i.createDocument) {\r
+                                       // Try IE objects\r
+                                       try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {}\r
+                                       try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {}\r
+                               } else\r
+                                       return i.createDocument('', '', null);\r
+                       };\r
+\r
+                       this.doc = getXML();\r
+                       \r
+                       // Since Opera and WebKit doesn't escape > into &gt; we need to do it our self to normalize the output for all browsers\r
+                       this.valid = tinymce.isOpera || tinymce.isWebKit;\r
+\r
+                       this.reset();\r
+               },\r
+\r
+               reset : function() {\r
+                       var t = this, d = t.doc;\r
+\r
+                       if (d.firstChild)\r
+                               d.removeChild(d.firstChild);\r
+\r
+                       t.node = d.appendChild(d.createElement("html"));\r
+               },\r
+\r
+               writeStartElement : function(n) {\r
+                       var t = this;\r
+\r
+                       t.node = t.node.appendChild(t.doc.createElement(n));\r
+               },\r
+\r
+               writeAttribute : function(n, v) {\r
+                       if (this.valid)\r
+                               v = v.replace(/>/g, '%MCGT%');\r
+\r
+                       this.node.setAttribute(n, v);\r
+               },\r
+\r
+               writeEndElement : function() {\r
+                       this.node = this.node.parentNode;\r
+               },\r
+\r
+               writeFullEndElement : function() {\r
+                       var t = this, n = t.node;\r
+\r
+                       n.appendChild(t.doc.createTextNode(""));\r
+                       t.node = n.parentNode;\r
+               },\r
+\r
+               writeText : function(v) {\r
+                       if (this.valid)\r
+                               v = v.replace(/>/g, '%MCGT%');\r
+\r
+                       this.node.appendChild(this.doc.createTextNode(v));\r
+               },\r
+\r
+               writeCDATA : function(v) {\r
+                       this.node.appendChild(this.doc.createCDATA(v));\r
+               },\r
+\r
+               writeComment : function(v) {\r
+                       this.node.appendChild(this.doc.createComment(v));\r
+               },\r
+\r
+               getContent : function() {\r
+                       var h;\r
+\r
+                       h = this.doc.xml || new XMLSerializer().serializeToString(this.doc);\r
+                       h = h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g, '');\r
+                       h = h.replace(/ ?\/>/g, ' />');\r
+\r
+                       if (this.valid)\r
+                               h = h.replace(/\%MCGT%/g, '&gt;');\r
+\r
+                       return h;\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/StringWriter.js */\r
+\r
+(function() {\r
+       tinymce.create('tinymce.dom.StringWriter', {\r
+               str : null,\r
+               tags : null,\r
+               count : 0,\r
+               settings : null,\r
+               indent : null,\r
+\r
+               StringWriter : function(s) {\r
+                       this.settings = tinymce.extend({\r
+                               indent_char : ' ',\r
+                               indentation : 1\r
+                       }, s);\r
+\r
+                       this.reset();\r
+               },\r
+\r
+               reset : function() {\r
+                       this.indent = '';\r
+                       this.str = "";\r
+                       this.tags = [];\r
+                       this.count = 0;\r
+               },\r
+\r
+               writeStartElement : function(n) {\r
+                       this._writeAttributesEnd();\r
+                       this.writeRaw('<' + n);\r
+                       this.tags.push(n);\r
+                       this.inAttr = true;\r
+                       this.count++;\r
+                       this.elementCount = this.count;\r
+               },\r
+\r
+               writeAttribute : function(n, v) {\r
+                       var t = this;\r
+\r
+                       t.writeRaw(" " + t.encode(n) + '="' + t.encode(v) + '"');\r
+               },\r
+\r
+               writeEndElement : function() {\r
+                       var n;\r
+\r
+                       if (this.tags.length > 0) {\r
+                               n = this.tags.pop();\r
+\r
+                               if (this._writeAttributesEnd(1))\r
+                                       this.writeRaw('</' + n + '>');\r
+\r
+                               if (this.settings.indentation > 0)\r
+                                       this.writeRaw('\n');\r
+                       }\r
+               },\r
+\r
+               writeFullEndElement : function() {\r
+                       if (this.tags.length > 0) {\r
+                               this._writeAttributesEnd();\r
+                               this.writeRaw('</' + this.tags.pop() + '>');\r
+\r
+                               if (this.settings.indentation > 0)\r
+                                       this.writeRaw('\n');\r
+                       }\r
+               },\r
+\r
+               writeText : function(v) {\r
+                       this._writeAttributesEnd();\r
+                       this.writeRaw(this.encode(v));\r
+                       this.count++;\r
+               },\r
+\r
+               writeCDATA : function(v) {\r
+                       this._writeAttributesEnd();\r
+                       this.writeRaw('<![CDATA[' + v + ']]>');\r
+                       this.count++;\r
+               },\r
+\r
+               writeComment : function(v) {\r
+                       this._writeAttributesEnd();\r
+                       this.writeRaw('<!-- ' + v + '-->');\r
+                       this.count++;\r
+               },\r
+\r
+               writeRaw : function(v) {\r
+                       this.str += v;\r
+               },\r
+\r
+               encode : function(s) {\r
+                       return s.replace(/[<>&"]/g, function(v) {\r
+                               switch (v) {\r
+                                       case '<':\r
+                                               return '&lt;';\r
+\r
+                                       case '>':\r
+                                               return '&gt;';\r
+\r
+                                       case '&':\r
+                                               return '&amp;';\r
+\r
+                                       case '"':\r
+                                               return '&quot;';\r
+                               }\r
+\r
+                               return v;\r
+                       });\r
+               },\r
+\r
+               getContent : function() {\r
+                       return this.str;\r
+               },\r
+\r
+               _writeAttributesEnd : function(s) {\r
+                       if (!this.inAttr)\r
+                               return;\r
+\r
+                       this.inAttr = false;\r
+\r
+                       if (s && this.elementCount == this.count) {\r
+                               this.writeRaw(' />');\r
+                               return false;\r
+                       }\r
+\r
+                       this.writeRaw('>');\r
+\r
+                       return true;\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/Serializer.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko;\r
+\r
+       // Returns only attribites that have values not all attributes in IE\r
+       function getIEAtts(n) {\r
+               var o = [];\r
+\r
+               // Object will throw exception in IE\r
+               if (n.nodeName == 'OBJECT')\r
+                       return n.attributes;\r
+\r
+               n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi, function(a, b) {\r
+                       o.push({specified : 1, nodeName : b});\r
+               });\r
+\r
+               return o;\r
+       };\r
+\r
+       function wildcardToRE(s) {\r
+               return s.replace(/([?+*])/g, '.$1');\r
+       };\r
+\r
+       tinymce.create('tinymce.dom.Serializer', {\r
+               Serializer : function(s) {\r
+                       var t = this;\r
+\r
+                       t.key = 0;\r
+                       t.onPreProcess = new Dispatcher(t);\r
+                       t.onPostProcess = new Dispatcher(t);\r
+\r
+                       if (tinymce.relaxedDomain && tinymce.isGecko) {\r
+                               // Gecko has a bug where we can't create a new XML document if domain relaxing is used\r
+                               t.writer = new tinymce.dom.StringWriter();\r
+                       } else {\r
+                               try {\r
+                                       t.writer = new tinymce.dom.XMLWriter();\r
+                               } catch (ex) {\r
+                                       // IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter\r
+                                       t.writer = new tinymce.dom.StringWriter();\r
+                               }\r
+                       }\r
+\r
+                       // Default settings\r
+                       t.settings = s = extend({\r
+                               dom : tinymce.DOM,\r
+                               valid_nodes : 0,\r
+                               node_filter : 0,\r
+                               attr_filter : 0,\r
+                               invalid_attrs : /^(mce_|_moz_)/,\r
+                               closed : /(br|hr|input|meta|img|link|param)/,\r
+                               entity_encoding : 'named',\r
+                               entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro',\r
+                               valid_elements : '*[*]',\r
+                               extended_valid_elements : 0,\r
+                               valid_child_elements : 0,\r
+                               invalid_elements : 0,\r
+                               fix_table_elements : 0,\r
+                               fix_list_elements : true,\r
+                               fix_content_duplication : true,\r
+                               convert_fonts_to_spans : false,\r
+                               font_size_classes : 0,\r
+                               font_size_style_values : 0,\r
+                               apply_source_formatting : 0,\r
+                               indent_mode : 'simple',\r
+                               indent_char : '\t',\r
+                               indent_levels : 1,\r
+                               remove_linebreaks : 1\r
+                       }, s);\r
+\r
+                       t.dom = s.dom;\r
+\r
+                       if (s.fix_list_elements) {\r
+                               t.onPreProcess.add(function(se, o) {\r
+                                       var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np;\r
+\r
+                                       function prevNode(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
+                                       for (x=0; x<a.length; x++) {\r
+                                               nl = t.dom.select(a[x], o.node);\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 = prevNode(n, 'LI');\r
+\r
+                                                               if (!np) {\r
+                                                                       np = t.dom.create('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
+\r
+                       if (s.fix_table_elements) {\r
+                               t.onPreProcess.add(function(se, o) {\r
+                                       each(t.dom.select('table', o.node), function(e) {\r
+                                               var pa = t.dom.getParent(e, 'H1,H2,H3,H4,H5,H6,P'), pa2, n, tm, pl = [], i, ns;\r
+\r
+                                               if (pa) {\r
+                                                       pa2 = pa.cloneNode(false);\r
+\r
+                                                       pl.push(e);\r
+                                                       for (n = e; n = n.parentNode;) {\r
+                                                               pl.push(n);\r
+\r
+                                                               if (n == pa)\r
+                                                                       break;\r
+                                                       }\r
+\r
+                                                       tm = pa2;\r
+                                                       for (i = pl.length - 1; i >= 0; i--) {\r
+                                                               if (i == pl.length - 1) {\r
+                                                                       while (ns = pl[i - 1].nextSibling)\r
+                                                                               tm.appendChild(ns.parentNode.removeChild(ns));\r
+                                                               } else {\r
+                                                                       n = pl[i].cloneNode(false);\r
+\r
+                                                                       if (i != 0) {\r
+                                                                               while (ns = pl[i - 1].nextSibling)\r
+                                                                                       n.appendChild(ns.parentNode.removeChild(ns));\r
+                                                                       }\r
+\r
+                                                                       tm = tm.appendChild(n);\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       e = t.dom.insertAfter(e.parentNode.removeChild(e), pa);\r
+                                                       t.dom.insertAfter(e, pa);\r
+                                                       t.dom.insertAfter(pa2, e);\r
+                                               }\r
+                                       });\r
+                               });\r
+                       }\r
+               },\r
+\r
+               setEntities : function(s) {\r
+                       var t = this, a, i, l = {}, re = '', v;\r
+\r
+                       // No need to setup more than once\r
+                       if (t.entityLookup)\r
+                               return;\r
+\r
+                       // Build regex and lookup array\r
+                       a = s.split(',');\r
+                       for (i = 0; i < a.length; i += 2) {\r
+                               v = a[i];\r
+\r
+                               // Don't add default &amp; &quot; etc.\r
+                               if (v == 34 || v == 38 || v == 60 || v == 62)\r
+                                       continue;\r
+\r
+                               l[String.fromCharCode(a[i])] = a[i + 1];\r
+\r
+                               v = parseInt(a[i]).toString(16);\r
+                               re += '\\u' + '0000'.substring(v.length) + v;\r
+                       }\r
+\r
+                       if (!re) {\r
+                               t.settings.entity_encoding = 'raw';\r
+                               return;\r
+                       }\r
+\r
+                       t.entitiesRE = new RegExp('[' + re + ']', 'g');\r
+                       t.entityLookup = l;\r
+               },\r
+\r
+               setValidChildRules : function(s) {\r
+                       this.childRules = null;\r
+                       this.addValidChildRules(s);\r
+               },\r
+\r
+               addValidChildRules : function(s) {\r
+                       var t = this, inst, intr, bloc;\r
+\r
+                       if (!s)\r
+                               return;\r
+\r
+                       inst = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';\r
+                       intr = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';\r
+                       bloc = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';\r
+\r
+                       each(s.split(','), function(s) {\r
+                               var p = s.split(/\[|\]/), re;\r
+\r
+                               s = '';\r
+                               each(p[1].split('|'), function(v) {\r
+                                       if (s)\r
+                                               s += '|';\r
+\r
+                                       switch (v) {\r
+                                               case '%itrans':\r
+                                                       v = intr;\r
+                                                       break;\r
+\r
+                                               case '%itrans_na':\r
+                                                       v = intr.substring(2);\r
+                                                       break;\r
+\r
+                                               case '%istrict':\r
+                                                       v = inst;\r
+                                                       break;\r
+\r
+                                               case '%istrict_na':\r
+                                                       v = inst.substring(2);\r
+                                                       break;\r
+\r
+                                               case '%btrans':\r
+                                                       v = bloc;\r
+                                                       break;\r
+\r
+                                               case '%bstrict':\r
+                                                       v = bloc;\r
+                                                       break;\r
+                                       }\r
+\r
+                                       s += v;\r
+                               });\r
+                               re = new RegExp('^(' + s.toLowerCase() + ')$', 'i');\r
+\r
+                               each(p[0].split('/'), function(s) {\r
+                                       t.childRules = t.childRules || {};\r
+                                       t.childRules[s] = re;\r
+                               });\r
+                       });\r
+\r
+                       // Build regex\r
+                       s = '';\r
+                       each(t.childRules, function(v, k) {\r
+                               if (s)\r
+                                       s += '|';\r
+\r
+                               s += k;\r
+                       });\r
+\r
+                       t.parentElementsRE = new RegExp('^(' + s.toLowerCase() + ')$', 'i');\r
+\r
+                       /*console.debug(t.parentElementsRE.toString());\r
+                       each(t.childRules, function(v) {\r
+                               console.debug(v.toString());\r
+                       });*/\r
+               },\r
+\r
+               setRules : function(s) {\r
+                       var t = this;\r
+\r
+                       t._setup();\r
+                       t.rules = {};\r
+                       t.wildRules = [];\r
+                       t.validElements = {};\r
+\r
+                       return t.addRules(s);\r
+               },\r
+\r
+               addRules : function(s) {\r
+                       var t = this, dr;\r
+\r
+                       if (!s)\r
+                               return;\r
+\r
+                       t._setup();\r
+\r
+                       each(s.split(','), function(s) {\r
+                               var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = [];\r
+\r
+                               // Extend with default rules\r
+                               if (dr)\r
+                                       at = tinymce.extend([], dr.attribs);\r
+\r
+                               // Parse attributes\r
+                               if (p.length > 1) {\r
+                                       each(p[1].split('|'), function(s) {\r
+                                               var ar = {}, i;\r
+\r
+                                               at = at || [];\r
+\r
+                                               // Parse attribute rule\r
+                                               s = s.replace(/::/g, '~');\r
+                                               s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s);\r
+                                               s[2] = s[2].replace(/~/g, ':');\r
+\r
+                                               // Add required attributes\r
+                                               if (s[1] == '!') {\r
+                                                       ra = ra || [];\r
+                                                       ra.push(s[2]);\r
+                                               }\r
+\r
+                                               // Remove inherited attributes\r
+                                               if (s[1] == '-') {\r
+                                                       for (i = 0; i <at.length; i++) {\r
+                                                               if (at[i].name == s[2]) {\r
+                                                                       at.splice(i, 1);\r
+                                                                       return;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               switch (s[3]) {\r
+                                                       // Add default attrib values\r
+                                                       case '=':\r
+                                                               ar.defaultVal = s[4] || '';\r
+                                                               break;\r
+\r
+                                                       // Add forced attrib values\r
+                                                       case ':':\r
+                                                               ar.forcedVal = s[4];\r
+                                                               break;\r
+\r
+                                                       // Add validation values\r
+                                                       case '<':\r
+                                                               ar.validVals = s[4].split('?');\r
+                                                               break;\r
+                                               }\r
+\r
+                                               if (/[*.?]/.test(s[2])) {\r
+                                                       wat = wat || [];\r
+                                                       ar.nameRE = new RegExp('^' + wildcardToRE(s[2]) + '$');\r
+                                                       wat.push(ar);\r
+                                               } else {\r
+                                                       ar.name = s[2];\r
+                                                       at.push(ar);\r
+                                               }\r
+\r
+                                               va.push(s[2]);\r
+                                       });\r
+                               }\r
+\r
+                               // Handle element names\r
+                               each(tn, function(s, i) {\r
+                                       var pr = s.charAt(0), x = 1, ru = {};\r
+\r
+                                       // Extend with default rule data\r
+                                       if (dr) {\r
+                                               if (dr.noEmpty)\r
+                                                       ru.noEmpty = dr.noEmpty;\r
+\r
+                                               if (dr.fullEnd)\r
+                                                       ru.fullEnd = dr.fullEnd;\r
+\r
+                                               if (dr.padd)\r
+                                                       ru.padd = dr.padd;\r
+                                       }\r
+\r
+                                       // Handle prefixes\r
+                                       switch (pr) {\r
+                                               case '-':\r
+                                                       ru.noEmpty = true;\r
+                                                       break;\r
+\r
+                                               case '+':\r
+                                                       ru.fullEnd = true;\r
+                                                       break;\r
+\r
+                                               case '#':\r
+                                                       ru.padd = true;\r
+                                                       break;\r
+\r
+                                               default:\r
+                                                       x = 0;\r
+                                       }\r
+\r
+                                       tn[i] = s = s.substring(x);\r
+                                       t.validElements[s] = 1;\r
+\r
+                                       // Add element name or element regex\r
+                                       if (/[*.?]/.test(tn[0])) {\r
+                                               ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$');\r
+                                               t.wildRules = t.wildRules || {};\r
+                                               t.wildRules.push(ru);\r
+                                       } else {\r
+                                               ru.name = tn[0];\r
+\r
+                                               // Store away default rule\r
+                                               if (tn[0] == '@')\r
+                                                       dr = ru;\r
+\r
+                                               t.rules[s] = ru;\r
+                                       }\r
+\r
+                                       ru.attribs = at;\r
+\r
+                                       if (ra)\r
+                                               ru.requiredAttribs = ra;\r
+\r
+                                       if (wat) {\r
+                                               // Build valid attributes regexp\r
+                                               s = '';\r
+                                               each(va, function(v) {\r
+                                                       if (s)\r
+                                                               s += '|';\r
+\r
+                                                       s += '(' + wildcardToRE(v) + ')';\r
+                                               });\r
+                                               ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$');\r
+                                               ru.wildAttribs = wat;\r
+                                       }\r
+                               });\r
+                       });\r
+\r
+                       // Build valid elements regexp\r
+                       s = '';\r
+                       each(t.validElements, function(v, k) {\r
+                               if (s)\r
+                                       s += '|';\r
+\r
+                               if (k != '@')\r
+                                       s += k;\r
+                       });\r
+                       t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$');\r
+\r
+                       //console.debug(t.validElementsRE.toString());\r
+                       //console.dir(t.rules);\r
+                       //console.dir(t.wildRules);\r
+               },\r
+\r
+               findRule : function(n) {\r
+                       var t = this, rl = t.rules, i, r;\r
+\r
+                       t._setup();\r
+\r
+                       // Exact match\r
+                       r = rl[n];\r
+                       if (r)\r
+                               return r;\r
+\r
+                       // Try wildcards\r
+                       rl = t.wildRules;\r
+                       for (i = 0; i < rl.length; i++) {\r
+                               if (rl[i].nameRE.test(n))\r
+                                       return rl[i];\r
+                       }\r
+\r
+                       return null;\r
+               },\r
+\r
+               findAttribRule : function(ru, n) {\r
+                       var i, wa = ru.wildAttribs;\r
+\r
+                       for (i = 0; i < wa.length; i++) {\r
+                               if (wa[i].nameRE.test(n))\r
+                                       return wa[i];\r
+                       }\r
+\r
+                       return null;\r
+               },\r
+\r
+               serialize : function(n, o) {\r
+                       var h, t = this;\r
+\r
+                       t._setup();\r
+                       o = o || {};\r
+                       o.format = o.format || 'html';\r
+                       t.processObj = o;\r
+                       n = n.cloneNode(true);\r
+                       t.key = '' + (parseInt(t.key) + 1);\r
+\r
+                       // Pre process\r
+                       if (!o.no_events) {\r
+                               o.node = n;\r
+                               t.onPreProcess.dispatch(t, o);\r
+                       }\r
+\r
+                       // Serialize HTML DOM into a string\r
+                       t.writer.reset();\r
+                       t._serializeNode(n, o.getInner);\r
+\r
+                       // Post process\r
+                       o.content = t.writer.getContent();\r
+\r
+                       if (!o.no_events)\r
+                               t.onPostProcess.dispatch(t, o);\r
+\r
+                       t._postProcess(o);\r
+                       o.node = null;\r
+\r
+                       return tinymce.trim(o.content);\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _postProcess : function(o) {\r
+                       var t = this, s = t.settings, h = o.content, sc = [], p, l;\r
+\r
+                       if (o.format == 'html') {\r
+                               // Protect some elements\r
+                               p = t._protect({\r
+                                       content : h,\r
+                                       patterns : [\r
+                                               /(<script[^>]*>)(.*?)(<\/script>)/g,\r
+                                               /(<style[^>]*>)(.*?)(<\/style>)/g,\r
+                                               /(<pre[^>]*>)(.*?)(<\/pre>)/g\r
+                                       ]\r
+                               });\r
+\r
+                               h = p.content;\r
+\r
+                               // Entity encode\r
+                               if (s.entity_encoding !== 'raw') {\r
+                                       if (s.entity_encoding.indexOf('named') != -1) {\r
+                                               t.setEntities(s.entities);\r
+                                               l = t.entityLookup;\r
+\r
+                                               h = h.replace(t.entitiesRE, function(a) {\r
+                                                       var v;\r
+\r
+                                                       if (v = l[a])\r
+                                                               a = '&' + v + ';';\r
+\r
+                                                       return a;\r
+                                               });\r
+                                       }\r
+\r
+                                       if (s.entity_encoding.indexOf('numeric') != -1) {\r
+                                               h = h.replace(/[\u007E-\uFFFF]/g, function(a) {\r
+                                                       return '&#' + a.charCodeAt(0) + ';';\r
+                                               });\r
+                                       }\r
+                               }\r
+\r
+                               // Use BR instead of &nbsp; padded P elements inside editor and use <p>&nbsp;</p> outside editor\r
+/*                             if (o.set)\r
+                                       h = h.replace(/<p>\s+(&nbsp;|&#160;|\u00a0|<br \/>)\s+<\/p>/g, '<p><br /></p>');\r
+                               else\r
+                                       h = h.replace(/<p>\s+(&nbsp;|&#160;|\u00a0|<br \/>)\s+<\/p>/g, '<p>$1</p>');*/\r
+\r
+                               // Since Gecko and Safari keeps whitespace in the DOM we need to\r
+                               // remove it inorder to match other browsers. But I think Gecko and Safari is right.\r
+                               // This process is only done when getting contents out from the editor.\r
+                               if (!o.set) {\r
+                                       // We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char\r
+                                       h = h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? '<p$1>&#160;</p>' : '<p$1>&nbsp;</p>');\r
+\r
+                                       if (s.remove_linebreaks) {\r
+                                               h = h.replace(/\r?\n|\r/g, ' ');\r
+                                               h = h.replace(/(<[^>]+>)\s+/g, '$1 ');\r
+                                               h = h.replace(/\s+(<\/[^>]+>)/g, ' $1');\r
+                                               h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>'); // Trim block start\r
+                                               h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>'); // Trim block start\r
+                                               h = h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '</$1>'); // Trim block end\r
+                                       }\r
+\r
+                                       // Simple indentation\r
+                                       if (s.apply_source_formatting && s.indent_mode == 'simple') {\r
+                                               // Add line breaks before and after block elements\r
+                                               h = h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n');\r
+                                               h = h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>');\r
+                                               h = h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '</$1>\n');\r
+                                               h = h.replace(/\n\n/g, '\n');\r
+                                       }\r
+                               }\r
+\r
+                               h = t._unprotect(h, p);\r
+\r
+                               // Restore the \u00a0 character if raw mode is enabled\r
+                               if (s.entity_encoding == 'raw')\r
+                                       h = h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g, '<p$1>\u00a0</p>');\r
+                       }\r
+\r
+                       o.content = h;\r
+               },\r
+\r
+               _serializeNode : function(n, inn) {\r
+                       var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv;\r
+\r
+                       if (!s.node_filter || s.node_filter(n)) {\r
+                               switch (n.nodeType) {\r
+                                       case 1: // Element\r
+                                               if (n.hasAttribute ? n.hasAttribute('mce_bogus') : n.getAttribute('mce_bogus'))\r
+                                                       return;\r
+\r
+                                               iv = false;\r
+                                               hc = n.hasChildNodes();\r
+                                               nn = n.getAttribute('mce_name') || n.nodeName.toLowerCase();\r
+\r
+                                               // Add correct prefix on IE\r
+                                               if (isIE) {\r
+                                                       if (n.scopeName !== 'HTML' && n.scopeName !== 'html')\r
+                                                               nn = n.scopeName + ':' + nn;\r
+                                               }\r
+\r
+                                               // Remove mce prefix on IE needed for the abbr element\r
+                                               if (nn.indexOf('mce:') === 0)\r
+                                                       nn = nn.substring(4);\r
+\r
+                                               // Check if valid\r
+                                               if (!t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inn) {\r
+                                                       iv = true;\r
+                                                       break;\r
+                                               }\r
+\r
+                                               if (isIE) {\r
+                                                       // Fix IE content duplication (DOM can have multiple copies of the same node)\r
+                                                       if (s.fix_content_duplication) {\r
+                                                               if (n.mce_serialized == t.key)\r
+                                                                       return;\r
+\r
+                                                               n.mce_serialized = t.key;\r
+                                                       }\r
+\r
+                                                       // IE sometimes adds a / infront of the node name\r
+                                                       if (nn.charAt(0) == '/')\r
+                                                               nn = nn.substring(1);\r
+                                               } else if (isGecko) {\r
+                                                       // Ignore br elements\r
+                                                       if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz')\r
+                                                               return;\r
+                                               }\r
+\r
+                                               // Check if valid child\r
+                                               if (t.childRules) {\r
+                                                       if (t.parentElementsRE.test(t.elementName)) {\r
+                                                               if (!t.childRules[t.elementName].test(nn)) {\r
+                                                                       iv = true;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       t.elementName = nn;\r
+                                               }\r
+\r
+                                               ru = t.findRule(nn);\r
+                                               nn = ru.name || nn;\r
+\r
+                                               // Skip empty nodes or empty node name in IE\r
+                                               if ((!hc && ru.noEmpty) || (isIE && !nn)) {\r
+                                                       iv = true;\r
+                                                       break;\r
+                                               }\r
+\r
+                                               // Check required\r
+                                               if (ru.requiredAttribs) {\r
+                                                       a = ru.requiredAttribs;\r
+\r
+                                                       for (i = a.length - 1; i >= 0; i--) {\r
+                                                               if (this.dom.getAttrib(n, a[i]) !== '')\r
+                                                                       break;\r
+                                                       }\r
+\r
+                                                       // None of the required was there\r
+                                                       if (i == -1) {\r
+                                                               iv = true;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+\r
+                                               w.writeStartElement(nn);\r
+\r
+                                               // Add ordered attributes\r
+                                               if (ru.attribs) {\r
+                                                       for (i=0, at = ru.attribs, l = at.length; i<l; i++) {\r
+                                                               a = at[i];\r
+                                                               v = t._getAttrib(n, a);\r
+\r
+                                                               if (v !== null)\r
+                                                                       w.writeAttribute(a.name, v);\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Add wild attributes\r
+                                               if (ru.validAttribsRE) {\r
+                                                       at = isIE ? getIEAtts(n) : n.attributes;\r
+                                                       for (i=at.length-1; i>-1; i--) {\r
+                                                               no = at[i];\r
+\r
+                                                               if (no.specified) {\r
+                                                                       a = no.nodeName.toLowerCase();\r
+\r
+                                                                       if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a))\r
+                                                                               continue;\r
+\r
+                                                                       ar = t.findAttribRule(ru, a);\r
+                                                                       v = t._getAttrib(n, ar, a);\r
+\r
+                                                                       if (v !== null)\r
+                                                                               w.writeAttribute(a, v);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Padd empty nodes with a &nbsp;\r
+                                               if (!hc && ru.padd)\r
+                                                       w.writeText('\u00a0');\r
+\r
+                                               break;\r
+\r
+                                       case 3: // Text\r
+                                               // Check if valid child\r
+                                               if (t.childRules && t.parentElementsRE.test(t.elementName)) {\r
+                                                       if (!t.childRules[t.elementName].test(n.nodeName))\r
+                                                               return;\r
+                                               }\r
+\r
+                                               return w.writeText(n.nodeValue);\r
+\r
+                                       case 4: // CDATA\r
+                                               return w.writeCDATA(n.nodeValue);\r
+\r
+                                       case 8: // Comment\r
+                                               return w.writeComment(n.nodeValue);\r
+                               }\r
+                       } else if (n.nodeType == 1)\r
+                               hc = n.hasChildNodes();\r
+\r
+                       if (hc) {\r
+                               cn = n.firstChild;\r
+\r
+                               while (cn) {\r
+                                       t._serializeNode(cn);\r
+                                       t.elementName = nn;\r
+                                       cn = cn.nextSibling;\r
+                               }\r
+                       }\r
+\r
+                       // Write element end\r
+                       if (!iv) {\r
+                               if (hc || !s.closed.test(nn))\r
+                                       w.writeFullEndElement();\r
+                               else\r
+                                       w.writeEndElement();\r
+                       }\r
+               },\r
+\r
+               _protect : function(o) {\r
+                       o.items = o.items || [];\r
+\r
+                       function enc(s) {\r
+                               return s.replace(/[\r\n\\]/g, function(c) {\r
+                                       if (c === '\n')\r
+                                               return '\\n';\r
+                                       else if (c === '\\')\r
+                                               return '\\\\';\r
+\r
+                                       return '\\r';\r
+                               });\r
+                       };\r
+\r
+                       function dec(s) {\r
+                               return s.replace(/\\[\\rn]/g, function(c) {\r
+                                       if (c === '\\n')\r
+                                               return '\n';\r
+                                       else if (c === '\\\\')\r
+                                               return '\\';\r
+\r
+                                       return '\r';\r
+                               });\r
+                       };\r
+\r
+                       each(o.patterns, function(p) {\r
+                               o.content = dec(enc(o.content).replace(p, function(x, a, b, c) {\r
+                                       o.items.push(dec(b));\r
+                                       return a + '<!--mce:' + (o.items.length - 1) + '-->' + c;\r
+                               }));\r
+                       });\r
+\r
+                       return o;\r
+               },\r
+\r
+               _unprotect : function(h, o) {\r
+                       h = h.replace(/\<!--mce:([0-9]+)--\>/g, function(a, b) {\r
+                               return o.items[parseInt(b)];\r
+                       });\r
+\r
+                       o.items = [];\r
+\r
+                       return h;\r
+               },\r
+\r
+               _setup : function() {\r
+                       var t = this, s = this.settings;\r
+\r
+                       if (t.done)\r
+                               return;\r
+\r
+                       t.done = 1;\r
+\r
+                       t.setRules(s.valid_elements);\r
+                       t.addRules(s.extended_valid_elements);\r
+                       t.addValidChildRules(s.valid_child_elements);\r
+\r
+                       if (s.invalid_elements)\r
+                               t.invalidElementsRE = new RegExp('^(' + wildcardToRE(s.invalid_elements.replace(',', '|').toLowerCase()) + ')$');\r
+\r
+                       if (s.attrib_value_filter)\r
+                               t.attribValueFilter = s.attribValueFilter;\r
+               },\r
+\r
+               _getAttrib : function(n, a, na) {\r
+                       var i, v;\r
+\r
+                       na = na || a.name;\r
+\r
+                       if (a.forcedVal && (v = a.forcedVal)) {\r
+                               if (v === '{$uid}')\r
+                                       return this.dom.uniqueId();\r
+\r
+                               return v;\r
+                       }\r
+\r
+                       v = this.dom.getAttrib(n, na);\r
+\r
+                       switch (na) {\r
+                               case 'rowspan':\r
+                               case 'colspan':\r
+                                       // Whats the point? Remove usless attribute value\r
+                                       if (v == '1')\r
+                                               v = '';\r
+\r
+                                       break;\r
+                       }\r
+\r
+                       if (this.attribValueFilter)\r
+                               v = this.attribValueFilter(na, v, n);\r
+\r
+                       if (a.validVals) {\r
+                               for (i = a.validVals.length - 1; i >= 0; i--) {\r
+                                       if (v == a.validVals[i])\r
+                                               break;\r
+                               }\r
+\r
+                               if (i == -1)\r
+                                       return null;\r
+                       }\r
+\r
+                       if (v === '' && typeof(a.defaultVal) != 'undefined') {\r
+                               v = a.defaultVal;\r
+\r
+                               if (v === '{$uid}')\r
+                                       return this.dom.uniqueId();\r
+\r
+                               return v;\r
+                       } else {\r
+                               // Remove internal mceItemXX classes when content is extracted from editor\r
+                               if (na == 'class' && this.processObj.get)\r
+                                       v = v.replace(/\s?mceItem\w+\s?/g, '');\r
+                       }\r
+\r
+                       if (v === '')\r
+                               return null;\r
+\r
+\r
+                       return v;\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/dom/ScriptLoader.js */\r
+\r
+(function() {\r
+       var each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.dom.ScriptLoader', {\r
+               ScriptLoader : function(s) {\r
+                       this.settings = s || {};\r
+                       this.queue = [];\r
+                       this.lookup = {};\r
+               },\r
+\r
+               isDone : function(u) {\r
+                       return this.lookup[u] ? this.lookup[u].state == 2 : 0;\r
+               },\r
+\r
+               markDone : function(u) {\r
+                       this.lookup[u] = {state : 2, url : u};\r
+               },\r
+\r
+               add : function(u, cb, s, pr) {\r
+                       var t = this, lo = t.lookup, o;\r
+\r
+                       if (o = lo[u]) {\r
+                               // Is loaded fire callback\r
+                               if (cb && o.state == 2)\r
+                                       cb.call(s || this);\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       o = {state : 0, url : u, func : cb, scope : s || this};\r
+\r
+                       if (pr)\r
+                               t.queue.unshift(o);\r
+                       else\r
+                               t.queue.push(o);\r
+\r
+                       lo[u] = o;\r
+\r
+                       return o;\r
+               },\r
+\r
+               load : function(u, cb, s) {\r
+                       var t = this, o;\r
+\r
+                       if (o = t.lookup[u]) {\r
+                               // Is loaded fire callback\r
+                               if (cb && o.state == 2)\r
+                                       cb.call(s || t);\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       function loadScript(u) {\r
+                               if (tinymce.dom.Event.domLoaded || t.settings.strict_mode) {\r
+                                       tinymce.util.XHR.send({\r
+                                               url : u,\r
+                                               error : t.settings.error,\r
+                                               async : false,\r
+                                               success : function(co) {\r
+                                                       t.eval(co);\r
+                                               }\r
+                                       });\r
+                               } else\r
+                                       document.write('<script type="text/javascript" src="' + u + '"></script>');\r
+                       };\r
+\r
+                       if (!tinymce.is(u, 'string')) {\r
+                               each(u, function(u) {\r
+                                       loadScript(u);\r
+                               });\r
+\r
+                               if (cb)\r
+                                       cb.call(s || t);\r
+                       } else {\r
+                               loadScript(u);\r
+\r
+                               if (cb)\r
+                                       cb.call(s || t);\r
+                       }\r
+               },\r
+\r
+               loadQueue : function(cb, s) {\r
+                       var t = this;\r
+\r
+                       if (!t.queueLoading) {\r
+                               t.queueLoading = 1;\r
+                               t.queueCallbacks = [];\r
+\r
+                               t.loadScripts(t.queue, function() {\r
+                                       t.queueLoading = 0;\r
+\r
+                                       if (cb)\r
+                                               cb.call(s || t);\r
+\r
+                                       each(t.queueCallbacks, function(o) {\r
+                                               o.func.call(o.scope);\r
+                                       });\r
+                               });\r
+                       } else if (cb)\r
+                               t.queueCallbacks.push({func : cb, scope : s || t});\r
+               },\r
+\r
+               eval : function(co) {\r
+                       var w = window;\r
+\r
+                       // Evaluate script\r
+                       if (!w.execScript) {\r
+                               try {\r
+                                       eval.call(w, co);\r
+                               } catch (ex) {\r
+                                       eval(co, w); // Firefox 3.0a8\r
+                               }\r
+                       } else\r
+                               w.execScript(co); // IE\r
+               },\r
+\r
+               loadScripts : function(sc, cb, s) {\r
+                       var t = this, lo = t.lookup;\r
+\r
+                       function done(o) {\r
+                               o.state = 2; // Has been loaded\r
+\r
+                               // Run callback\r
+                               if (o.func)\r
+                                       o.func.call(o.scope || t);\r
+                       };\r
+\r
+                       function allDone() {\r
+                               var l;\r
+\r
+                               // Check if all files are loaded\r
+                               l = sc.length;\r
+                               each(sc, function(o) {\r
+                                       o = lo[o.url];\r
+\r
+                                       if (o.state === 2) {// It has finished loading\r
+                                               done(o);\r
+                                               l--;\r
+                                       } else\r
+                                               load(o);\r
+                               });\r
+\r
+                               // They are all loaded\r
+                               if (l === 0 && cb) {\r
+                                       cb.call(s || t);\r
+                                       cb = 0;\r
+                               }\r
+                       };\r
+\r
+                       function load(o) {\r
+                               if (o.state > 0)\r
+                                       return;\r
+\r
+                               o.state = 1; // Is loading\r
+\r
+                               tinymce.util.XHR.send({\r
+                                       url : o.url,\r
+                                       error : t.settings.error,\r
+                                       success : function(co) {\r
+                                               t.eval(co);\r
+                                               done(o);\r
+                                               allDone();\r
+                                       }\r
+                               });\r
+                       };\r
+\r
+                       each(sc, function(o) {\r
+                               var u = o.url;\r
+\r
+                               // Add to queue if needed\r
+                               if (!lo[u]) {\r
+                                       lo[u] = o;\r
+                                       t.queue.push(o);\r
+                               } else\r
+                                       o = lo[u];\r
+\r
+                               // Is already loading or has been loaded\r
+                               if (o.state > 0)\r
+                                       return;\r
+\r
+                               if (!tinymce.dom.Event.domLoaded && !t.settings.strict_mode) {\r
+                                       var ix, ol = '';\r
+\r
+                                       // Add onload events\r
+                                       if (cb || o.func) {\r
+                                               o.state = 1; // Is loading\r
+\r
+                                               ix = tinymce.dom.ScriptLoader._addOnLoad(function() {\r
+                                                       done(o);\r
+                                                       allDone();\r
+                                               });\r
+\r
+                                               if (tinymce.isIE)\r
+                                                       ol = ' onreadystatechange="';\r
+                                               else\r
+                                                       ol = ' onload="';\r
+\r
+                                               ol += 'tinymce.dom.ScriptLoader._onLoad(this,\'' + u + '\',' + ix + ');"';\r
+                                       }\r
+\r
+                                       document.write('<script type="text/javascript" src="' + u + '"' + ol + '></script>');\r
+\r
+                                       if (!o.func)\r
+                                               done(o);\r
+                               } else\r
+                                       load(o);\r
+                       });\r
+\r
+                       allDone();\r
+               },\r
+\r
+               // Static methods\r
+               'static' : {\r
+                       _addOnLoad : function(f) {\r
+                               var t = this;\r
+\r
+                               t._funcs = t._funcs || [];\r
+                               t._funcs.push(f);\r
+\r
+                               return t._funcs.length - 1;\r
+                       },\r
+\r
+                       _onLoad : function(e, u, ix) {\r
+                               if (!tinymce.isIE || e.readyState == 'complete')\r
+                                       this._funcs[ix].call(this);\r
+                       }\r
+               }\r
+\r
+               });\r
+\r
+       // Global script loader\r
+       tinymce.ScriptLoader = new tinymce.dom.ScriptLoader();\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/Control.js */\r
+\r
+(function() {\r
+       // Shorten class names\r
+       var DOM = tinymce.DOM, is = tinymce.is;\r
+\r
+       tinymce.create('tinymce.ui.Control', {\r
+               Control : function(id, s) {\r
+                       this.id = id;\r
+                       this.settings = s = s || {};\r
+                       this.rendered = false;\r
+                       this.onRender = new tinymce.util.Dispatcher(this);\r
+                       this.classPrefix = '';\r
+                       this.scope = s.scope || this;\r
+                       this.disabled = 0;\r
+                       this.active = 0;\r
+               },\r
+\r
+               setDisabled : function(s) {\r
+                       var e;\r
+\r
+                       if (s != this.disabled) {\r
+                               e = DOM.get(this.id);\r
+\r
+                               // Add accessibility title for unavailable actions\r
+                               if (e && this.settings.unavailable_prefix) {\r
+                                       if (s) {\r
+                                               this.prevTitle = e.title;\r
+                                               e.title = this.settings.unavailable_prefix + ": " + e.title;\r
+                                       } else\r
+                                               e.title = this.prevTitle;\r
+                               }\r
+\r
+                               this.setState('Disabled', s);\r
+                               this.setState('Enabled', !s);\r
+                               this.disabled = s;\r
+                       }\r
+               },\r
+\r
+               isDisabled : function() {\r
+                       return this.disabled;\r
+               },\r
+\r
+               setActive : function(s) {\r
+                       if (s != this.active) {\r
+                               this.setState('Active', s);\r
+                               this.active = s;\r
+                       }\r
+               },\r
+\r
+               isActive : function() {\r
+                       return this.active;\r
+               },\r
+\r
+               setState : function(c, s) {\r
+                       var n = DOM.get(this.id);\r
+\r
+                       c = this.classPrefix + c;\r
+\r
+                       if (s)\r
+                               DOM.addClass(n, c);\r
+                       else\r
+                               DOM.removeClass(n, c);\r
+               },\r
+\r
+               isRendered : function() {\r
+                       return this.rendered;\r
+               },\r
+\r
+               renderHTML : function() {\r
+               },\r
+\r
+               renderTo : function(n) {\r
+                       DOM.setHTML(n, this.renderHTML());\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, b;\r
+\r
+                       // Set pending states\r
+                       if (is(t.disabled)) {\r
+                               b = t.disabled;\r
+                               t.disabled = -1;\r
+                               t.setDisabled(b);\r
+                       }\r
+\r
+                       if (is(t.active)) {\r
+                               b = t.active;\r
+                               t.active = -1;\r
+                               t.setActive(b);\r
+                       }\r
+               },\r
+\r
+               remove : function() {\r
+                       DOM.remove(this.id);\r
+                       this.destroy();\r
+               },\r
+\r
+               destroy : function() {\r
+                       tinymce.dom.Event.clear(this.id);\r
+               }\r
+\r
+               });\r
+})();\r
+/* file:jscripts/tiny_mce/classes/ui/Container.js */\r
+\r
+tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {\r
+       Container : function(id, s) {\r
+               this.parent(id, s);\r
+               this.controls = [];\r
+               this.lookup = {};\r
+       },\r
+\r
+       add : function(c) {\r
+               this.lookup[c.id] = c;\r
+               this.controls.push(c);\r
+\r
+               return c;\r
+       },\r
+\r
+       get : function(n) {\r
+               return this.lookup[n];\r
+       }\r
+\r
+       });\r
+\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/Separator.js */\r
+\r
+tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {\r
+       Separator : function(id, s) {\r
+               this.parent(id, s);\r
+               this.classPrefix = 'mceSeparator';\r
+       },\r
+\r
+       renderHTML : function() {\r
+               return tinymce.DOM.createHTML('span', {'class' : this.classPrefix});\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/MenuItem.js */\r
+\r
+(function() {\r
+       var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;\r
+\r
+       tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', {\r
+               MenuItem : function(id, s) {\r
+                       this.parent(id, s);\r
+                       this.classPrefix = 'mceMenuItem';\r
+               },\r
+\r
+               setSelected : function(s) {\r
+                       this.setState('Selected', s);\r
+                       this.selected = s;\r
+               },\r
+\r
+               isSelected : function() {\r
+                       return this.selected;\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this;\r
+                       \r
+                       t.parent();\r
+\r
+                       // Set pending state\r
+                       if (is(t.selected))\r
+                               t.setSelected(t.selected);\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/Menu.js */\r
+\r
+(function() {\r
+       var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;\r
+\r
+       tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', {\r
+               Menu : function(id, s) {\r
+                       var t = this;\r
+\r
+                       t.parent(id, s);\r
+                       t.items = {};\r
+                       t.collapsed = false;\r
+                       t.menuCount = 0;\r
+                       t.onAddItem = new tinymce.util.Dispatcher(this);\r
+               },\r
+\r
+               expand : function(d) {\r
+                       var t = this;\r
+\r
+                       if (d) {\r
+                               walk(t, function(o) {\r
+                                       if (o.expand)\r
+                                               o.expand();\r
+                               }, 'items', t);\r
+                       }\r
+\r
+                       t.collapsed = false;\r
+               },\r
+\r
+               collapse : function(d) {\r
+                       var t = this;\r
+\r
+                       if (d) {\r
+                               walk(t, function(o) {\r
+                                       if (o.collapse)\r
+                                               o.collapse();\r
+                               }, 'items', t);\r
+                       }\r
+\r
+                       t.collapsed = true;\r
+               },\r
+\r
+               isCollapsed : function() {\r
+                       return this.collapsed;\r
+               },\r
+\r
+               add : function(o) {\r
+                       if (!o.settings)\r
+                               o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o);\r
+\r
+                       this.onAddItem.dispatch(this, o);\r
+\r
+                       return this.items[o.id] = o;\r
+               },\r
+\r
+               addSeparator : function() {\r
+                       return this.add({separator : true});\r
+               },\r
+\r
+               addMenu : function(o) {\r
+                       if (!o.collapse)\r
+                               o = this.createMenu(o);\r
+\r
+                       this.menuCount++;\r
+\r
+                       return this.add(o);\r
+               },\r
+\r
+               hasMenus : function() {\r
+                       return this.menuCount !== 0;\r
+               },\r
+\r
+               remove : function(o) {\r
+                       delete this.items[o.id];\r
+               },\r
+\r
+               removeAll : function() {\r
+                       var t = this;\r
+\r
+                       walk(t, function(o) {\r
+                               if (o.removeAll)\r
+                                       o.removeAll();\r
+                               else\r
+                                       o.remove();\r
+\r
+                               o.destroy();\r
+                       }, 'items', t);\r
+\r
+                       t.items = {};\r
+               },\r
+\r
+               createMenu : function(o) {\r
+                       var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o);\r
+\r
+                       m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem);\r
+\r
+                       return m;\r
+               }\r
+\r
+               });\r
+})();\r
+/* file:jscripts/tiny_mce/classes/ui/DropMenu.js */\r
+\r
+(function() {\r
+       var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element;\r
+\r
+       tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', {\r
+               DropMenu : function(id, s) {\r
+                       s = s || {};\r
+                       s.container = s.container || DOM.doc.body;\r
+                       s.offset_x = s.offset_x || 0;\r
+                       s.offset_y = s.offset_y || 0;\r
+                       s.vp_offset_x = s.vp_offset_x || 0;\r
+                       s.vp_offset_y = s.vp_offset_y || 0;\r
+\r
+                       if (is(s.icons) && !s.icons)\r
+                               s['class'] += ' mceNoIcons';\r
+\r
+                       this.parent(id, s);\r
+                       this.onShowMenu = new tinymce.util.Dispatcher(this);\r
+                       this.onHideMenu = new tinymce.util.Dispatcher(this);\r
+                       this.classPrefix = 'mceMenu';\r
+\r
+                       // Fix for odd IE bug: #1903622\r
+                       this.fixIE = tinymce.isIE && DOM.win.top != DOM.win;\r
+               },\r
+\r
+               createMenu : function(s) {\r
+                       var t = this, cs = t.settings, m;\r
+\r
+                       s.container = s.container || cs.container;\r
+                       s.parent = t;\r
+                       s.constrain = s.constrain || cs.constrain;\r
+                       s['class'] = s['class'] || cs['class'];\r
+                       s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x;\r
+                       s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y;\r
+                       m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s);\r
+\r
+                       m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem);\r
+\r
+                       return m;\r
+               },\r
+\r
+               update : function() {\r
+                       var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th;\r
+\r
+                       tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth;\r
+                       th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight;\r
+\r
+                       if (!DOM.boxModel)\r
+                               t.element.setStyles({width : tw + 2, height : th + 2});\r
+                       else\r
+                               t.element.setStyles({width : tw, height : th});\r
+\r
+                       if (s.max_width)\r
+                               DOM.setStyle(co, 'width', tw);\r
+\r
+                       if (s.max_height) {\r
+                               DOM.setStyle(co, 'height', th);\r
+\r
+                               if (tb.clientHeight < s.max_height)\r
+                                       DOM.setStyle(co, 'overflow', 'hidden');\r
+                       }\r
+               },\r
+\r
+               showMenu : function(x, y, px) {\r
+                       var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix;\r
+\r
+                       t.collapse(1);\r
+\r
+                       if (t.isMenuVisible)\r
+                               return;\r
+\r
+                       if (!t.rendered) {\r
+                               co = DOM.add(t.settings.container, t.renderNode());\r
+\r
+                               each(t.items, function(o) {\r
+                                       o.postRender();\r
+                               });\r
+\r
+                               t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container});\r
+                       } else\r
+                               co = DOM.get('menu_' + t.id);\r
+\r
+                       // Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug\r
+                       if (!tinymce.isOpera)\r
+                               DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF});\r
+\r
+                       DOM.show(co);\r
+                       t.update();\r
+\r
+                       x += s.offset_x || 0;\r
+                       y += s.offset_y || 0;\r
+                       vp.w -= 4;\r
+                       vp.h -= 4;\r
+\r
+                       // Move inside viewport if not submenu\r
+                       if (s.constrain) {\r
+                               w = co.clientWidth - ot;\r
+                               h = co.clientHeight - ot;\r
+                               mx = vp.x + vp.w;\r
+                               my = vp.y + vp.h;\r
+\r
+                               if ((x + s.vp_offset_x + w) > mx)\r
+                                       x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w);\r
+\r
+                               if ((y + s.vp_offset_y + h) > my)\r
+                                       y = Math.max(0, (my - s.vp_offset_y) - h);\r
+                       }\r
+\r
+                       DOM.setStyles(co, {left : x , top : y});\r
+                       t.element.update();\r
+\r
+                       t.isMenuVisible = 1;\r
+                       t.mouseClickFunc = Event.add(co, t.fixIE ? 'mousedown' : 'click', function(e) {\r
+                               var m;\r
+\r
+                               e = e.target;\r
+\r
+                               if (e && (e = DOM.getParent(e, 'TR')) && !DOM.hasClass(e, cp + 'ItemSub')) {\r
+                                       m = t.items[e.id];\r
+\r
+                                       if (m.isDisabled())\r
+                                               return;\r
+\r
+                                       dm = t;\r
+\r
+                                       while (dm) {\r
+                                               if (dm.hideMenu)\r
+                                                       dm.hideMenu();\r
+\r
+                                               dm = dm.settings.parent;\r
+                                       }\r
+\r
+                                       if (m.settings.onclick)\r
+                                               m.settings.onclick(e);\r
+\r
+                                       return Event.cancel(e); // Cancel to fix onbeforeunload problem\r
+                               }\r
+                       });\r
+\r
+                       if (t.hasMenus()) {\r
+                               t.mouseOverFunc = Event.add(co, 'mouseover', function(e) {\r
+                                       var m, r, mi;\r
+\r
+                                       e = e.target;\r
+                                       if (e && (e = DOM.getParent(e, 'TR'))) {\r
+                                               m = t.items[e.id];\r
+\r
+                                               if (t.lastMenu)\r
+                                                       t.lastMenu.collapse(1);\r
+\r
+                                               if (m.isDisabled())\r
+                                                       return;\r
+\r
+                                               if (e && DOM.hasClass(e, cp + 'ItemSub')) {\r
+                                                       //p = DOM.getPos(s.container);\r
+                                                       r = DOM.getRect(e);\r
+                                                       m.showMenu((r.x + r.w - ot), r.y - ot, r.x);\r
+                                                       t.lastMenu = m;\r
+                                                       DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive');\r
+                                               }\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       t.onShowMenu.dispatch(t);\r
+\r
+                       if (s.keyboard_focus) {\r
+                               Event.add(co, 'keydown', t._keyHandler, t);\r
+                               DOM.select('a', 'menu_' + t.id)[0].focus(); // Select first link\r
+                       }\r
+               },\r
+\r
+               hideMenu : function(c) {\r
+                       var t = this, co = DOM.get('menu_' + t.id), e;\r
+\r
+                       if (!t.isMenuVisible)\r
+                               return;\r
+\r
+                       Event.remove(co, 'mouseover', t.mouseOverFunc);\r
+                       Event.remove(co, t.fixIE ? 'mousedown' : 'click', t.mouseClickFunc);\r
+                       Event.remove(co, 'keydown', t._keyHandler);\r
+                       DOM.hide(co);\r
+                       t.isMenuVisible = 0;\r
+\r
+                       if (!c)\r
+                               t.collapse(1);\r
+\r
+                       if (t.element)\r
+                               t.element.hide();\r
+\r
+                       if (e = DOM.get(t.id))\r
+                               DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive');\r
+\r
+                       t.onHideMenu.dispatch(t);\r
+               },\r
+\r
+               add : function(o) {\r
+                       var t = this, co;\r
+\r
+                       o = t.parent(o);\r
+\r
+                       if (t.isRendered && (co = DOM.get('menu_' + t.id)))\r
+                               t._add(DOM.select('tbody', co)[0], o);\r
+\r
+                       return o;\r
+               },\r
+\r
+               collapse : function(d) {\r
+                       this.parent(d);\r
+                       this.hideMenu(1);\r
+               },\r
+\r
+               remove : function(o) {\r
+                       DOM.remove(o.id);\r
+                       this.destroy();\r
+\r
+                       return this.parent(o);\r
+               },\r
+\r
+               destroy : function() {\r
+                       var t = this, co = DOM.get('menu_' + t.id);\r
+\r
+                       Event.remove(co, 'mouseover', t.mouseOverFunc);\r
+                       Event.remove(co, 'click', t.mouseClickFunc);\r
+\r
+                       if (t.element)\r
+                               t.element.remove();\r
+\r
+                       DOM.remove(co);\r
+               },\r
+\r
+               renderNode : function() {\r
+                       var t = this, s = t.settings, n, tb, co, w;\r
+\r
+                       w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000'});\r
+                       co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')});\r
+                       t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container});\r
+\r
+                       if (s.menu_line)\r
+                               DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'});\r
+\r
+//                     n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'});\r
+                       n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0});\r
+                       tb = DOM.add(n, 'tbody');\r
+\r
+                       each(t.items, function(o) {\r
+                               t._add(tb, o);\r
+                       });\r
+\r
+                       t.rendered = true;\r
+\r
+                       return w;\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _keyHandler : function(e) {\r
+                       // Accessibility feature\r
+                       if (e.keyCode == 27)\r
+                               this.hideMenu();\r
+               },\r
+\r
+               _add : function(tb, o) {\r
+                       var n, s = o.settings, a, ro, it, cp = this.classPrefix;\r
+\r
+                       if (s.separator) {\r
+                               ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'});\r
+                               DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'});\r
+\r
+                               if (n = ro.previousSibling)\r
+                                       DOM.addClass(n, 'mceLast');\r
+\r
+                               return;\r
+                       }\r
+\r
+                       n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'});\r
+                       n = it = DOM.add(n, 'td');\r
+                       n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'});\r
+\r
+                       DOM.addClass(it, s['class']);\r
+//                     n = DOM.add(n, 'span', {'class' : 'item'});\r
+                       DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')});\r
+                       n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title);\r
+\r
+                       if (o.settings.style)\r
+                               DOM.setAttrib(n, 'style', o.settings.style);\r
+\r
+                       if (tb.childNodes.length == 1)\r
+                               DOM.addClass(ro, 'mceFirst');\r
+\r
+                       if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator'))\r
+                               DOM.addClass(ro, 'mceFirst');\r
+\r
+                       if (o.collapse)\r
+                               DOM.addClass(ro, cp + 'ItemSub');\r
+\r
+                       if (n = ro.previousSibling)\r
+                               DOM.removeClass(n, 'mceLast');\r
+\r
+                       DOM.addClass(ro, 'mceLast');\r
+               }\r
+\r
+               });\r
+})();\r
+/* file:jscripts/tiny_mce/classes/ui/Button.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM;\r
+\r
+       tinymce.create('tinymce.ui.Button:tinymce.ui.Control', {\r
+               Button : function(id, s) {\r
+                       this.parent(id, s);\r
+                       this.classPrefix = 'mceButton';\r
+               },\r
+\r
+               renderHTML : function() {\r
+                       var cp = this.classPrefix, s = this.settings, h = '<a id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + '" onmousedown="return false;" onclick="return false;" title="' + DOM.encode(s.title) + '">';\r
+\r
+                       if (s.image)\r
+                               h += '<img class="mceIcon" src="' + s.image + '" /></a>';\r
+                       else\r
+                               h += '<span class="mceIcon ' + s['class'] + '"></span></a>';\r
+\r
+                       return h;\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, s = t.settings;\r
+\r
+                       tinymce.dom.Event.add(t.id, 'click', function(e) {\r
+                               if (!t.isDisabled())\r
+                                       return s.onclick.call(s.scope, e);\r
+                       });\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/ListBox.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;\r
+\r
+       tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', {\r
+               ListBox : function(id, s) {\r
+                       var t = this;\r
+\r
+                       t.parent(id, s);\r
+                       t.items = [];\r
+                       t.onChange = new Dispatcher(t);\r
+                       t.onPostRender = new Dispatcher(t);\r
+                       t.onAdd = new Dispatcher(t);\r
+                       t.onRenderMenu = new tinymce.util.Dispatcher(this);\r
+                       t.classPrefix = 'mceListBox';\r
+               },\r
+\r
+               select : function(v) {\r
+                       var t = this, e, fv;\r
+\r
+                       // Do we need to do something?\r
+                       if (v != t.selectedValue) {\r
+                               e = DOM.get(t.id + '_text');\r
+                               t.selectedValue = v;\r
+\r
+                               // Find item\r
+                               each(t.items, function(o) {\r
+                                       if (o.value == v) {\r
+                                               DOM.setHTML(e, DOM.encode(o.title));\r
+                                               fv = 1;\r
+                                               return false;\r
+                                       }\r
+                               });\r
+\r
+                               // If no item was found then present title\r
+                               if (!fv) {\r
+                                       DOM.setHTML(e, DOM.encode(t.settings.title));\r
+                                       DOM.addClass(e, 'mceTitle');\r
+                                       e = 0;\r
+                                       return;\r
+                               } else\r
+                                       DOM.removeClass(e, 'mceTitle');\r
+                       }\r
+\r
+                       e = 0;\r
+               },\r
+\r
+               add : function(n, v, o) {\r
+                       var t = this;\r
+\r
+                       o = o || {};\r
+                       o = tinymce.extend(o, {\r
+                               title : n,\r
+                               value : v\r
+                       });\r
+\r
+                       t.items.push(o);\r
+                       t.onAdd.dispatch(t, o);\r
+               },\r
+\r
+               getLength : function() {\r
+                       return this.items.length;\r
+               },\r
+\r
+               renderHTML : function() {\r
+                       var h = '', t = this, s = t.settings, cp = t.classPrefix;\r
+\r
+                       h = '<table id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>';\r
+                       h += '<td>' + DOM.createHTML('a', {id : t.id + '_text', href : 'javascript:;', 'class' : 'mceText', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '</td>';\r
+                       h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', tabindex : -1, href : 'javascript:;', 'class' : 'mceOpen', onclick : "return false;", onmousedown : 'return false;'}, '<span></span>') + '</td>';\r
+                       h += '</tr></tbody></table>';\r
+\r
+                       return h;\r
+               },\r
+\r
+               showMenu : function() {\r
+                       var t = this, p1, p2, e = DOM.get(this.id), m;\r
+\r
+                       if (t.isDisabled() || t.items.length == 0)\r
+                               return;\r
+\r
+                       if (!t.isMenuRendered) {\r
+                               t.renderMenu();\r
+                               t.isMenuRendered = true;\r
+                       }\r
+\r
+                       p1 = DOM.getPos(this.settings.menu_container);\r
+                       p2 = DOM.getPos(e);\r
+\r
+                       m = t.menu;\r
+                       m.settings.offset_x = p2.x;\r
+                       m.settings.offset_y = p2.y;\r
+                       m.settings.keyboard_focus = t._focused;\r
+\r
+                       // Select in menu\r
+                       if (t.oldID)\r
+                               m.items[t.oldID].setSelected(0);\r
+\r
+                       each(t.items, function(o) {\r
+                               if (o.value === t.selectedValue) {\r
+                                       m.items[o.id].setSelected(1);\r
+                                       t.oldID = o.id;\r
+                               }\r
+                       });\r
+\r
+                       m.showMenu(0, e.clientHeight);\r
+\r
+                       Event.add(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                       DOM.addClass(t.id, t.classPrefix + 'Selected');\r
+               },\r
+\r
+               hideMenu : function(e) {\r
+                       var t = this;\r
+\r
+                       if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceMenu');})) {\r
+                               DOM.removeClass(t.id, t.classPrefix + 'Selected');\r
+                               Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);\r
+\r
+                               if (t.menu)\r
+                                       t.menu.hideMenu();\r
+                       }\r
+               },\r
+\r
+               renderMenu : function() {\r
+                       var t = this, m;\r
+\r
+                       m = t.settings.control_manager.createDropMenu(t.id + '_menu', {\r
+                               menu_line : 1,\r
+                               'class' : t.classPrefix + 'Menu mceNoIcons',\r
+                               max_width : 150,\r
+                               max_height : 150\r
+                       });\r
+\r
+                       m.onHideMenu.add(t.hideMenu, t);\r
+\r
+                       m.add({\r
+                               title : t.settings.title,\r
+                               'class' : 'mceMenuItemTitle'\r
+                       }).setDisabled(1);\r
+\r
+                       each(t.items, function(o) {\r
+                               o.id = DOM.uniqueId();\r
+                               o.onclick = function() {\r
+                                       if (t.settings.onselect(o.value) !== false)\r
+                                               t.select(o.value); // Must be runned after\r
+                               };\r
+\r
+                               m.add(o);\r
+                       });\r
+\r
+                       t.onRenderMenu.dispatch(t, m);\r
+                       t.menu = m;\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, cp = t.classPrefix;\r
+\r
+                       Event.add(t.id, 'click', t.showMenu, t);\r
+                       Event.add(t.id + '_text', 'focus', function() {t._focused = 1;});\r
+                       Event.add(t.id + '_text', 'blur', function() {t._focused = 0;});\r
+\r
+                       // Old IE doesn't have hover on all elements\r
+                       if (tinymce.isIE6 || !DOM.boxModel) {\r
+                               Event.add(t.id, 'mouseover', function() {\r
+                                       if (!DOM.hasClass(t.id, cp + 'Disabled'))\r
+                                               DOM.addClass(t.id, cp + 'Hover');\r
+                               });\r
+\r
+                               Event.add(t.id, 'mouseout', function() {\r
+                                       if (!DOM.hasClass(t.id, cp + 'Disabled'))\r
+                                               DOM.removeClass(t.id, cp + 'Hover');\r
+                               });\r
+                       }\r
+\r
+                       t.onPostRender.dispatch(t, DOM.get(t.id));\r
+               },\r
+\r
+               destroy : function() {\r
+                       this.parent();\r
+\r
+                       Event.clear(this.id + '_text');\r
+               }\r
+\r
+               });\r
+})();\r
+/* file:jscripts/tiny_mce/classes/ui/NativeListBox.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;\r
+\r
+       tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', {\r
+               NativeListBox : function(id, s) {\r
+                       this.parent(id, s);\r
+                       this.classPrefix = 'mceNativeListBox';\r
+               },\r
+\r
+               setDisabled : function(s) {\r
+                       DOM.get(this.id).disabled = s;\r
+               },\r
+\r
+               isDisabled : function() {\r
+                       return DOM.get(this.id).disabled;\r
+               },\r
+\r
+               select : function(v) {\r
+                       var e = DOM.get(this.id), ol = e.options;\r
+\r
+                       v = '' + (v || '');\r
+\r
+                       e.selectedIndex = 0;\r
+                       each(ol, function(o, i) {\r
+                               if (o.value == v) {\r
+                                       e.selectedIndex = i;\r
+                                       return false;\r
+                               }\r
+                       });\r
+               },\r
+\r
+               add : function(n, v, a) {\r
+                       var o, t = this;\r
+\r
+                       a = a || {};\r
+                       a.value = v;\r
+\r
+                       if (t.isRendered())\r
+                               DOM.add(DOM.get(this.id), 'option', a, n);\r
+\r
+                       o = {\r
+                               title : n,\r
+                               value : v,\r
+                               attribs : a\r
+                       };\r
+\r
+                       t.items.push(o);\r
+                       t.onAdd.dispatch(t, o);\r
+               },\r
+\r
+               getLength : function() {\r
+                       return DOM.get(this.id).options.length - 1;\r
+               },\r
+\r
+               renderHTML : function() {\r
+                       var h, t = this;\r
+\r
+                       h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --');\r
+\r
+                       each(t.items, function(it) {\r
+                               h += DOM.createHTML('option', {value : it.value}, it.title);\r
+                       });\r
+\r
+                       h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox'}, h);\r
+\r
+                       return h;\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, ch;\r
+\r
+                       t.rendered = true;\r
+\r
+                       function onChange(e) {\r
+                               var v = e.target.options[e.target.selectedIndex].value;\r
+\r
+                               t.onChange.dispatch(t, v);\r
+\r
+                               if (t.settings.onselect)\r
+                                       t.settings.onselect(v);\r
+                       };\r
+\r
+                       Event.add(t.id, 'change', onChange);\r
+\r
+                       // Accessibility keyhandler\r
+                       Event.add(t.id, 'keydown', function(e) {\r
+                               var bf;\r
+\r
+                               Event.remove(t.id, 'change', ch);\r
+\r
+                               bf = Event.add(t.id, 'blur', function() {\r
+                                       Event.add(t.id, 'change', onChange);\r
+                                       Event.remove(t.id, 'blur', bf);\r
+                               });\r
+\r
+                               if (e.keyCode == 13 || e.keyCode == 32) {\r
+                                       onChange(e);\r
+                                       return Event.cancel(e);\r
+                               }\r
+                       });\r
+\r
+                       t.onPostRender.dispatch(t, DOM.get(t.id));\r
+               }\r
+\r
+               });\r
+})();\r
+/* file:jscripts/tiny_mce/classes/ui/MenuButton.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', {\r
+               MenuButton : function(id, s) {\r
+                       this.parent(id, s);\r
+                       this.onRenderMenu = new tinymce.util.Dispatcher(this);\r
+                       s.menu_container = s.menu_container || DOM.doc.body;\r
+               },\r
+\r
+               showMenu : function() {\r
+                       var t = this, p1, p2, e = DOM.get(t.id), m;\r
+\r
+                       if (t.isDisabled())\r
+                               return;\r
+\r
+                       if (!t.isMenuRendered) {\r
+                               t.renderMenu();\r
+                               t.isMenuRendered = true;\r
+                       }\r
+\r
+                       p1 = DOM.getPos(t.settings.menu_container);\r
+                       p2 = DOM.getPos(e);\r
+\r
+                       m = t.menu;\r
+                       m.settings.offset_x = p2.x;\r
+                       m.settings.offset_y = p2.y;\r
+                       m.settings.vp_offset_x = p2.x;\r
+                       m.settings.vp_offset_y = p2.y;\r
+                       m.settings.keyboard_focus = t._focused;\r
+                       m.showMenu(0, e.clientHeight);\r
+\r
+                       Event.add(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                       t.setState('Selected', 1);\r
+               },\r
+\r
+               renderMenu : function() {\r
+                       var t = this, m;\r
+\r
+                       m = t.settings.control_manager.createDropMenu(t.id + '_menu', {\r
+                               menu_line : 1,\r
+                               'class' : this.classPrefix + 'Menu',\r
+                               icons : t.settings.icons\r
+                       });\r
+\r
+                       m.onHideMenu.add(t.hideMenu, t);\r
+\r
+                       t.onRenderMenu.dispatch(t, m);\r
+                       t.menu = m;\r
+               },\r
+\r
+               hideMenu : function(e) {\r
+                       var t = this;\r
+\r
+                       if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceMenu');})) {\r
+                               t.setState('Selected', 0);\r
+                               Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                               if (t.menu)\r
+                                       t.menu.hideMenu();\r
+                       }\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, s = t.settings;\r
+\r
+                       Event.add(t.id, 'click', function() {\r
+                               if (!t.isDisabled()) {\r
+                                       if (s.onclick)\r
+                                               s.onclick(t.value);\r
+\r
+                                       t.showMenu();\r
+                               }\r
+                       });\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/SplitButton.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', {\r
+               SplitButton : function(id, s) {\r
+                       this.parent(id, s);\r
+                       this.classPrefix = 'mceSplitButton';\r
+               },\r
+\r
+               renderHTML : function() {\r
+                       var h, t = this, s = t.settings, h1;\r
+\r
+                       h = '<tbody><tr>';\r
+\r
+                       if (s.image)\r
+                               h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'mceAction ' + s['class']});\r
+                       else\r
+                               h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, '');\r
+\r
+                       h += '<td>' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>';\r
+       \r
+                       h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']});\r
+                       h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>';\r
+\r
+                       h += '</tr></tbody>';\r
+\r
+                       return DOM.createHTML('table', {id : t.id, 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', onmousedown : 'return false;', title : s.title}, h);\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, s = t.settings;\r
+\r
+                       if (s.onclick) {\r
+                               Event.add(t.id + '_action', 'click', function() {\r
+                                       if (!t.isDisabled())\r
+                                               s.onclick(t.value);\r
+                               });\r
+                       }\r
+\r
+                       Event.add(t.id + '_open', 'click', t.showMenu, t);\r
+                       Event.add(t.id + '_open', 'focus', function() {t._focused = 1;});\r
+                       Event.add(t.id + '_open', 'blur', function() {t._focused = 0;});\r
+\r
+                       // Old IE doesn't have hover on all elements\r
+                       if (tinymce.isIE6 || !DOM.boxModel) {\r
+                               Event.add(t.id, 'mouseover', function() {\r
+                                       if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled'))\r
+                                               DOM.addClass(t.id, 'mceSplitButtonHover');\r
+                               });\r
+\r
+                               Event.add(t.id, 'mouseout', function() {\r
+                                       if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled'))\r
+                                               DOM.removeClass(t.id, 'mceSplitButtonHover');\r
+                               });\r
+                       }\r
+               },\r
+\r
+               destroy : function() {\r
+                       this.parent();\r
+\r
+                       Event.clear(this.id + '_action');\r
+                       Event.clear(this.id + '_open');\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/ColorSplitButton.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', {\r
+               ColorSplitButton : function(id, s) {\r
+                       var t = this;\r
+\r
+                       t.parent(id, s);\r
+\r
+                       t.settings = s = tinymce.extend({\r
+                               colors : '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF',\r
+                               grid_width : 8,\r
+                               default_color : '#888888'\r
+                       }, t.settings);\r
+\r
+                       t.value = s.default_color;\r
+               },\r
+\r
+               showMenu : function() {\r
+                       var t = this, r, p, e, p2;\r
+\r
+                       if (t.isDisabled())\r
+                               return;\r
+\r
+                       if (!t.isMenuRendered) {\r
+                               t.renderMenu();\r
+                               t.isMenuRendered = true;\r
+                       }\r
+\r
+                       e = DOM.get(t.id);\r
+                       DOM.show(t.id + '_menu');\r
+                       DOM.addClass(e, 'mceSplitButtonSelected');\r
+                       p2 = DOM.getPos(e);\r
+                       DOM.setStyles(t.id + '_menu', {\r
+                               left : p2.x,\r
+                               top : p2.y + e.clientHeight,\r
+                               zIndex : 200000\r
+                       });\r
+                       e = 0;\r
+\r
+                       Event.add(DOM.doc, 'mousedown', t.hideMenu, t);\r
+\r
+                       if (t._focused) {\r
+                               t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) {\r
+                                       if (e.keyCode == 27)\r
+                                               t.hideMenu();\r
+                               });\r
+\r
+                               DOM.select('a', t.id + '_menu')[0].focus(); // Select first link\r
+                       }\r
+               },\r
+\r
+               hideMenu : function(e) {\r
+                       var t = this;\r
+\r
+                       if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceSplitButtonMenu');})) {\r
+                               DOM.removeClass(t.id, 'mceSplitButtonSelected');\r
+                               Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                               Event.remove(t.id + '_menu', 'keydown', t._keyHandler);\r
+                               DOM.hide(t.id + '_menu');\r
+                       }\r
+               },\r
+\r
+               renderMenu : function() {\r
+                       var t = this, m, i = 0, s = t.settings, n, tb, tr, w;\r
+\r
+                       w = DOM.add(s.menu_container, 'div', {id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'});\r
+                       m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'});\r
+                       DOM.add(m, 'span', {'class' : 'mceMenuLine'});\r
+\r
+                       n = DOM.add(m, 'table', {'class' : 'mceColorSplitMenu'});\r
+                       tb = DOM.add(n, 'tbody');\r
+\r
+                       // Generate color grid\r
+                       i = 0;\r
+                       each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) {\r
+                               c = c.replace(/^#/, '');\r
+\r
+                               if (!i--) {\r
+                                       tr = DOM.add(tb, 'tr');\r
+                                       i = s.grid_width - 1;\r
+                               }\r
+\r
+                               n = DOM.add(tr, 'td');\r
+\r
+                               n = DOM.add(n, 'a', {\r
+                                       href : 'javascript:;',\r
+                                       style : {\r
+                                               backgroundColor : '#' + c\r
+                                       },\r
+                                       mce_color : '#' + c\r
+                               });\r
+                       });\r
+\r
+                       if (s.more_colors_func) {\r
+                               n = DOM.add(tb, 'tr');\r
+                               n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'});\r
+                               n = DOM.add(n, 'a', {id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title);\r
+\r
+                               Event.add(n, 'click', function(e) {\r
+                                       s.more_colors_func.call(s.more_colors_scope || this);\r
+                                       return Event.cancel(e); // Cancel to fix onbeforeunload problem\r
+                               });\r
+                       }\r
+\r
+                       DOM.addClass(m, 'mceColorSplitMenu');\r
+\r
+                       Event.add(t.id + '_menu', 'click', function(e) {\r
+                               var c;\r
+\r
+                               e = e.target;\r
+\r
+                               if (e.nodeName == 'A' && (c = e.getAttribute('mce_color')))\r
+                                       t.setColor(c);\r
+                       });\r
+\r
+                       return w;\r
+               },\r
+\r
+               setColor : function(c) {\r
+                       var t = this;\r
+\r
+                       DOM.setStyle(t.id + '_preview', 'backgroundColor', c);\r
+\r
+                       t.value = c;\r
+                       t.hideMenu();\r
+                       t.settings.onselect(c);\r
+               },\r
+\r
+               postRender : function() {\r
+                       var t = this, id = t.id;\r
+\r
+                       t.parent();\r
+                       DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' : 'mceColorPreview'});\r
+               },\r
+\r
+               destroy : function() {\r
+                       this.parent();\r
+\r
+                       Event.clear(this.id + '_menu');\r
+                       Event.clear(this.id + '_more');\r
+                       DOM.remove(this.id + '_menu');\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ui/Toolbar.js */\r
+\r
+tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {\r
+       renderHTML : function() {\r
+               var t = this, h = '', c, co, dom = tinymce.DOM, s = t.settings, i, pr, nx, cl;\r
+\r
+               cl = t.controls;\r
+               for (i=0; i<cl.length; i++) {\r
+                       // Get current control, prev control, next control and if the control is a list box or not\r
+                       co = cl[i];\r
+                       pr = cl[i - 1];\r
+                       nx = cl[i + 1];\r
+\r
+                       // Add toolbar start\r
+                       if (i === 0) {\r
+                               c = 'mceToolbarStart';\r
+\r
+                               if (co.Button)\r
+                                       c += ' mceToolbarStartButton';\r
+                               else if (co.SplitButton)\r
+                                       c += ' mceToolbarStartSplitButton';\r
+                               else if (co.ListBox)\r
+                                       c += ' mceToolbarStartListBox';\r
+\r
+                               h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->'));\r
+                       }\r
+\r
+                       // Add toolbar end before list box and after the previous button\r
+                       // This is to fix the o2k7 editor skins\r
+                       if (pr && co.ListBox) {\r
+                               if (pr.Button || pr.SplitButton)\r
+                                       h += dom.createHTML('td', {'class' : 'mceToolbarEnd'}, dom.createHTML('span', null, '<!-- IE -->'));\r
+                       }\r
+\r
+                       // Render control HTML\r
+\r
+                       // IE 8 quick fix, needed to propertly generate a hit area for anchors\r
+                       if (dom.stdMode)\r
+                               h += '<td style="position: relative">' + co.renderHTML() + '</td>';\r
+                       else\r
+                               h += '<td>' + co.renderHTML() + '</td>';\r
+\r
+                       // Add toolbar start after list box and before the next button\r
+                       // This is to fix the o2k7 editor skins\r
+                       if (nx && co.ListBox) {\r
+                               if (nx.Button || nx.SplitButton)\r
+                                       h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->'));\r
+                       }\r
+               }\r
+\r
+               c = 'mceToolbarEnd';\r
+\r
+               if (co.Button)\r
+                       c += ' mceToolbarEndButton';\r
+               else if (co.SplitButton)\r
+                       c += ' mceToolbarEndSplitButton';\r
+               else if (co.ListBox)\r
+                       c += ' mceToolbarEndListBox';\r
+\r
+               h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->'));\r
+\r
+               return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '<tbody><tr>' + h + '</tr></tbody>');\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/AddOnManager.js */\r
+\r
+(function() {\r
+       var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each;\r
+\r
+       tinymce.create('tinymce.AddOnManager', {\r
+               items : [],\r
+               urls : {},\r
+               lookup : {},\r
+               onAdd : new Dispatcher(this),\r
+\r
+               get : function(n) {\r
+                       return this.lookup[n];\r
+               },\r
+\r
+               requireLangPack : function(n) {\r
+                       var u, s;\r
+\r
+                       if (tinymce.EditorManager.settings) {\r
+                               u = this.urls[n] + '/langs/' + tinymce.EditorManager.settings.language + '.js';\r
+                               s = tinymce.EditorManager.settings;\r
+\r
+                               if (s) {\r
+                                       if (!tinymce.dom.Event.domLoaded && !s.strict_mode)\r
+                                               tinymce.ScriptLoader.load(u);\r
+                                       else\r
+                                               tinymce.ScriptLoader.add(u);\r
+                               }\r
+                       }\r
+               },\r
+\r
+               add : function(id, o) {\r
+                       this.items.push(o);\r
+                       this.lookup[id] = o;\r
+                       this.onAdd.dispatch(this, id, o);\r
+\r
+                       return o;\r
+               },\r
+\r
+               load : function(n, u, cb, s) {\r
+                       var t = this;\r
+\r
+                       if (t.urls[n])\r
+                               return;\r
+\r
+                       if (u.indexOf('/') != 0 && u.indexOf('://') == -1)\r
+                               u = tinymce.baseURL + '/' +  u;\r
+\r
+                       t.urls[n] = u.substring(0, u.lastIndexOf('/'));\r
+                       tinymce.ScriptLoader.add(u, cb, s);\r
+               }\r
+\r
+               });\r
+\r
+       // Create plugin and theme managers\r
+       tinymce.PluginManager = new tinymce.AddOnManager();\r
+       tinymce.ThemeManager = new tinymce.AddOnManager();\r
+}());\r
+/* file:jscripts/tiny_mce/classes/EditorManager.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var each = tinymce.each, extend = tinymce.extend, DOM = tinymce.DOM, Event = tinymce.dom.Event, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, explode = tinymce.explode;\r
+\r
+       tinymce.create('static tinymce.EditorManager', {\r
+               editors : {},\r
+               i18n : {},\r
+               activeEditor : null,\r
+\r
+               preInit : function() {\r
+                       var t = this, lo = window.location;\r
+\r
+                       // Setup some URLs where the editor API is located and where the document is\r
+                       tinymce.documentBaseURL = lo.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');\r
+                       if (!/[\/\\]$/.test(tinymce.documentBaseURL))\r
+                               tinymce.documentBaseURL += '/';\r
+\r
+                       tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);\r
+                       tinymce.EditorManager.baseURI = new tinymce.util.URI(tinymce.baseURL);\r
+\r
+                       // Setup document domain\r
+                       if (tinymce.EditorManager.baseURI.host != lo.hostname && lo.hostname)\r
+                               document.domain = tinymce.relaxedDomain = lo.hostname.replace(/.*\.(.+\..+)$/, '$1');\r
+\r
+                       // Add before unload listener\r
+                       // This was required since IE was leaking memory if you added and removed beforeunload listeners\r
+                       // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event\r
+                       t.onBeforeUnload = new tinymce.util.Dispatcher(t);\r
+\r
+                       // Must be on window or IE will leak if the editor is placed in frame or iframe\r
+                       Event.add(window, 'beforeunload', function(e) {\r
+                               t.onBeforeUnload.dispatch(t, e);\r
+                       });\r
+               },\r
+\r
+               init : function(s) {\r
+                       var t = this, pl, sl = tinymce.ScriptLoader, c;\r
+\r
+                       function execCallback(se, n, s) {\r
+                               var f = se[n];\r
+\r
+                               if (!f)\r
+                                       return;\r
+\r
+                               if (tinymce.is(f, 'string')) {\r
+                                       s = f.replace(/\.\w+$/, '');\r
+                                       s = s ? tinymce.resolve(s) : 0;\r
+                                       f = tinymce.resolve(f);\r
+                               }\r
+\r
+                               return f.apply(s || this, Array.prototype.slice.call(arguments, 2));\r
+                       };\r
+\r
+                       s = extend({\r
+                               theme : "simple",\r
+                               language : "en",\r
+                               strict_loading_mode : document.contentType == 'application/xhtml+xml'\r
+                       }, s);\r
+\r
+                       t.settings = s;\r
+\r
+                       // If page not loaded and strict mode isn't enabled then load them\r
+                       if (!Event.domLoaded && !s.strict_loading_mode) {\r
+                               // Load language\r
+                               if (s.language)\r
+                                       sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');\r
+\r
+                               // Load theme\r
+                               if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme])\r
+                                       ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js');\r
+\r
+                               // Load plugins\r
+                               if (s.plugins) {\r
+                                       pl = explode(s.plugins);\r
+\r
+                                       // Load compat2x first\r
+                                       if (tinymce.inArray(pl, 'compat2x') != -1)\r
+                                               PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');\r
+\r
+                                       // Load rest if plugins\r
+                                       each(pl, function(v) {\r
+                                               if (v && v.charAt(0) != '-' && !PluginManager.urls[v]) {\r
+                                                       // Skip safari plugin for other browsers\r
+                                                       if (!tinymce.isWebKit && v == 'safari')\r
+                                                               return;\r
+\r
+                                                       PluginManager.load(v, 'plugins/' + v + '/editor_plugin' + tinymce.suffix + '.js');\r
+                                               }\r
+                                       });\r
+                               }\r
+\r
+                               sl.loadQueue();\r
+                       }\r
+\r
+                       // Legacy call\r
+                       Event.add(document, 'init', function() {\r
+                               var l, co;\r
+\r
+                               execCallback(s, 'onpageload');\r
+\r
+                               // Verify that it's a valid browser\r
+                               if (s.browsers) {\r
+                                       l = false;\r
+\r
+                                       each(explode(s.browsers), function(v) {\r
+                                               switch (v) {\r
+                                                       case 'ie':\r
+                                                       case 'msie':\r
+                                                               if (tinymce.isIE)\r
+                                                                       l = true;\r
+                                                               break;\r
+\r
+                                                       case 'gecko':\r
+                                                               if (tinymce.isGecko)\r
+                                                                       l = true;\r
+                                                               break;\r
+\r
+                                                       case 'safari':\r
+                                                       case 'webkit':\r
+                                                               if (tinymce.isWebKit)\r
+                                                                       l = true;\r
+                                                               break;\r
+\r
+                                                       case 'opera':\r
+                                                               if (tinymce.isOpera)\r
+                                                                       l = true;\r
+\r
+                                                               break;\r
+                                               }\r
+                                       });\r
+\r
+                                       // Not a valid one\r
+                                       if (!l)\r
+                                               return;\r
+                               }\r
+\r
+                               switch (s.mode) {\r
+                                       case "exact":\r
+                                               l = s.elements || '';\r
+\r
+                                               if(l.length > 0) {\r
+                                                       each(explode(l), function(v) {\r
+                                                               if (DOM.get(v))\r
+                                                                       new tinymce.Editor(v, s).render(1);\r
+                                                               else {\r
+                                                                       c = 0;\r
+\r
+                                                                       each(document.forms, function(f) {\r
+                                                                               each(f.elements, function(e) {\r
+                                                                                       if (e.name === v) {\r
+                                                                                               v = 'mce_editor_' + c;\r
+                                                                                               DOM.setAttrib(e, 'id', v);\r
+                                                                                               new tinymce.Editor(v, s).render(1);\r
+                                                                                       }\r
+                                                                               });\r
+                                                                       });\r
+                                                               }\r
+                                                       });\r
+                                               }\r
+                                               break;\r
+\r
+                                       case "textareas":\r
+                                       case "specific_textareas":\r
+                                               function hasClass(n, c) {\r
+                                                       return new RegExp('\\b' + c + '\\b', 'g').test(n.className);\r
+                                               };\r
+\r
+                                               each(DOM.select('textarea'), function(v) {\r
+                                                       if (s.editor_deselector && hasClass(v, s.editor_deselector))\r
+                                                               return;\r
+\r
+                                                       if (!s.editor_selector || hasClass(v, s.editor_selector)) {\r
+                                                               v.id = v.id || v.name;\r
+\r
+                                                               // Generate unique name if missing or already exists\r
+                                                               if (!v.id || t.get(v.id))\r
+                                                                       v.id = DOM.uniqueId();\r
+\r
+                                                               new tinymce.Editor(v.id, s).render(1);\r
+                                                       }\r
+                                               });\r
+                                               break;\r
+                               }\r
+\r
+                               // Call onInit when all editors are initialized\r
+                               if (s.oninit) {\r
+                                       l = co = 0;\r
+\r
+                                       each (t.editors, function(ed) {\r
+                                               co++;\r
+\r
+                                               if (!ed.initialized) {\r
+                                                       // Wait for it\r
+                                                       ed.onInit.add(function() {\r
+                                                               l++;\r
+\r
+                                                               // All done\r
+                                                               if (l == co)\r
+                                                                       execCallback(s, 'oninit');\r
+                                                       });\r
+                                               } else\r
+                                                       l++;\r
+\r
+                                               // All done\r
+                                               if (l == co)\r
+                                                       execCallback(s, 'oninit');                                      \r
+                                       });\r
+                               }\r
+                       });\r
+               },\r
+\r
+               get : function(id) {\r
+                       return this.editors[id];\r
+               },\r
+\r
+               getInstanceById : function(id) {\r
+                       return this.get(id);\r
+               },\r
+\r
+               add : function(e) {\r
+                       this.editors[e.id] = e;\r
+                       this._setActive(e);\r
+\r
+                       return e;\r
+               },\r
+\r
+               remove : function(e) {\r
+                       var t = this;\r
+\r
+                       // Not in the collection\r
+                       if (!t.editors[e.id])\r
+                               return null;\r
+\r
+                       delete t.editors[e.id];\r
+\r
+                       // Select another editor since the active one was removed\r
+                       if (t.activeEditor == e) {\r
+                               each(t.editors, function(e) {\r
+                                       t._setActive(e);\r
+                                       return false; // Break\r
+                               });\r
+                       }\r
+\r
+                       e.destroy();\r
+\r
+                       return e;\r
+               },\r
+\r
+               execCommand : function(c, u, v) {\r
+                       var t = this, ed = t.get(v), w;\r
+\r
+                       // Manager commands\r
+                       switch (c) {\r
+                               case "mceFocus":\r
+                                       ed.focus();\r
+                                       return true;\r
+\r
+                               case "mceAddEditor":\r
+                               case "mceAddControl":\r
+                                       new tinymce.Editor(v, t.settings).render();\r
+                                       return true;\r
+\r
+                               case "mceAddFrameControl":\r
+                                       w = v.window;\r
+\r
+                                       // Add tinyMCE global instance and tinymce namespace to specified window\r
+                                       w.tinyMCE = tinyMCE;\r
+                                       w.tinymce = tinymce;\r
+\r
+                                       tinymce.DOM.doc = w.document;\r
+                                       tinymce.DOM.win = w;\r
+\r
+                                       ed = new tinymce.Editor(v.element_id, v);\r
+                                       ed.render();\r
+\r
+                                       // Fix IE memory leaks\r
+                                       if (tinymce.isIE) {\r
+                                               function clr() {\r
+                                                       ed.destroy();\r
+                                                       w.detachEvent('onunload', clr);\r
+                                                       w = w.tinyMCE = w.tinymce = null; // IE leak\r
+                                               };\r
+\r
+                                               w.attachEvent('onunload', clr);\r
+                                       }\r
+\r
+                                       v.page_window = null;\r
+\r
+                                       return true;\r
+\r
+                               case "mceRemoveEditor":\r
+                               case "mceRemoveControl":\r
+                                       ed.remove();\r
+                                       return true;\r
+\r
+                               case 'mceToggleEditor':\r
+                                       if (!ed) {\r
+                                               t.execCommand('mceAddControl', 0, v);\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (ed.isHidden())\r
+                                               ed.show();\r
+                                       else\r
+                                               ed.hide();\r
+\r
+                                       return true;\r
+                       }\r
+\r
+                       // Run command on active editor\r
+                       if (t.activeEditor)\r
+                               return t.activeEditor.execCommand(c, u, v);\r
+\r
+                       return false;\r
+               },\r
+\r
+               execInstanceCommand : function(id, c, u, v) {\r
+                       var ed = this.get(id);\r
+\r
+                       if (ed)\r
+                               return ed.execCommand(c, u, v);\r
+\r
+                       return false;\r
+               },\r
+\r
+               triggerSave : function() {\r
+                       each(this.editors, function(e) {\r
+                               e.save();\r
+                       });\r
+               },\r
+\r
+               addI18n : function(p, o) {\r
+                       var lo, i18n = this.i18n;\r
+\r
+                       if (!tinymce.is(p, 'string')) {\r
+                               each(p, function(o, lc) {\r
+                                       each(o, function(o, g) {\r
+                                               each(o, function(o, k) {\r
+                                                       if (g === 'common')\r
+                                                               i18n[lc + '.' + k] = o;\r
+                                                       else\r
+                                                               i18n[lc + '.' + g + '.' + k] = o;\r
+                                               });\r
+                                       });\r
+                               });\r
+                       } else {\r
+                               each(o, function(o, k) {\r
+                                       i18n[p + '.' + k] = o;\r
+                               });\r
+                       }\r
+               },\r
+\r
+               // Private methods\r
+\r
+               _setActive : function(e) {\r
+                       this.selectedInstance = this.activeEditor = e;\r
+               }\r
+\r
+               });\r
+\r
+       tinymce.EditorManager.preInit();\r
+})();\r
+\r
+// Short for editor manager window.tinyMCE is needed when TinyMCE gets loaded though a XHR call\r
+var tinyMCE = window.tinyMCE = tinymce.EditorManager;\r
+\r
+/* file:jscripts/tiny_mce/classes/Editor.js */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, Dispatcher = tinymce.util.Dispatcher;\r
+       var each = tinymce.each, isGecko = tinymce.isGecko, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit;\r
+       var is = tinymce.is, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, EditorManager = tinymce.EditorManager;\r
+       var inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode;\r
+\r
+       tinymce.create('tinymce.Editor', {\r
+               Editor : function(id, s) {\r
+                       var t = this;\r
+\r
+                       t.id = t.editorId = id;\r
+                       t.execCommands = {};\r
+                       t.queryStateCommands = {};\r
+                       t.queryValueCommands = {};\r
+                       t.plugins = {};\r
+\r
+                       // Add events to the editor\r
+                       each([\r
+                               'onPreInit',\r
+                               'onBeforeRenderUI',\r
+                               'onPostRender',\r
+                               'onInit',\r
+                               'onRemove',\r
+                               'onActivate',\r
+                               'onDeactivate',\r
+                               'onClick',\r
+                               'onEvent',\r
+                               'onMouseUp',\r
+                               'onMouseDown',\r
+                               'onDblClick',\r
+                               'onKeyDown',\r
+                               'onKeyUp',\r
+                               'onKeyPress',\r
+                               'onContextMenu',\r
+                               'onSubmit',\r
+                               'onReset',\r
+                               'onPaste',\r
+                               'onPreProcess',\r
+                               'onPostProcess',\r
+                               'onBeforeSetContent',\r
+                               'onBeforeGetContent',\r
+                               'onSetContent',\r
+                               'onGetContent',\r
+                               'onLoadContent',\r
+                               'onSaveContent',\r
+                               'onNodeChange',\r
+                               'onChange',\r
+                               'onBeforeExecCommand',\r
+                               'onExecCommand',\r
+                               'onUndo',\r
+                               'onRedo',\r
+                               'onVisualAid',\r
+                               'onSetProgressState'\r
+                       ], function(e) {\r
+                               t[e] = new Dispatcher(t);\r
+                       });\r
+\r
+                       // Default editor config\r
+                       t.settings = s = extend({\r
+                               id : id,\r
+                               language : 'en',\r
+                               docs_language : 'en',\r
+                               theme : 'simple',\r
+                               skin : 'default',\r
+                               delta_width : 0,\r
+                               delta_height : 0,\r
+                               popup_css : '',\r
+                               plugins : '',\r
+                               document_base_url : tinymce.documentBaseURL,\r
+                               add_form_submit_trigger : 1,\r
+                               submit_patch : 1,\r
+                               add_unload_trigger : 1,\r
+                               convert_urls : 1,\r
+                               relative_urls : 1,\r
+                               remove_script_host : 1,\r
+                               table_inline_editing : 0,\r
+                               object_resizing : 1,\r
+                               cleanup : 1,\r
+                               accessibility_focus : 1,\r
+                               custom_shortcuts : 1,\r
+                               custom_undo_redo_keyboard_shortcuts : 1,\r
+                               custom_undo_redo_restore_selection : 1,\r
+                               custom_undo_redo : 1,\r
+                               doctype : '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',\r
+                               visual_table_class : 'mceItemTable',\r
+                               visual : 1,\r
+                               inline_styles : true,\r
+                               convert_fonts_to_spans : true,\r
+                               font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large',\r
+                               apply_source_formatting : 1,\r
+                               directionality : 'ltr',\r
+                               forced_root_block : 'p',\r
+                               valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',\r
+                               hidden_input : 1,\r
+                               padd_empty_editor : 1,\r
+                               render_ui : 1,\r
+                               init_theme : 1,\r
+                               force_p_newlines : 1,\r
+                               indentation : '30px'\r
+                       }, s);\r
+\r
+                       // Setup URIs\r
+                       t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, {\r
+                               base_uri : tinyMCE.baseURI\r
+                       });\r
+                       t.baseURI = EditorManager.baseURI;\r
+\r
+                       // Call setup\r
+                       t.execCallback('setup', t);\r
+               },\r
+\r
+               render : function(nst) {\r
+                       var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader;\r
+\r
+                       // Page is not loaded yet, wait for it\r
+                       if (!Event.domLoaded) {\r
+                               Event.add(document, 'init', function() {\r
+                                       t.render();\r
+                               });\r
+                               return;\r
+                       }\r
+\r
+                       // Force strict loading mode if render us called by user and not internally\r
+                       if (!nst) {\r
+                               s.strict_loading_mode = 1;\r
+                               tinyMCE.settings = s;\r
+                       }\r
+\r
+                       // Element not found, then skip initialization\r
+                       if (!t.getElement())\r
+                               return;\r
+\r
+                       if (s.strict_loading_mode) {\r
+                               sl.settings.strict_mode = s.strict_loading_mode;\r
+                               tinymce.DOM.settings.strict = 1;\r
+                       }\r
+\r
+                       // Add hidden input for non input elements inside form elements\r
+                       if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form'))\r
+                               DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id);\r
+\r
+                       t.windowManager = new tinymce.WindowManager(t);\r
+\r
+                       if (s.encoding == 'xml') {\r
+                               t.onGetContent.add(function(ed, o) {\r
+                                       if (o.get)\r
+                                               o.content = DOM.encode(o.content);\r
+                               });\r
+                       }\r
+\r
+                       if (s.add_form_submit_trigger) {\r
+                               t.onSubmit.addToTop(function() {\r
+                                       if (t.initialized) {\r
+                                               t.save();\r
+                                               t.isNotDirty = 1;\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       if (s.add_unload_trigger) {\r
+                               t._beforeUnload = tinyMCE.onBeforeUnload.add(function() {\r
+                                       if (t.initialized && !t.destroyed)\r
+                                               t.save({format : 'raw', no_events : true});\r
+                               });\r
+                       }\r
+\r
+                       tinymce.addUnload(t.destroy, t);\r
+\r
+                       if (s.submit_patch) {\r
+                               t.onBeforeRenderUI.add(function() {\r
+                                       var n = t.getElement().form;\r
+\r
+                                       if (!n)\r
+                                               return;\r
+\r
+                                       // Already patched\r
+                                       if (n._mceOldSubmit)\r
+                                               return;\r
+\r
+                                       // Check page uses id="submit" or name="submit" for it's submit button\r
+                                       if (!n.submit.nodeType && !n.submit.length) {\r
+                                               t.formElement = n;\r
+                                               n._mceOldSubmit = n.submit;\r
+                                               n.submit = function() {\r
+                                                       // Save all instances\r
+                                                       EditorManager.triggerSave();\r
+                                                       t.isNotDirty = 1;\r
+\r
+                                                       return this._mceOldSubmit(this);\r
+                                               };\r
+                                       }\r
+\r
+                                       n = null;\r
+                               });\r
+                       }\r
+\r
+                       // Load scripts\r
+                       function loadScripts() {\r
+                               if (s.language)\r
+                                       sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');\r
+\r
+                               if (s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme])\r
+                                       ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js');\r
+\r
+                               each(explode(s.plugins), function(p) {\r
+                                       if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) {\r
+                                               // Skip safari plugin for other browsers\r
+                                               if (!isWebKit && p == 'safari')\r
+                                                       return;\r
+\r
+                                               PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js');\r
+                                       }\r
+                               });\r
+\r
+                               // Init when que is loaded\r
+                               sl.loadQueue(function() {\r
+                                       if (s.ask) {\r
+                                               function ask() {\r
+                                                       t.windowManager.confirm(t.getLang('edit_confirm'), function(s) {\r
+                                                               if (s)\r
+                                                                       t.init();\r
+                                                               else\r
+                                                                       Event.remove(t.id, 'focus', ask);\r
+                                                       });\r
+                                               };\r
+\r
+                                               Event.add(t.id, 'focus', ask);\r
+                                               return;\r
+                                       }\r
+\r
+                                       if (!t.removed)\r
+                                               t.init();\r
+                               });\r
+                       };\r
+\r
+                       // Load compat2x first\r
+                       if (s.plugins.indexOf('compat2x') != -1) {\r
+                               PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');\r
+                               sl.loadQueue(loadScripts);\r
+                       } else\r
+                               loadScripts();\r
+               },\r
+\r
+               init : function() {\r
+                       var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re;\r
+\r
+                       EditorManager.add(t);\r
+\r
+                       // Create theme\r
+                       s.theme = s.theme.replace(/-/, '');\r
+                       o = ThemeManager.get(s.theme);\r
+                       t.theme = new o();\r
+\r
+                       if (t.theme.init && s.init_theme)\r
+                               t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, ''));\r
+\r
+                       // Create all plugins\r
+                       each(explode(s.plugins.replace(/\-/g, '')), function(p) {\r
+                               var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po;\r
+\r
+                               if (c) {\r
+                                       po = new c(t, u);\r
+\r
+                                       t.plugins[p] = po;\r
+\r
+                                       if (po.init)\r
+                                               po.init(t, u);\r
+                               }\r
+                       });\r
+\r
+                       // Setup popup CSS path(s)\r
+                       if (s.popup_css)\r
+                               s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css);\r
+                       else\r
+                               s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css");\r
+\r
+                       if (s.popup_css_add)\r
+                               s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add);\r
+\r
+                       // Setup control factory\r
+                       t.controlManager = new tinymce.ControlManager(t);\r
+                       t.undoManager = new tinymce.UndoManager(t);\r
+\r
+                       // Pass through\r
+                       t.undoManager.onAdd.add(function(um, l) {\r
+                               return t.onChange.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.undoManager.onUndo.add(function(um, l) {\r
+                               return t.onUndo.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.undoManager.onRedo.add(function(um, l) {\r
+                               return t.onRedo.dispatch(t, l, um);\r
+                       });\r
+\r
+                       if (s.custom_undo_redo) {\r
+                               t.onExecCommand.add(function(ed, cmd, ui, val, a) {\r
+                                       if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo))\r
+                                               t.undoManager.add();\r
+                               });\r
+                       }\r
+\r
+                       t.onExecCommand.add(function(ed, c) {\r
+                               // Don't refresh the select lists until caret move\r
+                               if (!/^(FontName|FontSize)$/.test(c))\r
+                                       t.nodeChanged();\r
+                       });\r
+\r
+                       // Remove ghost selections on images and tables in Gecko\r
+                       if (isGecko) {\r
+                               function repaint(a, o) {\r
+                                       if (!o || !o.initial)\r
+                                               t.execCommand('mceRepaint');\r
+                               };\r
+\r
+                               t.onUndo.add(repaint);\r
+                               t.onRedo.add(repaint);\r
+                               t.onSetContent.add(repaint);\r
+                       }\r
+\r
+                       // Enables users to override the control factory\r
+                       t.onBeforeRenderUI.dispatch(t, t.controlManager);\r
+\r
+                       // Measure box\r
+                       if (s.render_ui) {\r
+                               w = s.width || e.style.width || e.clientWidth;\r
+                               h = s.height || e.style.height || e.clientHeight;\r
+                               t.orgDisplay = e.style.display;\r
+                               re = /^[0-9\.]+(|px)$/i;\r
+\r
+                               if (re.test('' + w))\r
+                                       w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100);\r
+\r
+                               if (re.test('' + h))\r
+                                       h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100);\r
+\r
+                               // Render UI\r
+                               o = t.theme.renderUI({\r
+                                       targetNode : e,\r
+                                       width : w,\r
+                                       height : h,\r
+                                       deltaWidth : s.delta_width,\r
+                                       deltaHeight : s.delta_height\r
+                               });\r
+\r
+                               t.editorContainer = o.editorContainer;\r
+                       }\r
+\r
+                       \r
+                       // Resize editor\r
+                       DOM.setStyles(o.sizeContainer || o.editorContainer, {\r
+                               width : w,\r
+                               height : h\r
+                       });\r
+\r
+                       h = (o.iframeHeight || h) + ((h + '').indexOf('%') == -1 ? (o.deltaHeight || 0) : '');\r
+                       if (h < 100)\r
+                               h = 100;\r
+\r
+                       t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + t.documentBaseURI.getURI() + '"></base>';\r
+                       t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';\r
+\r
+                       if (tinymce.relaxedDomain)\r
+                               t.iframeHTML += '<script type="text/javascript">document.domain = "' + tinymce.relaxedDomain + '";</script>';\r
+\r
+                       bi = s.body_id || 'tinymce';\r
+                       if (bi.indexOf('=') != -1) {\r
+                               bi = t.getParam('body_id', '', 'hash');\r
+                               bi = bi[t.id] || bi;\r
+                       }\r
+\r
+                       bc = s.body_class || '';\r
+                       if (bc.indexOf('=') != -1) {\r
+                               bc = t.getParam('body_class', '', 'hash');\r
+                               bc = bc[t.id] || '';\r
+                       }\r
+\r
+                       t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>';\r
+\r
+                       // Domain relaxing enabled, then set document domain\r
+                       if (tinymce.relaxedDomain) {\r
+                               // We need to write the contents here in IE since multiple writes messes up refresh button and back button\r
+                               if (isIE)\r
+                                       u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';\r
+                               else if (tinymce.isOpera)\r
+                                       u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()';                                  \r
+                       }\r
+\r
+                       // Create iframe\r
+                       n = DOM.add(o.iframeContainer, 'iframe', {\r
+                               id : t.id + "_ifr",\r
+                               src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7\r
+                               frameBorder : '0',\r
+                               style : {\r
+                                       width : '100%',\r
+                                       height : h\r
+                               }\r
+                       });\r
+\r
+                       t.contentAreaContainer = o.iframeContainer;\r
+                       DOM.get(o.editorContainer).style.display = t.orgDisplay;\r
+                       DOM.get(t.id).style.display = 'none';\r
+\r
+                       // Safari 2.x requires us to wait for the load event and load a real HTML doc\r
+                       if (tinymce.isOldWebKit) {\r
+                               Event.add(n, 'load', t.setupIframe, t);\r
+                               n.src = tinymce.baseURL + '/plugins/safari/blank.htm';\r
+                       } else {\r
+                               if (!isIE || !tinymce.relaxedDomain)\r
+                                       t.setupIframe();\r
+\r
+                               e = n = o = null; // Cleanup\r
+                       }\r
+               },\r
+\r
+               setupIframe : function() {\r
+                       var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b;\r
+\r
+                       // Setup iframe body\r
+                       if (!isIE || !tinymce.relaxedDomain) {\r
+                               d.open();\r
+                               d.write(t.iframeHTML);\r
+                               d.close();\r
+                       }\r
+\r
+                       // Design mode needs to be added here Ctrl+A will fail otherwise\r
+                       if (!isIE) {\r
+                               try {\r
+                                       d.designMode = 'On';\r
+                               } catch (ex) {\r
+                                       // Will fail on Gecko if the editor is placed in an hidden container element\r
+                                       // The design mode will be set ones the editor is focused\r
+                               }\r
+                       }\r
+\r
+                       // IE needs to use contentEditable or it will display non secure items for HTTPS\r
+                       if (isIE) {\r
+                               // It will not steal focus if we hide it while setting contentEditable\r
+                               b = t.getBody();\r
+                               DOM.hide(b);\r
+                               b.contentEditable = true;\r
+                               DOM.show(b);\r
+                       }\r
+\r
+                       // Setup objects\r
+                       t.dom = new tinymce.DOM.DOMUtils(t.getDoc(), {\r
+                               keep_values : true,\r
+                               url_converter : t.convertURL,\r
+                               url_converter_scope : t,\r
+                               hex_colors : s.force_hex_style_colors,\r
+                               class_filter : s.class_filter,\r
+                               update_styles : 1,\r
+                               fix_ie_paragraphs : 1\r
+                       });\r
+\r
+                       t.serializer = new tinymce.dom.Serializer({\r
+                               entity_encoding : s.entity_encoding,\r
+                               entities : s.entities,\r
+                               valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements,\r
+                               extended_valid_elements : s.extended_valid_elements,\r
+                               valid_child_elements : s.valid_child_elements,\r
+                               invalid_elements : s.invalid_elements,\r
+                               fix_table_elements : s.fix_table_elements,\r
+                               fix_list_elements : s.fix_list_elements,\r
+                               fix_content_duplication : s.fix_content_duplication,\r
+                               convert_fonts_to_spans : s.convert_fonts_to_spans,\r
+                               font_size_classes  : s.font_size_classes,\r
+                               font_size_style_values : s.font_size_style_values,\r
+                               apply_source_formatting : s.apply_source_formatting,\r
+                               remove_linebreaks : s.remove_linebreaks,\r
+                               dom : t.dom\r
+                       });\r
+\r
+                       t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer);\r
+                       t.forceBlocks = new tinymce.ForceBlocks(t, {\r
+                               forced_root_block : s.forced_root_block\r
+                       });\r
+                       t.editorCommands = new tinymce.EditorCommands(t);\r
+\r
+                       // Pass through\r
+                       t.serializer.onPreProcess.add(function(se, o) {\r
+                               return t.onPreProcess.dispatch(t, o, se);\r
+                       });\r
+\r
+                       t.serializer.onPostProcess.add(function(se, o) {\r
+                               return t.onPostProcess.dispatch(t, o, se);\r
+                       });\r
+\r
+                       t.onPreInit.dispatch(t);\r
+\r
+                       if (!s.gecko_spellcheck)\r
+                               t.getBody().spellcheck = 0;\r
+\r
+                       t._addEvents();\r
+\r
+                       t.controlManager.onPostRender.dispatch(t, t.controlManager);\r
+                       t.onPostRender.dispatch(t);\r
+\r
+                       if (s.directionality)\r
+                               t.getBody().dir = s.directionality;\r
+\r
+                       if (s.nowrap)\r
+                               t.getBody().style.whiteSpace = "nowrap";\r
+\r
+                       if (s.auto_resize)\r
+                               t.onNodeChange.add(t.resizeToContent, t);\r
+\r
+                       if (s.custom_elements) {\r
+                               function handleCustom(ed, o) {\r
+                                       each(explode(s.custom_elements), function(v) {\r
+                                               var n;\r
+\r
+                                               if (v.indexOf('~') === 0) {\r
+                                                       v = v.substring(1);\r
+                                                       n = 'span';\r
+                                               } else\r
+                                                       n = 'div';\r
+\r
+                                               o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' mce_name="$1"$2>');\r
+                                               o.content = o.content.replace(new RegExp('</(' + v + ')>', 'g'), '</' + n + '>');\r
+                                       });\r
+                               };\r
+\r
+                               t.onBeforeSetContent.add(handleCustom);\r
+                               t.onPostProcess.add(function(ed, o) {\r
+                                       if (o.set)\r
+                                               handleCustom(ed, o)\r
+                               });\r
+                       }\r
+\r
+                       if (s.handle_node_change_callback) {\r
+                               t.onNodeChange.add(function(ed, cm, n) {\r
+                                       t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed());\r
+                               });\r
+                       }\r
+\r
+                       if (s.save_callback) {\r
+                               t.onSaveContent.add(function(ed, o) {\r
+                                       var h = t.execCallback('save_callback', t.id, o.content, t.getBody());\r
+\r
+                                       if (h)\r
+                                               o.content = h;\r
+                               });\r
+                       }\r
+\r
+                       if (s.onchange_callback) {\r
+                               t.onChange.add(function(ed, l) {\r
+                                       t.execCallback('onchange_callback', t, l);\r
+                               });\r
+                       }\r
+\r
+                       if (s.convert_newlines_to_brs) {\r
+                               t.onBeforeSetContent.add(function(ed, o) {\r
+                                       if (o.initial)\r
+                                               o.content = o.content.replace(/\r?\n/g, '<br />');\r
+                               });\r
+                       }\r
+\r
+                       if (s.fix_nesting && isIE) {\r
+                               t.onBeforeSetContent.add(function(ed, o) {\r
+                                       o.content = t._fixNesting(o.content);\r
+                               });\r
+                       }\r
+\r
+                       if (s.preformatted) {\r
+                               t.onPostProcess.add(function(ed, o) {\r
+                                       o.content = o.content.replace(/^\s*<pre.*?>/, '');\r
+                                       o.content = o.content.replace(/<\/pre>\s*$/, '');\r
+\r
+                                       if (o.set)\r
+                                               o.content = '<pre class="mceItemHidden">' + o.content + '</pre>';\r
+                               });\r
+                       }\r
+\r
+                       if (s.verify_css_classes) {\r
+                               t.serializer.attribValueFilter = function(n, v) {\r
+                                       var s, cl;\r
+\r
+                                       if (n == 'class') {\r
+                                               // Build regexp for classes\r
+                                               if (!t.classesRE) {\r
+                                                       cl = t.dom.getClasses();\r
+\r
+                                                       if (cl.length > 0) {\r
+                                                               s = '';\r
+\r
+                                                               each (cl, function(o) {\r
+                                                                       s += (s ? '|' : '') + o['class'];\r
+                                                               });\r
+\r
+                                                               t.classesRE = new RegExp('(' + s + ')', 'gi');\r
+                                                       }\r
+                                               }\r
+\r
+                                               return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : '';\r
+                                       }\r
+\r
+                                       return v;\r
+                               };\r
+                       }\r
+\r
+                       if (s.convert_fonts_to_spans)\r
+                               t._convertFonts();\r
+\r
+                       if (s.inline_styles)\r
+                               t._convertInlineElements();\r
+\r
+                       if (s.cleanup_callback) {\r
+                               t.onBeforeSetContent.add(function(ed, o) {\r
+                                       o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);\r
+                               });\r
+\r
+                               t.onPreProcess.add(function(ed, o) {\r
+                                       if (o.set)\r
+                                               t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o);\r
+\r
+                                       if (o.get)\r
+                                               t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o);\r
+                               });\r
+\r
+                               t.onPostProcess.add(function(ed, o) {\r
+                                       if (o.set)\r
+                                               o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);\r
+\r
+                                       if (o.get)                                              \r
+                                               o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o);\r
+                               });\r
+                       }\r
+\r
+                       if (s.save_callback) {\r
+                               t.onGetContent.add(function(ed, o) {\r
+                                       if (o.save)\r
+                                               o.content = t.execCallback('save_callback', t.id, o.content, t.getBody());\r
+                               });\r
+                       }\r
+\r
+                       if (s.handle_event_callback) {\r
+                               t.onEvent.add(function(ed, e, o) {\r
+                                       if (t.execCallback('handle_event_callback', e, ed, o) === false)\r
+                                               Event.cancel(e);\r
+                               });\r
+                       }\r
+\r
+                       t.onSetContent.add(function() {\r
+                               // Safari needs some time, it will crash the browser when a link is created otherwise\r
+                               // I think this crash issue is resolved in the latest 3.0.4\r
+                               //window.setTimeout(function() {\r
+                                       t.addVisual(t.getBody());\r
+                               //}, 1);\r
+                       });\r
+\r
+                       // Remove empty contents\r
+                       if (s.padd_empty_editor) {\r
+                               t.onPostProcess.add(function(ed, o) {\r
+                                       o.content = o.content.replace(/^<p>(&nbsp;|#160;|\s|\u00a0)<\/p>$/, '');\r
+                               });\r
+                       }\r
+\r
+                       if (isGecko) {\r
+                               try {\r
+                                       // Design mode must be set here once again to fix a bug where\r
+                                       // Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again\r
+                                       d.designMode = 'Off';\r
+                                       d.designMode = 'On';\r
+                               } catch (ex) {\r
+                                       // Will fail on Gecko if the editor is placed in an hidden container element\r
+                                       // The design mode will be set ones the editor is focused\r
+                               }\r
+                       }\r
+\r
+                       // A small timeout was needed since firefox will remove. Bug: #1838304\r
+                       setTimeout(function () {\r
+                               if (t.removed)\r
+                                       return;\r
+\r
+                               t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')});\r
+                               t.startContent = t.getContent({format : 'raw'});\r
+                               t.undoManager.add({initial : true});\r
+                               t.initialized = true;\r
+\r
+                               t.onInit.dispatch(t);\r
+                               t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc());\r
+                               t.execCallback('init_instance_callback', t);\r
+                               t.focus(true);\r
+                               t.nodeChanged({initial : 1});\r
+\r
+                               // Load specified content CSS last\r
+                               if (s.content_css) {\r
+                                       tinymce.each(explode(s.content_css), function(u) {\r
+                                               t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));\r
+                                       });\r
+                               }\r
+\r
+                               // Handle auto focus\r
+                               if (s.auto_focus) {\r
+                                       setTimeout(function () {\r
+                                               var ed = EditorManager.get(s.auto_focus);\r
+\r
+                                               ed.selection.select(ed.getBody(), 1);\r
+                                               ed.selection.collapse(1);\r
+                                               ed.getWin().focus();\r
+                                       }, 100);\r
+                               }\r
+                       }, 1);\r
+       \r
+                       e = null;\r
+               },\r
+\r
+               \r
+               focus : function(sf) {\r
+                       var oed, t = this;\r
+\r
+                       if (!sf) {\r
+                               t.getWin().focus();\r
+\r
+                                                       }\r
+\r
+                       if (EditorManager.activeEditor != t) {\r
+                               if ((oed = EditorManager.activeEditor) != null)\r
+                                       oed.onDeactivate.dispatch(oed, t);\r
+\r
+                               t.onActivate.dispatch(t, oed);\r
+                       }\r
+\r
+                       EditorManager._setActive(t);\r
+               },\r
+\r
+               execCallback : function(n) {\r
+                       var t = this, f = t.settings[n], s;\r
+\r
+                       if (!f)\r
+                               return;\r
+\r
+                       // Look through lookup\r
+                       if (t.callbackLookup && (s = t.callbackLookup[n])) {\r
+                               f = s.func;\r
+                               s = s.scope;\r
+                       }\r
+\r
+                       if (is(f, 'string')) {\r
+                               s = f.replace(/\.\w+$/, '');\r
+                               s = s ? tinymce.resolve(s) : 0;\r
+                               f = tinymce.resolve(f);\r
+                               t.callbackLookup = t.callbackLookup || {};\r
+                               t.callbackLookup[n] = {func : f, scope : s};\r
+                       }\r
+\r
+                       return f.apply(s || t, Array.prototype.slice.call(arguments, 1));\r
+               },\r
+\r
+               translate : function(s) {\r
+                       var c = this.settings.language, i18n = EditorManager.i18n;\r
+\r
+                       if (!s)\r
+                               return '';\r
+\r
+                       return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {\r
+                               return i18n[c + '.' + b] || '{#' + b + '}';\r
+                       });\r
+               },\r
+\r
+               getLang : function(n, dv) {\r
+                       return EditorManager.i18n[this.settings.language + '.' + n] || (is(dv) ? dv : '{#' + n + '}');\r
+               },\r
+\r
+               getParam : function(n, dv, ty) {\r
+                       var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o;\r
+\r
+                       if (ty === 'hash') {\r
+                               o = {};\r
+\r
+                               if (is(v, 'string')) {\r
+                                       each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) {\r
+                                               v = v.split('=');\r
+\r
+                                               if (v.length > 1)\r
+                                                       o[tr(v[0])] = tr(v[1]);\r
+                                               else\r
+                                                       o[tr(v[0])] = tr(v);\r
+                                       });\r
+                               } else\r
+                                       o = v;\r
+\r
+                               return o;\r
+                       }\r
+\r
+                       return v;\r
+               },\r
+\r
+               nodeChanged : function(o) {\r
+                       var t = this, s = t.selection, n = s.getNode() || t.getBody();\r
+\r
+                       // Fix for bug #1896577 it seems that this can not be fired while the editor is loading\r
+                       if (t.initialized) {\r
+                               t.onNodeChange.dispatch(\r
+                                       t,\r
+                                       o ? o.controlManager || t.controlManager : t.controlManager,\r
+                                       isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n, // Fix for IE initial state\r
+                                       s.isCollapsed(),\r
+                                       o\r
+                               );\r
+                       }\r
+               },\r
+\r
+               addButton : function(n, s) {\r
+                       var t = this;\r
+\r
+                       t.buttons = t.buttons || {};\r
+                       t.buttons[n] = s;\r
+               },\r
+\r
+               addCommand : function(n, f, s) {\r
+                       this.execCommands[n] = {func : f, scope : s || this};\r
+               },\r
+\r
+               addQueryStateHandler : function(n, f, s) {\r
+                       this.queryStateCommands[n] = {func : f, scope : s || this};\r
+               },\r
+\r
+               addQueryValueHandler : function(n, f, s) {\r
+                       this.queryValueCommands[n] = {func : f, scope : s || this};\r
+               },\r
+\r
+               addShortcut : function(pa, desc, cmd_func, sc) {\r
+                       var t = this, c;\r
+\r
+                       if (!t.settings.custom_shortcuts)\r
+                               return false;\r
+\r
+                       t.shortcuts = t.shortcuts || {};\r
+\r
+                       if (is(cmd_func, 'string')) {\r
+                               c = cmd_func;\r
+\r
+                               cmd_func = function() {\r
+                                       t.execCommand(c, false, null);\r
+                               };\r
+                       }\r
+\r
+                       if (is(cmd_func, 'object')) {\r
+                               c = cmd_func;\r
+\r
+                               cmd_func = function() {\r
+                                       t.execCommand(c[0], c[1], c[2]);\r
+                               };\r
+                       }\r
+\r
+                       each(explode(pa), function(pa) {\r
+                               var o = {\r
+                                       func : cmd_func,\r
+                                       scope : sc || this,\r
+                                       desc : desc,\r
+                                       alt : false,\r
+                                       ctrl : false,\r
+                                       shift : false\r
+                               };\r
+\r
+                               each(explode(pa, '+'), function(v) {\r
+                                       switch (v) {\r
+                                               case 'alt':\r
+                                               case 'ctrl':\r
+                                               case 'shift':\r
+                                                       o[v] = true;\r
+                                                       break;\r
+\r
+                                               default:\r
+                                                       o.charCode = v.charCodeAt(0);\r
+                                                       o.keyCode = v.toUpperCase().charCodeAt(0);\r
+                                       }\r
+                               });\r
+\r
+                               t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o;\r
+                       });\r
+\r
+                       return true;\r
+               },\r
+\r
+               execCommand : function(cmd, ui, val, a) {\r
+                       var t = this, s = 0, o;\r
+\r
+                       if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus))\r
+                               t.focus();\r
+\r
+                       o = {};\r
+                       t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o);\r
+                       if (o.terminate)\r
+                               return false;\r
+\r
+                       // Comamnd callback\r
+                       if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) {\r
+                               t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+                               return true;\r
+                       }\r
+\r
+                       // Registred commands\r
+                       if (o = t.execCommands[cmd]) {\r
+                               s = o.func.call(o.scope, ui, val);\r
+                               t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+                               return s;\r
+                       }\r
+\r
+                       // Plugin commands\r
+                       each(t.plugins, function(p) {\r
+                               if (p.execCommand && p.execCommand(cmd, ui, val)) {\r
+                                       t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+                                       s = 1;\r
+                                       return false;\r
+                               }\r
+                       });\r
+\r
+                       if (s)\r
+                               return true;\r
+\r
+                       // Theme commands\r
+                       if (t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) {\r
+                               t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+                               return true;\r
+                       }\r
+\r
+                       // Editor commands\r
+                       if (t.editorCommands.execCommand(cmd, ui, val)) {\r
+                               t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+                               return true;\r
+                       }\r
+\r
+                       // Browser commands\r
+                       t.getDoc().execCommand(cmd, ui, val);\r
+                       t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
+               },\r
+\r
+               queryCommandState : function(c) {\r
+                       var t = this, o;\r
+\r
+                       // Is hidden then return undefined\r
+                       if (t._isHidden())\r
+                               return;\r
+\r
+                       // Registred commands\r
+                       if (o = t.queryStateCommands[c])\r
+                               return o.func.call(o.scope);\r
+\r
+                       // Registred commands\r
+                       o = t.editorCommands.queryCommandState(c);\r
+                       if (o !== -1)\r
+                               return o;\r
+\r
+                       // Browser commands\r
+                       try {\r
+                               return this.getDoc().queryCommandState(c);\r
+                       } catch (ex) {\r
+                               // Fails sometimes see bug: 1896577\r
+                       }\r
+               },\r
+\r
+               queryCommandValue : function(c) {\r
+                       var t = this, o;\r
+\r
+                       // Is hidden then return undefined\r
+                       if (t._isHidden())\r
+                               return;\r
+\r
+                       // Registred commands\r
+                       if (o = t.queryValueCommands[c])\r
+                               return o.func.call(o.scope);\r
+\r
+                       // Registred commands\r
+                       o = t.editorCommands.queryCommandValue(c);\r
+                       if (is(o))\r
+                               return o;\r
+\r
+                       // Browser commands\r
+                       try {\r
+                               return this.getDoc().queryCommandValue(c);\r
+                       } catch (ex) {\r
+                               // Fails sometimes see bug: 1896577\r
+                       }\r
+               },\r
+\r
+               show : function() {\r
+                       var t = this;\r
+\r
+                       DOM.show(t.getContainer());\r
+                       DOM.hide(t.id);\r
+                       t.load();\r
+               },\r
+\r
+               hide : function() {\r
+                       var t = this, d = t.getDoc();\r
+\r
+                       // Fixed bug where IE has a blinking cursor left from the editor\r
+                       if (isIE && d)\r
+                               d.execCommand('SelectAll');\r
+\r
+                       // We must save before we hide so Safari doesn't crash\r
+                       t.save();\r
+                       DOM.hide(t.getContainer());\r
+                       DOM.setStyle(t.id, 'display', t.orgDisplay);\r
+               },\r
+\r
+               isHidden : function() {\r
+                       return !DOM.isHidden(this.id);\r
+               },\r
+\r
+               setProgressState : function(b, ti, o) {\r
+                       this.onSetProgressState.dispatch(this, b, ti, o);\r
+\r
+                       return b;\r
+               },\r
+\r
+               resizeToContent : function() {\r
+                       var t = this;\r
+\r
+                       DOM.setStyle(t.id + "_ifr", 'height', t.getBody().scrollHeight);\r
+               },\r
+\r
+               load : function(o) {\r
+                       var t = this, e = t.getElement(), h;\r
+\r
+                       o = o || {};\r
+                       o.load = true;\r
+\r
+                       h = t.setContent(is(e.value) ? e.value : e.innerHTML, o);\r
+                       o.element = e;\r
+\r
+                       if (!o.no_events)\r
+                               t.onLoadContent.dispatch(t, o);\r
+\r
+                       o.element = e = null;\r
+\r
+                       return h;\r
+               },\r
+\r
+               save : function(o) {\r
+                       var t = this, e = t.getElement(), h, f;\r
+\r
+                       if (!t.initialized)\r
+                               return;\r
+\r
+                       o = o || {};\r
+                       o.save = true;\r
+\r
+                       o.element = e;\r
+                       h = o.content = t.getContent(o);\r
+\r
+                       if (!o.no_events)\r
+                               t.onSaveContent.dispatch(t, o);\r
+\r
+                       h = o.content;\r
+\r
+                       if (!/TEXTAREA|INPUT/i.test(e.nodeName)) {\r
+                               e.innerHTML = h;\r
+\r
+                               // Update hidden form element\r
+                               if (f = DOM.getParent(t.id, 'form')) {\r
+                                       each(f.elements, function(e) {\r
+                                               if (e.name == t.id) {\r
+                                                       e.value = h;\r
+                                                       return false;\r
+                                               }\r
+                                       });\r
+                               }\r
+                       } else\r
+                               e.value = h;\r
+\r
+                       o.element = e = null;\r
+\r
+                       return h;\r
+               },\r
+\r
+               setContent : function(h, o) {\r
+                       var t = this;\r
+\r
+                       o = o || {};\r
+                       o.format = o.format || 'html';\r
+                       o.set = true;\r
+                       o.content = h;\r
+\r
+                       if (!o.no_events)\r
+                               t.onBeforeSetContent.dispatch(t, o);\r
+\r
+                       // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content\r
+                       // It will also be impossible to place the caret in the editor unless there is a BR element present\r
+                       if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) {\r
+                               o.content = t.dom.setHTML(t.getBody(), '<br mce_bogus="1" />', 1);\r
+                               o.format = 'raw';\r
+                       }\r
+\r
+                       o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content));\r
+\r
+                       if (o.format != 'raw' && t.settings.cleanup) {\r
+                               o.getInner = true;\r
+                               o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o));\r
+                       }\r
+\r
+                       if (!o.no_events)\r
+                               t.onSetContent.dispatch(t, o);\r
+\r
+                       return o.content;\r
+               },\r
+\r
+               getContent : function(o) {\r
+                       var t = this, h;\r
+\r
+                       o = o || {};\r
+                       o.format = o.format || 'html';\r
+                       o.get = true;\r
+\r
+                       if (!o.no_events)\r
+                               t.onBeforeGetContent.dispatch(t, o);\r
+\r
+                       if (o.format != 'raw' && t.settings.cleanup) {\r
+                               o.getInner = true;\r
+                               h = t.serializer.serialize(t.getBody(), o);\r
+                       } else\r
+                               h = t.getBody().innerHTML;\r
+\r
+                       h = h.replace(/^\s*|\s*$/g, '');\r
+                       o = {content : h};\r
+                       t.onGetContent.dispatch(t, o);\r
+\r
+                       return o.content;\r
+               },\r
+\r
+               isDirty : function() {\r
+                       var t = this;\r
+\r
+                       return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty;\r
+               },\r
+\r
+               getContainer : function() {\r
+                       var t = this;\r
+\r
+                       if (!t.container)\r
+                               t.container = DOM.get(t.editorContainer || t.id + '_parent');\r
+\r
+                       return t.container;\r
+               },\r
+\r
+               getContentAreaContainer : function() {\r
+                       return this.contentAreaContainer;\r
+               },\r
+\r
+               getElement : function() {\r
+                       return DOM.get(this.settings.content_element || this.id);\r
+               },\r
+\r
+               getWin : function() {\r
+                       var t = this, e;\r
+\r
+                       if (!t.contentWindow) {\r
+                               e = DOM.get(t.id + "_ifr");\r
+\r
+                               if (e)\r
+                                       t.contentWindow = e.contentWindow;\r
+                       }\r
+\r
+                       return t.contentWindow;\r
+               },\r
+\r
+               getDoc : function() {\r
+                       var t = this, w;\r
+\r
+                       if (!t.contentDocument) {\r
+                               w = t.getWin();\r
+\r
+                               if (w)\r
+                                       t.contentDocument = w.document;\r
+                       }\r
+\r
+                       return t.contentDocument;\r
+               },\r
+\r
+               getBody : function() {\r
+                       return this.bodyElement || this.getDoc().body;\r
+               },\r
+\r
+               convertURL : function(u, n, e) {\r
+                       var t = this, s = t.settings;\r
+\r
+                       // Use callback instead\r
+                       if (s.urlconverter_callback)\r
+                               return t.execCallback('urlconverter_callback', u, e, true, n);\r
+\r
+                       // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs\r
+                       if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0)\r
+                               return u;\r
+\r
+                       // Convert to relative\r
+                       if (s.relative_urls)\r
+                               return t.documentBaseURI.toRelative(u);\r
+\r
+                       // Convert to absolute\r
+                       u = t.documentBaseURI.toAbsolute(u, s.remove_script_host);\r
+\r
+                       return u;\r
+               },\r
+\r
+               addVisual : function(e) {\r
+                       var t = this, s = t.settings;\r
+\r
+                       e = e || t.getBody();\r
+\r
+                       if (!is(t.hasVisual))\r
+                               t.hasVisual = s.visual;\r
+\r
+                       each(t.dom.select('table,a', e), function(e) {\r
+                               var v;\r
+\r
+                               switch (e.nodeName) {\r
+                                       case 'TABLE':\r
+                                               v = t.dom.getAttrib(e, 'border');\r
+\r
+                                               if (!v || v == '0') {\r
+                                                       if (t.hasVisual)\r
+                                                               t.dom.addClass(e, s.visual_table_class);\r
+                                                       else\r
+                                                               t.dom.removeClass(e, s.visual_table_class);\r
+                                               }\r
+\r
+                                               return;\r
+\r
+                                       case 'A':\r
+                                               v = t.dom.getAttrib(e, 'name');\r
+\r
+                                               if (v) {\r
+                                                       if (t.hasVisual)\r
+                                                               t.dom.addClass(e, 'mceItemAnchor');\r
+                                                       else\r
+                                                               t.dom.removeClass(e, 'mceItemAnchor');\r
+                                               }\r
+\r
+                                               return;\r
+                               }\r
+                       });\r
+\r
+                       t.onVisualAid.dispatch(t, e, t.hasVisual);\r
+               },\r
+\r
+               remove : function() {\r
+                       var t = this, e = t.getContainer();\r
+\r
+                       t.removed = 1; // Cancels post remove event execution\r
+                       t.hide();\r
+\r
+                       t.execCallback('remove_instance_callback', t);\r
+                       t.onRemove.dispatch(t);\r
+\r
+                       // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command\r
+                       t.onExecCommand.listeners = [];\r
+\r
+                       EditorManager.remove(t);\r
+                       DOM.remove(e);\r
+               },\r
+\r
+               destroy : function(s) {\r
+                       var t = this;\r
+\r
+                       // One time is enough\r
+                       if (t.destroyed)\r
+                               return;\r
+\r
+                       if (!s) {\r
+                               tinymce.removeUnload(t.destroy);\r
+                               tinyMCE.onBeforeUnload.remove(t._beforeUnload);\r
+\r
+                               // Manual destroy\r
+                               if (t.theme.destroy)\r
+                                       t.theme.destroy();\r
+\r
+                               // Destroy controls, selection and dom\r
+                               t.controlManager.destroy();\r
+                               t.selection.destroy();\r
+                               t.dom.destroy();\r
+\r
+                               // Remove all events\r
+                               Event.clear(t.getWin());\r
+                               Event.clear(t.getDoc());\r
+                               Event.clear(t.getBody());\r
+                               Event.clear(t.formElement);\r
+                       }\r
+\r
+                       if (t.formElement) {\r
+                               t.formElement.submit = t.formElement._mceOldSubmit;\r
+                               t.formElement._mceOldSubmit = null;\r
+                       }\r
+\r
+                       t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null;\r
+\r
+                       if (t.selection)\r
+                               t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null;\r
+\r
+                       t.destroyed = 1;\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _addEvents : function() {\r
+                       // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset\r
+                       var t = this, i, s = t.settings, lo = {\r
+                               mouseup : 'onMouseUp',\r
+                               mousedown : 'onMouseDown',\r
+                               click : 'onClick',\r
+                               keyup : 'onKeyUp',\r
+                               keydown : 'onKeyDown',\r
+                               keypress : 'onKeyPress',\r
+                               submit : 'onSubmit',\r
+                               reset : 'onReset',\r
+                               contextmenu : 'onContextMenu',\r
+                               dblclick : 'onDblClick',\r
+                               paste : 'onPaste' // Doesn't work in all browsers yet\r
+                       };\r
+\r
+                       function eventHandler(e, o) {\r
+                               var ty = e.type;\r
+\r
+                               // Don't fire events when it's removed\r
+                               if (t.removed)\r
+                                       return;\r
+\r
+                               // Generic event handler\r
+                               if (t.onEvent.dispatch(t, e, o) !== false) {\r
+                                       // Specific event handler\r
+                                       t[lo[e.fakeType || e.type]].dispatch(t, e, o);\r
+                               }\r
+                       };\r
+\r
+                       // Add DOM events\r
+                       each(lo, function(v, k) {\r
+                               switch (k) {\r
+                                       case 'contextmenu':\r
+                                               if (tinymce.isOpera) {\r
+                                                       // Fake contextmenu on Opera\r
+                                                       Event.add(t.getDoc(), 'mousedown', function(e) {\r
+                                                               if (e.ctrlKey) {\r
+                                                                       e.fakeType = 'contextmenu';\r
+                                                                       eventHandler(e);\r
+                                                               }\r
+                                                       });\r
+                                               } else\r
+                                                       Event.add(t.getDoc(), k, eventHandler);\r
+                                               break;\r
+\r
+                                       case 'paste':\r
+                                               Event.add(t.getBody(), k, function(e) {\r
+                                                       var tx, h, el, r;\r
+\r
+                                                       // Get plain text data\r
+                                                       if (e.clipboardData)\r
+                                                               tx = e.clipboardData.getData('text/plain');\r
+                                                       else if (tinymce.isIE)\r
+                                                               tx = t.getWin().clipboardData.getData('Text');\r
+\r
+                                                       // Get HTML data\r
+                                                       /*if (tinymce.isIE) {\r
+                                                               el = DOM.add(DOM.doc.body, 'div', {style : 'visibility:hidden;overflow:hidden;position:absolute;width:1px;height:1px'});\r
+                                                               r = DOM.doc.body.createTextRange();\r
+                                                               r.moveToElementText(el);\r
+                                                               r.execCommand('Paste');\r
+                                                               h = el.innerHTML;\r
+                                                               DOM.remove(el);\r
+                                                       }*/\r
+\r
+                                                       eventHandler(e, {text : tx, html : h});\r
+                                               });\r
+                                               break;\r
+\r
+                                       case 'submit':\r
+                                       case 'reset':\r
+                                               Event.add(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler);\r
+                                               break;\r
+\r
+                                       default:\r
+                                               Event.add(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler);\r
+                               }\r
+                       });\r
+\r
+                       Event.add(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) {\r
+                               t.focus(true);\r
+                       });\r
+\r
+                       \r
+                       // Fixes bug where a specified document_base_uri could result in broken images\r
+                       // This will also fix drag drop of images in Gecko\r
+                       if (tinymce.isGecko) {\r
+                               // Convert all images to absolute URLs\r
+/*                             t.onSetContent.add(function(ed, o) {\r
+                                       each(ed.dom.select('img'), function(e) {\r
+                                               var v;\r
+\r
+                                               if (v = e.getAttribute('mce_src'))\r
+                                                       e.src = t.documentBaseURI.toAbsolute(v);\r
+                                       })\r
+                               });*/\r
+\r
+                               Event.add(t.getDoc(), 'DOMNodeInserted', function(e) {\r
+                                       var v;\r
+\r
+                                       e = e.target;\r
+\r
+                                       if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('mce_src')))\r
+                                               e.src = t.documentBaseURI.toAbsolute(v);\r
+                               });\r
+                       }\r
+\r
+                       // Set various midas options in Gecko\r
+                       if (isGecko) {\r
+                               function setOpts() {\r
+                                       var t = this, d = t.getDoc(), s = t.settings;\r
+\r
+                                       if (isGecko) {\r
+                                               if (t._isHidden()) {\r
+                                                       try {\r
+                                                               if (!s.content_editable)\r
+                                                                       d.designMode = 'On';\r
+                                                       } catch (ex) {\r
+                                                               // Fails if it's hidden\r
+                                                       }\r
+                                               }\r
+\r
+                                               try {\r
+                                                       // Try new Gecko method\r
+                                                       d.execCommand("styleWithCSS", 0, false);\r
+                                               } catch (ex) {\r
+                                                       // Use old method\r
+                                                       if (!t._isHidden())\r
+                                                               d.execCommand("useCSS", 0, true);\r
+                                               }\r
+\r
+                                               if (!s.table_inline_editing)\r
+                                                       try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {}\r
+\r
+                                               if (!s.object_resizing)\r
+                                                       try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {}\r
+                                       }\r
+                               };\r
+\r
+                               t.onBeforeExecCommand.add(setOpts);\r
+                               t.onMouseDown.add(setOpts);\r
+                       }\r
+\r
+                       // Add node change handlers\r
+                       t.onMouseUp.add(t.nodeChanged);\r
+                       t.onClick.add(t.nodeChanged);\r
+                       t.onKeyUp.add(function(ed, e) {\r
+                               if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.keyCode == 46 || e.keyCode == 8 || e.ctrlKey)\r
+                                       t.nodeChanged();\r
+                       });\r
+\r
+                       // Add reset handler\r
+                       t.onReset.add(function() {\r
+                               t.setContent(t.startContent, {format : 'raw'});\r
+                       });\r
+\r
+                       if (t.getParam('tab_focus')) {\r
+                               function tabCancel(ed, e) {\r
+                                       if (e.keyCode === 9)\r
+                                               return Event.cancel(e);\r
+                               };\r
+\r
+                               function tabHandler(ed, e) {\r
+                                       var x, i, f, el, v;\r
+\r
+                                       function find(d) {\r
+                                               f = DOM.getParent(ed.id, 'form');\r
+                                               el = f.elements;\r
+\r
+                                               if (f) {\r
+                                                       each(el, function(e, i) {\r
+                                                               if (e.id == ed.id) {\r
+                                                                       x = i;\r
+                                                                       return false;\r
+                                                               }\r
+                                                       });\r
+\r
+                                                       if (d > 0) {\r
+                                                               for (i = x + 1; i < el.length; i++) {\r
+                                                                       if (el[i].type != 'hidden')\r
+                                                                               return el[i];\r
+                                                               }\r
+                                                       } else {\r
+                                                               for (i = x - 1; i >= 0; i--) {\r
+                                                                       if (el[i].type != 'hidden')\r
+                                                                               return el[i];\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               return null;\r
+                                       };\r
+\r
+                                       if (e.keyCode === 9) {\r
+                                               v = explode(ed.getParam('tab_focus'));\r
+\r
+                                               if (v.length == 1) {\r
+                                                       v[1] = v[0];\r
+                                                       v[0] = ':prev';\r
+                                               }\r
+\r
+                                               // Find element to focus\r
+                                               if (e.shiftKey) {\r
+                                                       if (v[0] == ':prev')\r
+                                                               el = find(-1);\r
+                                                       else\r
+                                                               el = DOM.get(v[0]);\r
+                                               } else {\r
+                                                       if (v[1] == ':next')\r
+                                                               el = find(1);\r
+                                                       else\r
+                                                               el = DOM.get(v[1]);\r
+                                               }\r
+\r
+                                               if (el) {\r
+                                                       if (ed = EditorManager.get(el.id || el.name))\r
+                                                               ed.focus();\r
+                                                       else\r
+                                                               window.setTimeout(function() {window.focus();el.focus();}, 10);\r
+\r
+                                                       return Event.cancel(e);\r
+                                               }\r
+                                       }\r
+                               };\r
+\r
+                               t.onKeyUp.add(tabCancel);\r
+\r
+                               if (isGecko) {\r
+                                       t.onKeyPress.add(tabHandler);\r
+                                       t.onKeyDown.add(tabCancel);\r
+                               } else\r
+                                       t.onKeyDown.add(tabHandler);\r
+                       }\r
+\r
+                       // Add shortcuts\r
+                       if (s.custom_shortcuts) {\r
+                               if (s.custom_undo_redo_keyboard_shortcuts) {\r
+                                       t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo');\r
+                                       t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo');\r
+                               }\r
+\r
+                               // Add default shortcuts for gecko\r
+                               if (isGecko) {\r
+                                       t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold');\r
+                                       t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic');\r
+                                       t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline');\r
+                               }\r
+\r
+                               // BlockFormat shortcuts keys\r
+                               for (i=1; i<=6; i++)\r
+                                       t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, '<h' + i + '>']);\r
+\r
+                               t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']);\r
+                               t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']);\r
+                               t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']);\r
+\r
+                               function find(e) {\r
+                                       var v = null;\r
+\r
+                                       if (!e.altKey && !e.ctrlKey && !e.metaKey)\r
+                                               return v;\r
+\r
+                                       each(t.shortcuts, function(o) {\r
+                                               if (o.ctrl != e.ctrlKey && (!tinymce.isMac || o.ctrl == e.metaKey))\r
+                                                       return;\r
+\r
+                                               if (o.alt != e.altKey)\r
+                                                       return;\r
+\r
+                                               if (o.shift != e.shiftKey)\r
+                                                       return;\r
+\r
+                                               if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) {\r
+                                                       v = o;\r
+                                                       return false;\r
+                                               }\r
+                                       });\r
+\r
+                                       return v;\r
+                               };\r
+\r
+                               t.onKeyUp.add(function(ed, e) {\r
+                                       var o = find(e);\r
+\r
+                                       if (o)\r
+                                               return Event.cancel(e);\r
+                               });\r
+\r
+                               t.onKeyPress.add(function(ed, e) {\r
+                                       var o = find(e);\r
+\r
+                                       if (o)\r
+                                               return Event.cancel(e);\r
+                               });\r
+\r
+                               t.onKeyDown.add(function(ed, e) {\r
+                                       var o = find(e);\r
+\r
+                                       if (o) {\r
+                                               o.func.call(o.scope);\r
+                                               return Event.cancel(e);\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       if (tinymce.isIE) {\r
+                               // Fix so resize will only update the width and height attributes not the styles of an image\r
+                               // It will also block mceItemNoResize items\r
+                               Event.add(t.getDoc(), 'controlselect', function(e) {\r
+                                       var re = t.resizeInfo, cb;\r
+\r
+                                       e = e.target;\r
+                                       e.removeAttribute('mce_style'); // Remove this one since it might change\r
+\r
+                                       // Don't do this action for non image elements\r
+                                       if (e.nodeName !== 'IMG')\r
+                                               return;\r
+\r
+                                       if (re)\r
+                                               Event.remove(re.node, re.ev, re.cb);\r
+\r
+                                       if (!t.dom.hasClass(e, 'mceItemNoResize')) {\r
+                                               ev = 'resizeend';\r
+                                               cb = Event.add(e, ev, function(e) {\r
+                                                       var v;\r
+\r
+                                                       e = e.target;\r
+\r
+                                                       if (v = t.dom.getStyle(e, 'width')) {\r
+                                                               t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, ''));\r
+                                                               t.dom.setStyle(e, 'width', '');\r
+                                                       }\r
+\r
+                                                       if (v = t.dom.getStyle(e, 'height')) {\r
+                                                               t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, ''));\r
+                                                               t.dom.setStyle(e, 'height', '');\r
+                                                       }\r
+                                               });\r
+                                       } else {\r
+                                               ev = 'resizestart';\r
+                                               cb = Event.add(e, 'resizestart', Event.cancel, Event);\r
+                                       }\r
+\r
+                                       re = t.resizeInfo = {\r
+                                               node : e,\r
+                                               ev : ev,\r
+                                               cb : cb\r
+                                       };\r
+                               });\r
+\r
+                               t.onKeyDown.add(function(ed, e) {\r
+                                       switch (e.keyCode) {\r
+                                               case 8:\r
+                                                       // Fix IE control + backspace browser bug\r
+                                                       if (t.selection.getRng().item) {\r
+                                                               t.selection.getRng().item(0).removeNode();\r
+                                                               return Event.cancel(e);\r
+                                                       }\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       if (tinymce.isOpera) {\r
+                               t.onClick.add(function(ed, e) {\r
+                                       Event.prevent(e);\r
+                               });\r
+                       }\r
+\r
+                       // Add custom undo/redo handlers\r
+                       if (s.custom_undo_redo) {\r
+                               function addUndo() {\r
+                                       t.undoManager.typing = 0;\r
+                                       t.undoManager.add();\r
+                               };\r
+\r
+                               // Add undo level on editor blur\r
+                               if (tinymce.isIE) {\r
+                                       Event.add(t.getWin(), 'blur', function(e) {\r
+                                               var n;\r
+\r
+                                               // Check added for fullscreen bug\r
+                                               if (t.selection) {\r
+                                                       n = t.selection.getNode();\r
+\r
+                                                       // Add undo level is selection was lost to another document\r
+                                                       if (!t.removed && n.ownerDocument && n.ownerDocument != t.getDoc())\r
+                                                               addUndo();\r
+                                               }\r
+                                       });\r
+                               } else {\r
+                                       Event.add(t.getDoc(), 'blur', function() {\r
+                                               if (t.selection && !t.removed)\r
+                                                       addUndo();\r
+                                       });\r
+                               }\r
+\r
+                               t.onMouseDown.add(addUndo);\r
+\r
+                               t.onKeyUp.add(function(ed, e) {\r
+                                       if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) {\r
+                                               t.undoManager.typing = 0;\r
+                                               t.undoManager.add();\r
+                                       }\r
+                               });\r
+\r
+                               t.onKeyDown.add(function(ed, e) {\r
+                                       // Is caracter positon keys\r
+                                       if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) {\r
+                                               if (t.undoManager.typing) {\r
+                                                       t.undoManager.add();\r
+                                                       t.undoManager.typing = 0;\r
+                                               }\r
+\r
+                                               return;\r
+                                       }\r
+\r
+                                       if (!t.undoManager.typing) {\r
+                                               t.undoManager.add();\r
+                                               t.undoManager.typing = 1;\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\r
+               _convertInlineElements : function() {\r
+                       var t = this, s = t.settings, dom = t.dom, v, e, na, st, sp;\r
+\r
+                       function convert(ed, o) {\r
+                               if (!s.inline_styles)\r
+                                       return;\r
+\r
+                               if (o.get) {\r
+                                       each(t.dom.select('table,u,strike', o.node), function(n) {\r
+                                               switch (n.nodeName) {\r
+                                                       case 'TABLE':\r
+                                                               if (v = dom.getAttrib(n, 'height')) {\r
+                                                                       dom.setStyle(n, 'height', v);\r
+                                                                       dom.setAttrib(n, 'height', '');\r
+                                                               }\r
+                                                               break;\r
+\r
+                                                       case 'U':\r
+                                                       case 'STRIKE':\r
+                                                               sp = dom.create('span', {style : dom.getAttrib(n, 'style')});\r
+                                                               sp.style.textDecoration = n.nodeName == 'U' ? 'underline' : 'line-through';\r
+                                                               dom.setAttrib(sp, 'mce_style', '');\r
+                                                               dom.replace(sp, n, 1);\r
+                                                               break;\r
+                                               }\r
+                                       });\r
+                               } else if (o.set) {\r
+                                       each(t.dom.select('table,span', o.node), function(n) {\r
+                                               if (n.nodeName == 'TABLE') {\r
+                                                       if (v = dom.getStyle(n, 'height'))\r
+                                                               dom.setAttrib(n, 'height', v.replace(/[^0-9%]+/g, ''));\r
+                                               } else {\r
+                                                       // Convert spans to elements\r
+                                                       if (n.style.textDecoration == 'underline')\r
+                                                               na = 'u';\r
+                                                       else if (n.style.textDecoration == 'line-through')\r
+                                                               na = 'strike';\r
+                                                       else\r
+                                                               na = '';\r
+\r
+                                                       if (na) {\r
+                                                               n.style.textDecoration = '';\r
+                                                               dom.setAttrib(n, 'mce_style', '');\r
+\r
+                                                               e = dom.create(na, {\r
+                                                                       style : dom.getAttrib(n, 'style')\r
+                                                               });\r
+\r
+                                                               dom.replace(e, n, 1);\r
+                                                       }\r
+                                               }\r
+                                       });\r
+                               }\r
+                       };\r
+\r
+                       t.onPreProcess.add(convert);\r
+\r
+                       if (!s.cleanup_on_startup) {\r
+                               t.onInit.add(function() {\r
+                                       convert(t, {node : t.getBody(), set : 1});\r
+                               });\r
+                       }\r
+               },\r
+\r
+               _convertFonts : function() {\r
+                       var t = this, s = t.settings, dom = t.dom, fz, fzn, sl, cl;\r
+\r
+                       // No need\r
+                       if (!s.inline_styles)\r
+                               return;\r
+\r
+                       // Font pt values and font size names\r
+                       fz = [8, 10, 12, 14, 18, 24, 36];\r
+                       fzn = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large'];\r
+\r
+                       if (sl = s.font_size_style_values)\r
+                               sl = explode(sl);\r
+\r
+                       if (cl = s.font_size_classes)\r
+                               cl = explode(cl);\r
+\r
+                       function convertToFonts(no) {\r
+                               var n, f, nl, x, i, v, st;\r
+\r
+                               // Convert spans to fonts on non WebKit browsers\r
+                               if (tinymce.isWebKit || !s.inline_styles)\r
+                                       return;\r
+\r
+                               nl = t.dom.select('span', no);\r
+                               for (x = nl.length - 1; x >= 0; x--) {\r
+                                       n = nl[x];\r
+\r
+                                       f = dom.create('font', {\r
+                                               color : dom.toHex(dom.getStyle(n, 'color')),\r
+                                               face : dom.getStyle(n, 'fontFamily'),\r
+                                               style : dom.getAttrib(n, 'style'),\r
+                                               'class' : dom.getAttrib(n, 'class')\r
+                                       });\r
+\r
+                                       // Clear color and font family\r
+                                       st = f.style;\r
+                                       if (st.color || st.fontFamily) {\r
+                                               st.color = st.fontFamily = '';\r
+                                               dom.setAttrib(f, 'mce_style', ''); // Remove cached style data\r
+                                       }\r
+\r
+                                       if (sl) {\r
+                                               i = inArray(sl, dom.getStyle(n, 'fontSize'));\r
+\r
+                                               if (i != -1) {\r
+                                                       dom.setAttrib(f, 'size', '' + (i + 1 || 1));\r
+                                                       f.style.fontSize = '';\r
+                                               }\r
+                                       } else if (cl) {\r
+                                               i = inArray(cl, dom.getAttrib(n, 'class'));\r
+                                               v = dom.getStyle(n, 'fontSize');\r
+\r
+                                               if (i == -1 && v.indexOf('pt') > 0)\r
+                                                       i = inArray(fz, parseInt(v));\r
+\r
+                                               if (i == -1)\r
+                                                       i = inArray(fzn, v);\r
+\r
+                                               if (i != -1) {\r
+                                                       dom.setAttrib(f, 'size', '' + (i + 1 || 1));\r
+                                                       f.style.fontSize = '';\r
+                                               }\r
+                                       }\r
+\r
+                                       if (f.color || f.face || f.size) {\r
+                                               f.style.fontFamily = '';\r
+                                               dom.setAttrib(f, 'mce_style', '');\r
+                                               dom.replace(f, n, 1);\r
+                                       }\r
+\r
+                                       f = n = null;\r
+                               }\r
+                       };\r
+\r
+                       // Run on setup\r
+                       t.onSetContent.add(function(ed, o) {\r
+                               convertToFonts(ed.getBody());\r
+                       });\r
+\r
+                       // Run on cleanup\r
+                       t.onPreProcess.add(function(ed, o) {\r
+                               var n, sp, nl, x;\r
+\r
+                               // Keep unit tests happy\r
+                               if (!s.inline_styles)\r
+                                       return;\r
+\r
+                               if (o.get) {\r
+                                       nl = t.dom.select('font', o.node);\r
+                                       for (x = nl.length - 1; x >= 0; x--) {\r
+                                               n = nl[x];\r
+\r
+                                               sp = dom.create('span', {\r
+                                                       style : dom.getAttrib(n, 'style'),\r
+                                                       'class' : dom.getAttrib(n, 'class')\r
+                                               });\r
+\r
+                                               dom.setStyles(sp, {\r
+                                                       fontFamily : dom.getAttrib(n, 'face'),\r
+                                                       color : dom.getAttrib(n, 'color'),\r
+                                                       backgroundColor : n.style.backgroundColor\r
+                                               });\r
+\r
+                                               if (n.size) {\r
+                                                       if (sl)\r
+                                                               dom.setStyle(sp, 'fontSize', sl[parseInt(n.size) - 1]);\r
+                                                       else\r
+                                                               dom.setAttrib(sp, 'class', cl[parseInt(n.size) - 1]);\r
+                                               }\r
+\r
+                                               dom.setAttrib(sp, 'mce_style', '');\r
+                                               dom.replace(sp, n, 1);\r
+                                       }\r
+                               }\r
+                       });\r
+               },\r
+\r
+               _isHidden : function() {\r
+                       var s;\r
+\r
+                       if (!isGecko)\r
+                               return 0;\r
+\r
+                       // Weird, wheres that cursor selection?\r
+                       s = this.selection.getSel();\r
+                       return (!s || !s.rangeCount || s.rangeCount == 0);\r
+               },\r
+\r
+               // Fix for bug #1867292\r
+               _fixNesting : function(s) {\r
+                       var d = [], i;\r
+\r
+                       s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) {\r
+                               var e;\r
+\r
+                               // Handle end element\r
+                               if (b === '/') {\r
+                                       if (!d.length)\r
+                                               return '';\r
+\r
+                                       if (c !== d[d.length - 1].tag) {\r
+                                               for (i=d.length - 1; i>=0; i--) {\r
+                                                       if (d[i].tag === c) {\r
+                                                               d[i].close = 1;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+\r
+                                               return '';\r
+                                       } else {\r
+                                               d.pop();\r
+\r
+                                               if (d.length && d[d.length - 1].close) {\r
+                                                       a = a + '</' + d[d.length - 1].tag + '>';\r
+                                                       d.pop();\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       // Ignore these\r
+                                       if (/^(br|hr|input|meta|img|link|param)$/i.test(c))\r
+                                               return a;\r
+\r
+                                       // Ignore closed ones\r
+                                       if (/\/>$/.test(a))\r
+                                               return a;\r
+\r
+                                       d.push({tag : c}); // Push start element\r
+                               }\r
+\r
+                               return a;\r
+                       });\r
+\r
+                       // End all open tags\r
+                       for (i=d.length - 1; i>=0; i--)\r
+                               s += '</' + d[i].tag + '>';\r
+\r
+                       return s;\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/EditorCommands.js */\r
+\r
+(function() {\r
+       var each = tinymce.each, isIE = tinymce.isIE, isGecko = tinymce.isGecko, isOpera = tinymce.isOpera, isWebKit = tinymce.isWebKit;\r
+\r
+       tinymce.create('tinymce.EditorCommands', {\r
+               EditorCommands : function(ed) {\r
+                       this.editor = ed;\r
+               },\r
+\r
+               execCommand : function(cmd, ui, val) {\r
+                       var t = this, ed = t.editor, f;\r
+\r
+                       switch (cmd) {\r
+                               case 'Cut':\r
+                               case 'Copy':\r
+                               case 'Paste':\r
+                                       try {\r
+                                               ed.getDoc().execCommand(cmd, ui, val);\r
+                                       } catch (ex) {\r
+                                               if (isGecko) {\r
+                                                       ed.windowManager.confirm(ed.getLang('clipboard_msg'), function(s) {\r
+                                                               if (s)\r
+                                                                       window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');\r
+                                                       });\r
+                                               } else\r
+                                                       ed.windowManager.alert(ed.getLang('clipboard_no_support'));\r
+                                       }\r
+\r
+                                       return true;\r
+\r
+                               // Ignore these\r
+                               case 'mceResetDesignMode':\r
+                               case 'mceBeginUndoLevel':\r
+                                       return true;\r
+\r
+                               // Ignore these\r
+                               case 'unlink':\r
+                                       t.UnLink();\r
+                                       return true;\r
+\r
+                               // Bundle these together\r
+                               case 'JustifyLeft':\r
+                               case 'JustifyCenter':\r
+                               case 'JustifyRight':\r
+                               case 'JustifyFull':\r
+                                       t.mceJustify(cmd, cmd.substring(7).toLowerCase());\r
+                                       return true;\r
+\r
+                               case 'mceEndUndoLevel':\r
+                               case 'mceAddUndoLevel':\r
+                                       ed.undoManager.add();\r
+                                       return true;\r
+\r
+                               default:\r
+                                       f = this[cmd];\r
+\r
+                                       if (f) {\r
+                                               f.call(this, ui, val);\r
+                                               return true;\r
+                                       }\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+\r
+               Indent : function() {\r
+                       var ed = this.editor, d = ed.dom, s = ed.selection, e, iv, iu;\r
+\r
+                       // Setup indent level\r
+                       iv = ed.settings.indentation;\r
+                       iu = /[a-z%]+$/i.exec(iv);\r
+                       iv = parseInt(iv);\r
+\r
+                       if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) {\r
+                               each(this._getSelectedBlocks(), function(e) {\r
+                                       d.setStyle(e, 'paddingLeft', (parseInt(e.style.paddingLeft || 0) + iv) + iu);\r
+                               });\r
+\r
+                               return;\r
+                       }\r
+\r
+                       ed.getDoc().execCommand('Indent', false, null);\r
+\r
+                       if (isIE) {\r
+                               d.getParent(s.getNode(), function(n) {\r
+                                       if (n.nodeName == 'BLOCKQUOTE') {\r
+                                               n.dir = n.style.cssText = '';\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\r
+               Outdent : function() {\r
+                       var ed = this.editor, d = ed.dom, s = ed.selection, e, v, iv, iu;\r
+\r
+                       // Setup indent level\r
+                       iv = ed.settings.indentation;\r
+                       iu = /[a-z%]+$/i.exec(iv);\r
+                       iv = parseInt(iv);\r
+\r
+                       if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) {\r
+                               each(this._getSelectedBlocks(), function(e) {\r
+                                       v = Math.max(0, parseInt(e.style.paddingLeft || 0) - iv);\r
+                                       d.setStyle(e, 'paddingLeft', v ? v + iu : '');\r
+                               });\r
+\r
+                               return;\r
+                       }\r
+\r
+                       ed.getDoc().execCommand('Outdent', false, null);\r
+               },\r
+\r
+               mceSetAttribute : function(u, v) {\r
+                       var ed = this.editor, d = ed.dom, e;\r
+\r
+                       if (e = d.getParent(ed.selection.getNode(), d.isBlock))\r
+                               d.setAttrib(e, v.name, v.value);\r
+               },\r
+\r
+               mceSetContent : function(u, v) {\r
+                       this.editor.setContent(v);\r
+               },\r
+\r
+               mceToggleVisualAid : function() {\r
+                       var ed = this.editor;\r
+\r
+                       ed.hasVisual = !ed.hasVisual;\r
+                       ed.addVisual();\r
+               },\r
+\r
+               mceReplaceContent : function(u, v) {\r
+                       var s = this.editor.selection;\r
+\r
+                       s.setContent(v.replace(/\{\$selection\}/g, s.getContent({format : 'text'})));\r
+               },\r
+\r
+               mceInsertLink : function(u, v) {\r
+                       var ed = this.editor, e = ed.dom.getParent(ed.selection.getNode(), 'A');\r
+\r
+                       if (tinymce.is(v, 'string'))\r
+                               v = {href : v};\r
+\r
+                       function set(e) {\r
+                               each(v, function(v, k) {\r
+                                       ed.dom.setAttrib(e, k, v);\r
+                               });\r
+                       };\r
+\r
+                       if (!e) {\r
+                               ed.execCommand('CreateLink', false, 'javascript:mctmp(0);');\r
+                               each(ed.dom.select('a'), function(e) {\r
+                                       if (e.href == 'javascript:mctmp(0);')\r
+                                               set(e);\r
+                               });\r
+                       } else {\r
+                               if (v.href)\r
+                                       set(e);\r
+                               else\r
+                                       ed.dom.remove(e, 1);\r
+                       }\r
+               },\r
+\r
+               UnLink : function() {\r
+                       var ed = this.editor, s = ed.selection;\r
+\r
+                       if (s.isCollapsed())\r
+                               s.select(s.getNode());\r
+\r
+                       ed.getDoc().execCommand('unlink', false, null);\r
+                       s.collapse(0);\r
+               },\r
+\r
+               FontName : function(u, v) {\r
+                       var t = this, ed = t.editor, s = ed.selection, e;\r
+\r
+                       if (!v) {\r
+                               if (s.isCollapsed())\r
+                                       s.select(s.getNode());\r
+\r
+                               t.RemoveFormat();\r
+                       } else\r
+                               ed.getDoc().execCommand('FontName', false, v);\r
+               },\r
+\r
+               queryCommandValue : function(c) {\r
+                       var f = this['queryValue' + c];\r
+\r
+                       if (f)\r
+                               return f.call(this, c);\r
+\r
+                       return false;\r
+               },\r
+\r
+               queryCommandState : function(cmd) {\r
+                       var f;\r
+\r
+                       switch (cmd) {\r
+                               // Bundle these together\r
+                               case 'JustifyLeft':\r
+                               case 'JustifyCenter':\r
+                               case 'JustifyRight':\r
+                               case 'JustifyFull':\r
+                                       return this.queryStateJustify(cmd, cmd.substring(7).toLowerCase());\r
+\r
+                               default:\r
+                                       if (f = this['queryState' + cmd])\r
+                                               return f.call(this, cmd);\r
+                       }\r
+\r
+                       return -1;\r
+               },\r
+\r
+               _queryState : function(c) {\r
+                       try {\r
+                               return this.editor.getDoc().queryCommandState(c);\r
+                       } catch (ex) {\r
+                               // Ignore exception\r
+                       }\r
+               },\r
+\r
+               _queryVal : function(c) {\r
+                       try {\r
+                               return this.editor.getDoc().queryCommandValue(c);\r
+                       } catch (ex) {\r
+                               // Ignore exception\r
+                       }\r
+               },\r
+\r
+               queryValueFontSize : function() {\r
+                       var ed = this.editor, v = 0, p;\r
+\r
+                       if (isOpera || isWebKit) {\r
+                               if (p = ed.dom.getParent(ed.selection.getNode(), 'FONT'))\r
+                                       v = p.size;\r
+\r
+                               return v;\r
+                       }\r
+\r
+                       return this._queryVal('FontSize');\r
+               },\r
+\r
+               queryValueFontName : function() {\r
+                       var ed = this.editor, v = 0, p;\r
+\r
+                       if (p = ed.dom.getParent(ed.selection.getNode(), 'FONT'))\r
+                               v = p.face;\r
+\r
+                       if (!v)\r
+                               v = this._queryVal('FontName');\r
+\r
+                       return v;\r
+               },\r
+\r
+               mceJustify : function(c, v) {\r
+                       var ed = this.editor, se = ed.selection, n = se.getNode(), nn = n.nodeName, bl, nb, dom = ed.dom, rm;\r
+\r
+                       if (ed.settings.inline_styles && this.queryStateJustify(c, v))\r
+                               rm = 1;\r
+\r
+                       bl = dom.getParent(n, ed.dom.isBlock);\r
+\r
+                       if (nn == 'IMG') {\r
+                               if (v == 'full')\r
+                                       return;\r
+\r
+                               if (rm) {\r
+                                       if (v == 'center')\r
+                                               dom.setStyle(n.parentNode, 'textAlign', '');\r
+\r
+                                       dom.setStyle(n, 'float', '');\r
+                                       this.mceRepaint();\r
+                                       return;\r
+                               }\r
+\r
+                               if (v == 'center') {\r
+                                       // Do not change table elements\r
+                                       if (/^(TD|TH)$/.test(bl.nodeName))\r
+                                               bl = 0;\r
+\r
+                                       if (!bl || bl.childNodes.length > 1) {\r
+                                               nb = dom.create('p');\r
+                                               nb.appendChild(n.cloneNode(false));\r
+\r
+                                               if (bl)\r
+                                                       dom.insertAfter(nb, bl);\r
+                                               else\r
+                                                       dom.insertAfter(nb, n);\r
+\r
+                                               dom.remove(n);\r
+                                               n = nb.firstChild;\r
+                                               bl = nb;\r
+                                       }\r
+\r
+                                       dom.setStyle(bl, 'textAlign', v);\r
+                                       dom.setStyle(n, 'float', '');\r
+                               } else {\r
+                                       dom.setStyle(n, 'float', v);\r
+                                       dom.setStyle(n.parentNode, 'textAlign', '');\r
+                               }\r
+\r
+                               this.mceRepaint();\r
+                               return;\r
+                       }\r
+\r
+                       // Handle the alignment outselfs, less quirks in all browsers\r
+                       if (ed.settings.inline_styles && ed.settings.forced_root_block) {\r
+                               if (rm)\r
+                                       v = '';\r
+\r
+                               each(this._getSelectedBlocks(dom.getParent(se.getStart(), dom.isBlock), dom.getParent(se.getEnd(), dom.isBlock)), function(e) {\r
+                                       dom.setAttrib(e, 'align', '');\r
+                                       dom.setStyle(e, 'textAlign', v == 'full' ? 'justify' : v);\r
+                               });\r
+\r
+                               return;\r
+                       } else if (!rm)\r
+                               ed.getDoc().execCommand(c, false, null);\r
+\r
+                       if (ed.settings.inline_styles) {\r
+                               if (rm) {\r
+                                       dom.getParent(ed.selection.getNode(), function(n) {\r
+                                               if (n.style && n.style.textAlign)\r
+                                                       dom.setStyle(n, 'textAlign', '');\r
+                                       });\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               each(dom.select('*'), function(n) {\r
+                                       var v = n.align;\r
+\r
+                                       if (v) {\r
+                                               if (v == 'full')\r
+                                                       v = 'justify';\r
+\r
+                                               dom.setStyle(n, 'textAlign', v);\r
+                                               dom.setAttrib(n, 'align', '');\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\r
+               mceSetCSSClass : function(u, v) {\r
+                       this.mceSetStyleInfo(0, {command : 'setattrib', name : 'class', value : v});\r
+               },\r
+\r
+               getSelectedElement : function() {\r
+                       var t = this, ed = t.editor, dom = ed.dom, se = ed.selection, r = se.getRng(), r1, r2, sc, ec, so, eo, e, sp, ep, re;\r
+\r
+                       if (se.isCollapsed() || r.item)\r
+                               return se.getNode();\r
+\r
+                       // Setup regexp\r
+                       re = ed.settings.merge_styles_invalid_parents;\r
+                       if (tinymce.is(re, 'string'))\r
+                               re = new RegExp(re, 'i');\r
+\r
+                       if (isIE) {\r
+                               r1 = r.duplicate();\r
+                               r1.collapse(true);\r
+                               sc = r1.parentElement();\r
+\r
+                               r2 = r.duplicate();\r
+                               r2.collapse(false);\r
+                               ec = r2.parentElement();\r
+\r
+                               if (sc != ec) {\r
+                                       r1.move('character', 1);\r
+                                       sc = r1.parentElement();\r
+                               }\r
+\r
+                               if (sc == ec) {\r
+                                       r1 = r.duplicate();\r
+                                       r1.moveToElementText(sc);\r
+\r
+                                       if (r1.compareEndPoints('StartToStart', r) == 0 && r1.compareEndPoints('EndToEnd', r) == 0)\r
+                                               return re && re.test(sc.nodeName) ? null : sc;\r
+                               }\r
+                       } else {\r
+                               function getParent(n) {\r
+                                       return dom.getParent(n, function(n) {return n.nodeType == 1;});\r
+                               };\r
+\r
+                               sc = r.startContainer;\r
+                               ec = r.endContainer;\r
+                               so = r.startOffset;\r
+                               eo = r.endOffset;\r
+\r
+                               if (!r.collapsed) {\r
+                                       if (sc == ec) {\r
+                                               if (so - eo < 2) {\r
+                                                       if (sc.hasChildNodes()) {\r
+                                                               sp = sc.childNodes[so];\r
+                                                               return re && re.test(sp.nodeName) ? null : sp;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               if (sc.nodeType != 3 || ec.nodeType != 3)\r
+                                       return null;\r
+\r
+                               if (so == 0) {\r
+                                       sp = getParent(sc);\r
+\r
+                                       if (sp && sp.firstChild != sc)\r
+                                               sp = null;\r
+                               }\r
+\r
+                               if (so == sc.nodeValue.length) {\r
+                                       e = sc.nextSibling;\r
+\r
+                                       if (e && e.nodeType == 1)\r
+                                               sp = sc.nextSibling;\r
+                               }\r
+\r
+                               if (eo == 0) {\r
+                                       e = ec.previousSibling;\r
+\r
+                                       if (e && e.nodeType == 1)\r
+                                               ep = e;\r
+                               }\r
+\r
+                               if (eo == ec.nodeValue.length) {\r
+                                       ep = getParent(ec);\r
+\r
+                                       if (ep && ep.lastChild != ec)\r
+                                               ep = null;\r
+                               }\r
+\r
+                               // Same element\r
+                               if (sp == ep)\r
+                                       return re && sp && re.test(sp.nodeName) ? null : sp;\r
+                       }\r
+\r
+                       return null;\r
+               },\r
+\r
+               InsertHorizontalRule : function() {\r
+                       // Fix for Gecko <hr size="1" /> issue and IE bug rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");\r
+                       if (isGecko || isIE)\r
+                               this.editor.selection.setContent('<hr />');\r
+                       else\r
+                               this.editor.getDoc().execCommand('InsertHorizontalRule', false, '');\r
+               },\r
+\r
+               RemoveFormat : function() {\r
+                       var t = this, ed = t.editor, s = ed.selection, b;\r
+\r
+                       // Safari breaks tables\r
+                       if (isWebKit)\r
+                               s.setContent(s.getContent({format : 'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g, ''), {format : 'raw'});\r
+                       else\r
+                               ed.getDoc().execCommand('RemoveFormat', false, null);\r
+\r
+                       t.mceSetStyleInfo(0, {command : 'removeformat'});\r
+                       ed.addVisual();\r
+               },\r
+\r
+               mceSetStyleInfo : function(u, v) {\r
+                       var t = this, ed = t.editor, d = ed.getDoc(), dom = ed.dom, e, b, s = ed.selection, nn = v.wrapper || 'span', b = s.getBookmark(), re;\r
+\r
+                       function set(n, e) {\r
+                               if (n.nodeType == 1) {\r
+                                       switch (v.command) {\r
+                                               case 'setattrib':\r
+                                                       return dom.setAttrib(n, v.name, v.value);\r
+\r
+                                               case 'setstyle':\r
+                                                       return dom.setStyle(n, v.name, v.value);\r
+\r
+                                               case 'removeformat':\r
+                                                       return dom.setAttrib(n, 'class', '');\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       // Setup regexp\r
+                       re = ed.settings.merge_styles_invalid_parents;\r
+                       if (tinymce.is(re, 'string'))\r
+                               re = new RegExp(re, 'i');\r
+\r
+                       // Set style info on selected element\r
+                       if (e = t.getSelectedElement())\r
+                               set(e, 1);\r
+                       else {\r
+                               // Generate wrappers and set styles on them\r
+                               d.execCommand('FontName', false, '__');\r
+                               each(isWebKit ? dom.select('span') : dom.select('font'), function(n) {\r
+                                       var sp, e;\r
+\r
+                                       if (dom.getAttrib(n, 'face') == '__' || n.style.fontFamily === '__') {\r
+                                               sp = dom.create(nn, {mce_new : '1'});\r
+\r
+                                               set(sp);\r
+\r
+                                               each (n.childNodes, function(n) {\r
+                                                       sp.appendChild(n.cloneNode(true));\r
+                                               });\r
+\r
+                                               dom.replace(sp, n);\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       // Remove wrappers inside new ones\r
+                       each(dom.select(nn).reverse(), function(n) {\r
+                               var p = n.parentNode;\r
+\r
+                               // Check if it's an old span in a new wrapper\r
+                               if (!dom.getAttrib(n, 'mce_new')) {\r
+                                       // Find new wrapper\r
+                                       p = dom.getParent(n, function(n) {\r
+                                               return n.nodeType == 1 && dom.getAttrib(n, 'mce_new');\r
+                                       });\r
+\r
+                                       if (p)\r
+                                               dom.remove(n, 1);\r
+                               }\r
+                       });\r
+\r
+                       // Merge wrappers with parent wrappers\r
+                       each(dom.select(nn).reverse(), function(n) {\r
+                               var p = n.parentNode;\r
+\r
+                               if (!p || !dom.getAttrib(n, 'mce_new'))\r
+                                       return;\r
+\r
+                               // Has parent of the same type and only child\r
+                               if (p.nodeName == nn.toUpperCase() && p.childNodes.length == 1)\r
+                                       return dom.remove(p, 1);\r
+\r
+                               // Has parent that is more suitable to have the class and only child\r
+                               if (n.nodeType == 1 && (!re || !re.test(p.nodeName)) && p.childNodes.length == 1) {\r
+                                       set(p); // Set style info on parent instead\r
+                                       dom.setAttrib(n, 'class', '');\r
+                               }\r
+                       });\r
+\r
+                       // Remove empty wrappers\r
+                       each(dom.select(nn).reverse(), function(n) {\r
+                               if (dom.getAttrib(n, 'mce_new') || (dom.getAttribs(n).length <= 1 && n.className === '')) {\r
+                                       if (!dom.getAttrib(n, 'class') && !dom.getAttrib(n, 'style'))\r
+                                               return dom.remove(n, 1);\r
+\r
+                                       dom.setAttrib(n, 'mce_new', ''); // Remove mce_new marker\r
+                               }\r
+                       });\r
+\r
+                       s.moveToBookmark(b);\r
+               },\r
+\r
+               queryStateJustify : function(c, v) {\r
+                       var ed = this.editor, n = ed.selection.getNode(), dom = ed.dom;\r
+\r
+                       if (n && n.nodeName == 'IMG') {\r
+                               if (dom.getStyle(n, 'float') == v)\r
+                                       return 1;\r
+\r
+                               return n.parentNode.style.textAlign == v;\r
+                       }\r
+\r
+                       n = dom.getParent(ed.selection.getStart(), function(n) {\r
+                               return n.nodeType == 1 && n.style.textAlign;\r
+                       });\r
+\r
+                       if (v == 'full')\r
+                               v = 'justify';\r
+\r
+                       if (ed.settings.inline_styles)\r
+                               return (n && n.style.textAlign == v);\r
+\r
+                       return this._queryState(c);\r
+               },\r
+\r
+               HiliteColor : function(ui, val) {\r
+                       var t = this, ed = t.editor, d = ed.getDoc();\r
+\r
+                       function set(s) {\r
+                               if (!isGecko)\r
+                                       return;\r
+\r
+                               try {\r
+                                       // Try new Gecko method\r
+                                       d.execCommand("styleWithCSS", 0, s);\r
+                               } catch (ex) {\r
+                                       // Use old\r
+                                       d.execCommand("useCSS", 0, !s);\r
+                               }\r
+                       };\r
+\r
+                       if (isGecko || isOpera) {\r
+                               set(true);\r
+                               d.execCommand('hilitecolor', false, val);\r
+                               set(false);\r
+                       } else\r
+                               d.execCommand('BackColor', false, val);\r
+               },\r
+\r
+               Undo : function() {\r
+                       var ed = this.editor;\r
+\r
+                       if (ed.settings.custom_undo_redo) {\r
+                               ed.undoManager.undo();\r
+                               ed.nodeChanged();\r
+                       } else\r
+                               ed.getDoc().execCommand('Undo', false, null);\r
+               },\r
+\r
+               Redo : function() {\r
+                       var ed = this.editor;\r
+\r
+                       if (ed.settings.custom_undo_redo) {\r
+                               ed.undoManager.redo();\r
+                               ed.nodeChanged();\r
+                       } else\r
+                               ed.getDoc().execCommand('Redo', false, null);\r
+               },\r
+\r
+               FormatBlock : function(ui, val) {\r
+                       var t = this, ed = t.editor;\r
+\r
+                       val = ed.settings.forced_root_block ? (val || '<p>') : val;\r
+\r
+                       if (/^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(ed.selection.getNode().nodeName))\r
+                               t.mceRemoveNode();\r
+\r
+                       if (val.indexOf('<') == -1)\r
+                               val = '<' + val + '>';\r
+\r
+                       if (tinymce.isGecko)\r
+                               val = val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi, '$1');\r
+\r
+                       ed.getDoc().execCommand('FormatBlock', false, val);\r
+               },\r
+\r
+               mceCleanup : function() {\r
+                       var ed = this.editor, s = ed.selection, b = s.getBookmark();\r
+                       ed.setContent(ed.getContent());\r
+                       s.moveToBookmark(b);\r
+               },\r
+\r
+               mceRemoveNode : function(ui, val) {\r
+                       var ed = this.editor, s = ed.selection, b, n = val || s.getNode();\r
+\r
+                       // Make sure that the body node isn't removed\r
+                       if (n == ed.getBody())\r
+                               return;\r
+\r
+                       b = s.getBookmark();\r
+                       ed.dom.remove(n, 1);\r
+                       s.moveToBookmark(b);\r
+                       ed.nodeChanged();\r
+               },\r
+\r
+               mceSelectNodeDepth : function(ui, val) {\r
+                       var ed = this.editor, s = ed.selection, c = 0;\r
+\r
+                       ed.dom.getParent(s.getNode(), function(n) {\r
+                               if (n.nodeType == 1 && c++ == val) {\r
+                                       s.select(n);\r
+                                       ed.nodeChanged();\r
+                                       return false;\r
+                               }\r
+                       }, ed.getBody());\r
+               },\r
+\r
+               mceSelectNode : function(u, v) {\r
+                       this.editor.selection.select(v);\r
+               },\r
+\r
+               mceInsertContent : function(ui, val) {\r
+                       this.editor.selection.setContent(val);\r
+               },\r
+\r
+               mceInsertRawHTML : function(ui, val) {\r
+                       var ed = this.editor;\r
+\r
+                       ed.selection.setContent('tiny_mce_marker');\r
+                       ed.setContent(ed.getContent().replace(/tiny_mce_marker/g, val));\r
+               },\r
+\r
+               mceRepaint : function() {\r
+                       var s, b, e = this.editor;\r
+\r
+                       if (tinymce.isGecko) {\r
+                               try {\r
+                                       s = e.selection;\r
+                                       b = s.getBookmark(true);\r
+\r
+                                       if (s.getSel())\r
+                                               s.getSel().selectAllChildren(e.getBody());\r
+\r
+                                       s.collapse(true);\r
+                                       s.moveToBookmark(b);\r
+                               } catch (ex) {\r
+                                       // Ignore\r
+                               }\r
+                       }\r
+               },\r
+\r
+               queryStateUnderline : function() {\r
+                       var ed = this.editor, n;\r
+\r
+                       if (n && n.nodeName == 'A')\r
+                               return false;\r
+\r
+                       return this._queryState('Underline');\r
+               },\r
+\r
+               queryStateOutdent : function() {\r
+                       var ed = this.editor, n;\r
+\r
+                       if (ed.settings.inline_styles) {\r
+                               if ((n = ed.dom.getParent(ed.selection.getStart(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0)\r
+                                       return true;\r
+\r
+                               if ((n = ed.dom.getParent(ed.selection.getEnd(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0)\r
+                                       return true;\r
+                       } else\r
+                               return !!ed.dom.getParent(ed.selection.getNode(), 'BLOCKQUOTE');\r
+\r
+                       return this.queryStateInsertUnorderedList() || this.queryStateInsertOrderedList();\r
+               },\r
+\r
+               queryStateInsertUnorderedList : function() {\r
+                       return this.editor.dom.getParent(this.editor.selection.getNode(), 'UL');\r
+               },\r
+\r
+               queryStateInsertOrderedList : function() {\r
+                       return this.editor.dom.getParent(this.editor.selection.getNode(), 'OL');\r
+               },\r
+\r
+               queryStatemceBlockQuote : function() {\r
+                       return !!this.editor.dom.getParent(this.editor.selection.getStart(), function(n) {return n.nodeName === 'BLOCKQUOTE';});\r
+               },\r
+\r
+               mceBlockQuote : function() {\r
+                       var t = this, ed = t.editor, s = ed.selection, dom = ed.dom, sb, eb, n, bm, bq, r, bq2, i, nl;\r
+\r
+                       function getBQ(e) {\r
+                               return dom.getParent(e, function(n) {return n.nodeName === 'BLOCKQUOTE';});\r
+                       };\r
+\r
+                       // Get start/end block\r
+                       sb = dom.getParent(s.getStart(), dom.isBlock);\r
+                       eb = dom.getParent(s.getEnd(), dom.isBlock);\r
+\r
+                       // Remove blockquote(s)\r
+                       if (bq = getBQ(sb)) {\r
+                               if (sb != eb || sb.childNodes.length > 1 || (sb.childNodes.length == 1 && sb.firstChild.nodeName != 'BR'))\r
+                                       bm = s.getBookmark();\r
+\r
+                               // Move all elements after the end block into new bq\r
+                               if (getBQ(eb)) {\r
+                                       bq2 = bq.cloneNode(false);\r
+\r
+                                       while (n = eb.nextSibling)\r
+                                               bq2.appendChild(n.parentNode.removeChild(n));\r
+                               }\r
+\r
+                               // Add new bq after\r
+                               if (bq2)\r
+                                       dom.insertAfter(bq2, bq);\r
+\r
+                               // Move all selected blocks after the current bq\r
+                               nl = t._getSelectedBlocks(sb, eb);\r
+                               for (i = nl.length - 1; i >= 0; i--) {\r
+                                       dom.insertAfter(nl[i], bq);\r
+                               }\r
+\r
+                               // Empty bq, then remove it\r
+                               if (/^\s*$/.test(bq.innerHTML))\r
+                                       dom.remove(bq, 1); // Keep children so boomark restoration works correctly\r
+\r
+                               // Empty bq, then remote it\r
+                               if (bq2 && /^\s*$/.test(bq2.innerHTML))\r
+                                       dom.remove(bq2, 1); // Keep children so boomark restoration works correctly\r
+\r
+                               if (!bm) {\r
+                                       // Move caret inside empty block element\r
+                                       if (!isIE) {\r
+                                               r = ed.getDoc().createRange();\r
+                                               r.setStart(sb, 0);\r
+                                               r.setEnd(sb, 0);\r
+                                               s.setRng(r);\r
+                                       } else {\r
+                                               s.select(sb);\r
+                                               s.collapse(0);\r
+\r
+                                               // IE misses the empty block some times element so we must move back the caret\r
+                                               if (dom.getParent(s.getStart(), dom.isBlock) != sb) {\r
+                                                       r = s.getRng();\r
+                                                       r.move('character', -1);\r
+                                                       r.select();\r
+                                               }\r
+                                       }\r
+                               } else\r
+                                       t.editor.selection.moveToBookmark(bm);\r
+\r
+                               return;\r
+                       }\r
+\r
+                       // Since IE can start with a totally empty document we need to add the first bq and paragraph\r
+                       if (isIE && !sb && !eb) {\r
+                               t.editor.getDoc().execCommand('Indent');\r
+                               n = getBQ(s.getNode());\r
+                               n.style.margin = n.dir = ''; // IE adds margin and dir to bq\r
+                               return;\r
+                       }\r
+\r
+                       if (!sb || !eb)\r
+                               return;\r
+\r
+                       // If empty paragraph node then do not use bookmark\r
+                       if (sb != eb || sb.childNodes.length > 1 || (sb.childNodes.length == 1 && sb.firstChild.nodeName != 'BR'))\r
+                               bm = s.getBookmark();\r
+\r
+                       // Move selected block elements into a bq\r
+                       each(t._getSelectedBlocks(getBQ(s.getStart()), getBQ(s.getEnd())), function(e) {\r
+                               // Found existing BQ add to this one\r
+                               if (e.nodeName == 'BLOCKQUOTE' && !bq) {\r
+                                       bq = e;\r
+                                       return;\r
+                               }\r
+\r
+                               // No BQ found, create one\r
+                               if (!bq) {\r
+                                       bq = dom.create('blockquote');\r
+                                       e.parentNode.insertBefore(bq, e);\r
+                               }\r
+\r
+                               // Add children from existing BQ\r
+                               if (e.nodeName == 'BLOCKQUOTE' && bq) {\r
+                                       n = e.firstChild;\r
+\r
+                                       while (n) {\r
+                                               bq.appendChild(n.cloneNode(true));\r
+                                               n = n.nextSibling;\r
+                                       }\r
+\r
+                                       dom.remove(e);\r
+                                       return;\r
+                               }\r
+\r
+                               // Add non BQ element to BQ\r
+                               bq.appendChild(dom.remove(e));\r
+                       });\r
+\r
+                       if (!bm) {\r
+                               // Move caret inside empty block element\r
+                               if (!isIE) {\r
+                                       r = ed.getDoc().createRange();\r
+                                       r.setStart(sb, 0);\r
+                                       r.setEnd(sb, 0);\r
+                                       s.setRng(r);\r
+                               } else {\r
+                                       s.select(sb);\r
+                                       s.collapse(1);\r
+                               }\r
+                       } else\r
+                               s.moveToBookmark(bm);\r
+               },\r
+/*\r
+               _mceBlockQuote : function() {\r
+                       var t = this, s = t.editor.selection, b = s.getBookmark(), bq, dom = t.editor.dom;\r
+\r
+                       function findBQ(e) {\r
+                               return dom.getParent(e, function(n) {return n.nodeName === 'BLOCKQUOTE';});\r
+                       };\r
+\r
+                       // Remove blockquote(s)\r
+                       if (findBQ(s.getStart())) {\r
+                               each(t._getSelectedBlocks(findBQ(s.getStart()), findBQ(s.getEnd())), function(e) {\r
+                                       // Found BQ lets remove it\r
+                                       if (e.nodeName == 'BLOCKQUOTE')\r
+                                               dom.remove(e, 1);\r
+                               });\r
+\r
+                               t.editor.selection.moveToBookmark(b);\r
+                               return;\r
+                       }\r
+\r
+                       each(t._getSelectedBlocks(findBQ(s.getStart()), findBQ(s.getEnd())), function(e) {\r
+                               var n;\r
+\r
+                               // Found existing BQ add to this one\r
+                               if (e.nodeName == 'BLOCKQUOTE' && !bq) {\r
+                                       bq = e;\r
+                                       return;\r
+                               }\r
+\r
+                               // No BQ found, create one\r
+                               if (!bq) {\r
+                                       bq = dom.create('blockquote');\r
+                                       e.parentNode.insertBefore(bq, e);\r
+                               }\r
+\r
+                               // Add children from existing BQ\r
+                               if (e.nodeName == 'BLOCKQUOTE' && bq) {\r
+                                       n = e.firstChild;\r
+\r
+                                       while (n) {\r
+                                               bq.appendChild(n.cloneNode(true));\r
+                                               n = n.nextSibling;\r
+                                       }\r
+\r
+                                       dom.remove(e);\r
+\r
+                                       return;\r
+                               }\r
+\r
+                               // Add non BQ element to BQ\r
+                               bq.appendChild(dom.remove(e));\r
+                       });\r
+\r
+                       t.editor.selection.moveToBookmark(b);\r
+               },\r
+*/\r
+               _getSelectedBlocks : function(st, en) {\r
+                       var ed = this.editor, dom = ed.dom, s = ed.selection, sb, eb, n, bl = [];\r
+\r
+                       sb = dom.getParent(st || s.getStart(), dom.isBlock);\r
+                       eb = dom.getParent(en || s.getEnd(), dom.isBlock);\r
+\r
+                       if (sb)\r
+                               bl.push(sb);\r
+\r
+                       if (sb && eb && sb != eb) {\r
+                               n = sb;\r
+\r
+                               while ((n = n.nextSibling) && n != eb) {\r
+                                       if (dom.isBlock(n))\r
+                                               bl.push(n);\r
+                               }\r
+                       }\r
+\r
+                       if (eb && sb != eb)\r
+                               bl.push(eb);\r
+\r
+                       return bl;\r
+               }\r
+       });\r
+})();\r
+\r
+\r
+/* file:jscripts/tiny_mce/classes/UndoManager.js */\r
+\r
+tinymce.create('tinymce.UndoManager', {\r
+       index : 0,\r
+       data : null,\r
+       typing : 0,\r
+\r
+       UndoManager : function(ed) {\r
+               var t = this, Dispatcher = tinymce.util.Dispatcher;\r
+\r
+               t.editor = ed;\r
+               t.data = [];\r
+               t.onAdd = new Dispatcher(this);\r
+               t.onUndo = new Dispatcher(this);\r
+               t.onRedo = new Dispatcher(this);\r
+       },\r
+\r
+       add : function(l) {\r
+               var t = this, i, ed = t.editor, b, s = ed.settings, la;\r
+\r
+               l = l || {};\r
+               l.content = l.content || ed.getContent({format : 'raw', no_events : 1});\r
+\r
+               // Add undo level if needed\r
+               l.content = l.content.replace(/^\s*|\s*$/g, '');\r
+               la = t.data[t.index > 0 ? t.index - 1 : 0];\r
+               if (!l.initial && la && l.content == la.content)\r
+                       return null;\r
+\r
+               // Time to compress\r
+               if (s.custom_undo_redo_levels) {\r
+                       if (t.data.length > s.custom_undo_redo_levels) {\r
+                               for (i = 0; i < t.data.length - 1; i++)\r
+                                       t.data[i] = t.data[i + 1];\r
+\r
+                               t.data.length--;\r
+                               t.index = t.data.length;\r
+                       }\r
+               }\r
+\r
+               if (s.custom_undo_redo_restore_selection && !l.initial)\r
+                       l.bookmark = b = l.bookmark || ed.selection.getBookmark();\r
+\r
+               if (t.index < t.data.length && t.data[t.index].initial)\r
+                       t.index++;\r
+\r
+               // Add level\r
+               t.data.length = t.index + 1;\r
+               t.data[t.index++] = l;\r
+\r
+               if (l.initial)\r
+                       t.index = 0;\r
+\r
+               // Set initial bookmark use first real undo level\r
+               if (t.data.length == 2 && t.data[0].initial)\r
+                       t.data[0].bookmark = b;\r
+\r
+               t.onAdd.dispatch(t, l);\r
+               ed.isNotDirty = 0;\r
+\r
+               //console.dir(t.data);\r
+\r
+               return l;\r
+       },\r
+\r
+       undo : function() {\r
+               var t = this, ed = t.editor, l = l, i;\r
+\r
+               if (t.typing) {\r
+                       t.add();\r
+                       t.typing = 0;\r
+               }\r
+\r
+               if (t.index > 0) {\r
+                       // If undo on last index then take snapshot\r
+                       if (t.index == t.data.length && t.index > 1) {\r
+                               i = t.index;\r
+                               t.typing = 0;\r
+\r
+                               if (!t.add())\r
+                                       t.index = i;\r
+\r
+                               --t.index;\r
+                       }\r
+\r
+                       l = t.data[--t.index];\r
+                       ed.setContent(l.content, {format : 'raw'});\r
+                       ed.selection.moveToBookmark(l.bookmark);\r
+\r
+                       t.onUndo.dispatch(t, l);\r
+               }\r
+\r
+               return l;\r
+       },\r
+\r
+       redo : function() {\r
+               var t = this, ed = t.editor, l = null;\r
+\r
+               if (t.index < t.data.length - 1) {\r
+                       l = t.data[++t.index];\r
+                       ed.setContent(l.content, {format : 'raw'});\r
+                       ed.selection.moveToBookmark(l.bookmark);\r
+\r
+                       t.onRedo.dispatch(t, l);\r
+               }\r
+\r
+               return l;\r
+       },\r
+\r
+       clear : function() {\r
+               var t = this;\r
+\r
+               t.data = [];\r
+               t.index = 0;\r
+               t.typing = 0;\r
+               t.add({initial : true});\r
+       },\r
+\r
+       hasUndo : function() {\r
+               return this.index != 0 || this.typing;\r
+       },\r
+\r
+       hasRedo : function() {\r
+               return this.index < this.data.length - 1;\r
+       }\r
+\r
+       });\r
+/* file:jscripts/tiny_mce/classes/ForceBlocks.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var Event, isIE, isGecko, isOpera, each, extend;\r
+\r
+       Event = tinymce.dom.Event;\r
+       isIE = tinymce.isIE;\r
+       isGecko = tinymce.isGecko;\r
+       isOpera = tinymce.isOpera;\r
+       each = tinymce.each;\r
+       extend = tinymce.extend;\r
+\r
+       tinymce.create('tinymce.ForceBlocks', {\r
+               ForceBlocks : function(ed) {\r
+                       var t = this, s = ed.settings, elm;\r
+\r
+                       t.editor = ed;\r
+                       t.dom = ed.dom;\r
+                       elm = (s.forced_root_block || 'p').toLowerCase();\r
+                       s.element = elm.toUpperCase();\r
+\r
+                       ed.onPreInit.add(t.setup, t);\r
+\r
+                       t.reOpera = new RegExp('(\\u00a0|&#160;|&nbsp;)<\/' + elm + '>', 'gi');\r
+                       t.rePadd = new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.reNbsp2BR1 = new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.reNbsp2BR2 = new RegExp('<p( )([^>]+)>(&nbsp;|&#160;)<\\\/p>|<p>(&nbsp;|&#160;)<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.reBR2Nbsp = new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.reTrailBr = new RegExp('\\s*<br \\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi');\r
+\r
+                       function padd(ed, o) {\r
+                               if (isOpera)\r
+                                       o.content = o.content.replace(t.reOpera, '</' + elm + '>');\r
+\r
+                               o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0</' + elm + '>');\r
+\r
+                               if (!isIE && !isOpera && o.set) {\r
+                                       // Use &nbsp; instead of BR in padded paragraphs\r
+                                       o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2><br /></' + elm + '>');\r
+                                       o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2><br /></' + elm + '>');\r
+                               } else {\r
+                                       o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0</' + elm + '>');\r
+                                       o.content = o.content.replace(t.reTrailBr, '</' + elm + '>');\r
+                               }\r
+                       };\r
+\r
+                       ed.onBeforeSetContent.add(padd);\r
+                       ed.onPostProcess.add(padd);\r
+\r
+                       if (s.forced_root_block) {\r
+                               ed.onInit.add(t.forceRoots, t);\r
+                               ed.onSetContent.add(t.forceRoots, t);\r
+                               ed.onBeforeGetContent.add(t.forceRoots, t);\r
+                       }\r
+               },\r
+\r
+               setup : function() {\r
+                       var t = this, ed = t.editor, s = ed.settings;\r
+\r
+                       // Force root blocks when typing and when getting output\r
+                       if (s.forced_root_block) {\r
+                               ed.onKeyUp.add(t.forceRoots, t);\r
+                               ed.onPreProcess.add(t.forceRoots, t);\r
+                       }\r
+\r
+                       if (s.force_br_newlines) {\r
+                               // Force IE to produce BRs on enter\r
+                               if (isIE) {\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               var n, s = ed.selection;\r
+\r
+                                               if (e.keyCode == 13 && s.getNode().nodeName != 'LI') {\r
+                                                       s.setContent('<br id="__" /> ', {format : 'raw'});\r
+                                                       n = ed.dom.get('__');\r
+                                                       n.removeAttribute('id');\r
+                                                       s.select(n);\r
+                                                       s.collapse();\r
+                                                       return Event.cancel(e);\r
+                                               }\r
+                                       });\r
+                               }\r
+\r
+                               return;\r
+                       }\r
+\r
+                       if (!isIE && s.force_p_newlines) {\r
+/*                             ed.onPreProcess.add(function(ed, o) {\r
+                                       each(ed.dom.select('br', o.node), function(n) {\r
+                                               var p = n.parentNode;\r
+\r
+                                               // Replace <p><br /></p> with <p>&nbsp;</p>\r
+                                               if (p && p.nodeName == 'p' && (p.childNodes.length == 1 || p.lastChild == n)) {\r
+                                                       p.replaceChild(ed.getDoc().createTextNode('\u00a0'), n);\r
+                                               }\r
+                                       });\r
+                               });*/\r
+\r
+                               ed.onKeyPress.add(function(ed, e) {\r
+                                       if (e.keyCode == 13 && !e.shiftKey) {\r
+                                               if (!t.insertPara(e))\r
+                                                       Event.cancel(e);\r
+                                       }\r
+                               });\r
+\r
+                               if (isGecko) {\r
+                                       ed.onKeyDown.add(function(ed, e) {\r
+                                               if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey)\r
+                                                       t.backspaceDelete(e, e.keyCode == 8);\r
+                                       });\r
+                               }\r
+                       }\r
+\r
+                       function ren(rn, na) {\r
+                               var ne = ed.dom.create(na);\r
+\r
+                               each(rn.attributes, function(a) {\r
+                                       if (a.specified && a.nodeValue)\r
+                                               ne.setAttribute(a.nodeName.toLowerCase(), a.nodeValue);\r
+                               });\r
+\r
+                               each(rn.childNodes, function(n) {\r
+                                       ne.appendChild(n.cloneNode(true));\r
+                               });\r
+\r
+                               rn.parentNode.replaceChild(ne, rn);\r
+\r
+                               return ne;\r
+                       };\r
+\r
+                       // Replaces IE:s auto generated paragraphs with the specified element name\r
+                       if (isIE && s.element != 'P') {\r
+                               ed.onKeyPress.add(function(ed, e) {\r
+                                       t.lastElm = ed.selection.getNode().nodeName;\r
+                               });\r
+\r
+                               ed.onKeyUp.add(function(ed, e) {\r
+                                       var bl, sel = ed.selection, n = sel.getNode(), b = ed.getBody();\r
+\r
+                                       if (b.childNodes.length === 1 && n.nodeName == 'P') {\r
+                                               n = ren(n, s.element);\r
+                                               sel.select(n);\r
+                                               sel.collapse();\r
+                                               ed.nodeChanged();\r
+                                       } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') {\r
+                                               bl = ed.dom.getParent(n, 'P');\r
+\r
+                                               if (bl) {\r
+                                                       ren(bl, s.element);\r
+                                                       ed.nodeChanged();\r
+                                               }\r
+                                       }\r
+                               });\r
+                       }\r
+               },\r
+\r
+               find : function(n, t, s) {\r
+                       var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, false), c = -1;\r
+\r
+                       while (n = w.nextNode()) {\r
+                               c++;\r
+\r
+                               // Index by node\r
+                               if (t == 0 && n == s)\r
+                                       return c;\r
+\r
+                               // Node by index\r
+                               if (t == 1 && c == s)\r
+                                       return n;\r
+                       }\r
+\r
+                       return -1;\r
+               },\r
+\r
+               forceRoots : function(ed, e) {\r
+                       var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF;\r
+                       var nx, bl, bp, sp, le, nl = b.childNodes, i;\r
+\r
+                       // Fix for bug #1863847\r
+                       if (e && e.keyCode == 13)\r
+                               return true;\r
+\r
+                       // Wrap non blocks into blocks\r
+                       for (i = nl.length - 1; i >= 0; i--) {\r
+                               nx = nl[i];\r
+\r
+                               // Is text or non block element\r
+                               if (nx.nodeType == 3 || (!t.dom.isBlock(nx) && nx.nodeType != 8)) {\r
+                                       if (!bl) {\r
+                                               // Create new block but ignore whitespace\r
+                                               if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) {\r
+                                                       // Store selection\r
+                                                       if (si == -2 && r) {\r
+                                                               if (!isIE) {\r
+                                                                       so = r.startOffset;\r
+                                                                       eo = r.endOffset;\r
+                                                                       si = t.find(b, 0, r.startContainer);\r
+                                                                       ei = t.find(b, 0, r.endContainer);\r
+                                                               } else {\r
+                                                                       tr = d.body.createTextRange();\r
+                                                                       tr.moveToElementText(b);\r
+                                                                       tr.collapse(1);\r
+                                                                       bp = tr.move('character', c) * -1;\r
+\r
+                                                                       tr = r.duplicate();\r
+                                                                       tr.collapse(1);\r
+                                                                       sp = tr.move('character', c) * -1;\r
+\r
+                                                                       tr = r.duplicate();\r
+                                                                       tr.collapse(0);\r
+                                                                       le = (tr.move('character', c) * -1) - sp;\r
+\r
+                                                                       si = sp - bp;\r
+                                                                       ei = le;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       bl = ed.dom.create(ed.settings.forced_root_block);\r
+                                                       bl.appendChild(nx.cloneNode(1));\r
+                                                       nx.parentNode.replaceChild(bl, nx);\r
+                                               }\r
+                                       } else {\r
+                                               if (bl.hasChildNodes())\r
+                                                       bl.insertBefore(nx, bl.firstChild);\r
+                                               else\r
+                                                       bl.appendChild(nx);\r
+                                       }\r
+                               } else\r
+                                       bl = null; // Time to create new block\r
+                       }\r
+\r
+                       // Restore selection\r
+                       if (si != -2) {\r
+                               if (!isIE) {\r
+                                       bl = d.getElementsByTagName(ed.settings.element)[0];\r
+                                       r = d.createRange();\r
+\r
+                                       // Select last location or generated block\r
+                                       if (si != -1)\r
+                                               r.setStart(t.find(b, 1, si), so);\r
+                                       else\r
+                                               r.setStart(bl, 0);\r
+\r
+                                       // Select last location or generated block\r
+                                       if (ei != -1)\r
+                                               r.setEnd(t.find(b, 1, ei), eo);\r
+                                       else\r
+                                               r.setEnd(bl, 0);\r
+\r
+                                       if (s) {\r
+                                               s.removeAllRanges();\r
+                                               s.addRange(r);\r
+                                       }\r
+                               } else {\r
+                                       try {\r
+                                               r = s.createRange();\r
+                                               r.moveToElementText(b);\r
+                                               r.collapse(1);\r
+                                               r.moveStart('character', si);\r
+                                               r.moveEnd('character', ei);\r
+                                               r.select();\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+                               }\r
+                       }\r
+               },\r
+\r
+               getParentBlock : function(n) {\r
+                       var d = this.dom;\r
+\r
+                       return d.getParent(n, d.isBlock);\r
+               },\r
+\r
+               insertPara : function(e) {\r
+                       var t = this, ed = t.editor, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body;\r
+                       var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = ed.dom.getViewPort(ed.getWin()), y, ch;\r
+\r
+                       function isEmpty(n) {\r
+                               n = n.innerHTML;\r
+                               n = n.replace(/<(img|hr|table)/gi, '-'); // Keep these convert them to - chars\r
+                               n = n.replace(/<[^>]+>/g, ''); // Remove all tags\r
+\r
+                               return n.replace(/[ \t\r\n]+/g, '') == '';\r
+                       };\r
+\r
+                       // If root blocks are forced then use Operas default behavior since it's really good\r
+// Removed due to bug: #1853816\r
+//                     if (se.forced_root_block && isOpera)\r
+//                             return true;\r
+\r
+                       // Setup before range\r
+                       rb = d.createRange();\r
+\r
+                       // If is before the first block element and in body, then move it into first block element\r
+                       rb.setStart(s.anchorNode, s.anchorOffset);\r
+                       rb.collapse(true);\r
+\r
+                       // Setup after range\r
+                       ra = d.createRange();\r
+\r
+                       // If is before the first block element and in body, then move it into first block element\r
+                       ra.setStart(s.focusNode, s.focusOffset);\r
+                       ra.collapse(true);\r
+\r
+                       // Setup start/end points\r
+                       dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0;\r
+                       sn = dir ? s.anchorNode : s.focusNode;\r
+                       so = dir ? s.anchorOffset : s.focusOffset;\r
+                       en = dir ? s.focusNode : s.anchorNode;\r
+                       eo = dir ? s.focusOffset : s.anchorOffset;\r
+\r
+                       // If the caret is in an invalid location in FF we need to move it into the first block\r
+                       if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) {\r
+                               sn = en = sn.firstChild;\r
+                               so = eo = 0;\r
+                               rb = d.createRange();\r
+                               rb.setStart(sn, 0);\r
+                               ra = d.createRange();\r
+                               ra.setStart(en, 0);\r
+                       }\r
+\r
+                       // Never use body as start or end node\r
+                       sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes\r
+                       sn = sn.nodeName == "BODY" ? sn.firstChild : sn;\r
+                       en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes\r
+                       en = en.nodeName == "BODY" ? en.firstChild : en;\r
+\r
+                       // Get start and end blocks\r
+                       sb = t.getParentBlock(sn);\r
+                       eb = t.getParentBlock(en);\r
+                       bn = sb ? sb.nodeName : se.element; // Get block name to create\r
+\r
+                       // Return inside list use default browser behavior\r
+                       if (t.dom.getParent(sb, function(n) { return /OL|UL|PRE/.test(n.nodeName); }))\r
+                               return true;\r
+\r
+                       // If caption or absolute layers then always generate new blocks within\r
+                       if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(sb.style.position))) {\r
+                               bn = se.element;\r
+                               sb = null;\r
+                       }\r
+\r
+                       // If caption or absolute layers then always generate new blocks within\r
+                       if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(eb.style.position))) {\r
+                               bn = se.element;\r
+                               eb = null;\r
+                       }\r
+\r
+                       // Use P instead\r
+                       if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(sb.style.cssFloat))) {\r
+                               bn = se.element;\r
+                               sb = eb = null;\r
+                       }\r
+\r
+                       // Setup new before and after blocks\r
+                       bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn);\r
+                       aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn);\r
+\r
+                       // Remove id from after clone\r
+                       aft.removeAttribute('id');\r
+\r
+                       // Is header and cursor is at the end, then force paragraph under\r
+                       if (/^(H[1-6])$/.test(bn) && sn.nodeValue && so == sn.nodeValue.length)\r
+                               aft = ed.dom.create(se.element);\r
+\r
+                       // Find start chop node\r
+                       n = sc = sn;\r
+                       do {\r
+                               if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))\r
+                                       break;\r
+\r
+                               sc = n;\r
+                       } while ((n = n.previousSibling ? n.previousSibling : n.parentNode));\r
+\r
+                       // Find end chop node\r
+                       n = ec = en;\r
+                       do {\r
+                               if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))\r
+                                       break;\r
+\r
+                               ec = n;\r
+                       } while ((n = n.nextSibling ? n.nextSibling : n.parentNode));\r
+\r
+                       // Place first chop part into before block element\r
+                       if (sc.nodeName == bn)\r
+                               rb.setStart(sc, 0);\r
+                       else\r
+                               rb.setStartBefore(sc);\r
+\r
+                       rb.setEnd(sn, so);\r
+                       bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari\r
+\r
+                       // Place secnd chop part within new block element\r
+                       try {\r
+                               ra.setEndAfter(ec);\r
+                       } catch(ex) {\r
+                               //console.debug(s.focusNode, s.focusOffset);\r
+                       }\r
+\r
+                       ra.setStart(en, eo);\r
+                       aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari\r
+\r
+                       // Create range around everything\r
+                       r = d.createRange();\r
+                       if (!sc.previousSibling && sc.parentNode.nodeName == bn) {\r
+                               r.setStartBefore(sc.parentNode);\r
+                       } else {\r
+                               if (rb.startContainer.nodeName == bn && rb.startOffset == 0)\r
+                                       r.setStartBefore(rb.startContainer);\r
+                               else\r
+                                       r.setStart(rb.startContainer, rb.startOffset);\r
+                       }\r
+\r
+                       if (!ec.nextSibling && ec.parentNode.nodeName == bn)\r
+                               r.setEndAfter(ec.parentNode);\r
+                       else\r
+                               r.setEnd(ra.endContainer, ra.endOffset);\r
+\r
+                       // Delete and replace it with new block elements\r
+                       r.deleteContents();\r
+\r
+                       if (isOpera)\r
+                               ed.getWin().scrollTo(0, vp.y);\r
+\r
+                       // Never wrap blocks in blocks\r
+                       if (bef.firstChild && bef.firstChild.nodeName == bn)\r
+                               bef.innerHTML = bef.firstChild.innerHTML;\r
+\r
+                       if (aft.firstChild && aft.firstChild.nodeName == bn)\r
+                               aft.innerHTML = aft.firstChild.innerHTML;\r
+\r
+                       // Padd empty blocks\r
+                       if (isEmpty(bef))\r
+                               bef.innerHTML = '<br />';\r
+\r
+                       if (isEmpty(aft))\r
+                               aft.innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there\r
+\r
+                       // Opera needs this one backwards\r
+                       if (isOpera) {\r
+                               r.insertNode(bef);\r
+                               r.insertNode(aft);\r
+                       } else {\r
+                               r.insertNode(aft);\r
+                               r.insertNode(bef);\r
+                       }\r
+\r
+                       // Normalize\r
+                       aft.normalize();\r
+                       bef.normalize();\r
+\r
+                       // Move cursor and scroll into view\r
+                       r = d.createRange();\r
+                       r.selectNodeContents(aft);\r
+                       r.collapse(1);\r
+                       s.removeAllRanges();\r
+                       s.addRange(r);\r
+\r
+                       // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs\r
+                       y = ed.dom.getPos(aft).y;\r
+                       ch = aft.clientHeight;\r
+\r
+                       // Is element within viewport\r
+                       if (y < vp.y || y + ch > vp.y + vp.h) {\r
+                               ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + ch);\r
+                               //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight));\r
+                       }\r
+\r
+                       return false;\r
+               },\r
+\r
+               backspaceDelete : function(e, bs) {\r
+                       var t = this, ed = t.editor, b = ed.getBody(), n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn;\r
+\r
+                       // The caret sometimes gets stuck in Gecko if you delete empty paragraphs\r
+                       // This workaround removes the element by hand and moves the caret to the previous element\r
+                       if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) {\r
+                               if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) {\r
+                                       // Find previous block element\r
+                                       n = sc;\r
+                                       while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ;\r
+\r
+                                       if (n) {\r
+                                               if (sc != b.firstChild) {\r
+                                                       // Find last text node\r
+                                                       w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);\r
+                                                       while (tn = w.nextNode())\r
+                                                               n = tn;\r
+\r
+                                                       // Place caret at the end of last text node\r
+                                                       r = ed.getDoc().createRange();\r
+                                                       r.setStart(n, n.nodeValue ? n.nodeValue.length : 0);\r
+                                                       r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0);\r
+                                                       se.setRng(r);\r
+\r
+                                                       // Remove the target container\r
+                                                       ed.dom.remove(sc);\r
+                                               }\r
+\r
+                                               return Event.cancel(e);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Gecko generates BR elements here and there, we don't like those so lets remove them\r
+                       function handler(e) {\r
+                               e = e.target;\r
+\r
+                               // A new BR was created in a block element, remove it\r
+                               if (e && e.parentNode && e.nodeName == 'BR' && (n = t.getParentBlock(e))) {\r
+                                       Event.remove(b, 'DOMNodeInserted', handler);\r
+\r
+                                       // Only remove BR elements that got inserted in the middle of the text\r
+                                       if (e.previousSibling || e.nextSibling)\r
+                                               ed.dom.remove(e);\r
+                               }\r
+                       };\r
+\r
+                       // Listen for new nodes\r
+                       Event._add(b, 'DOMNodeInserted', handler);\r
+\r
+                       // Remove listener\r
+                       window.setTimeout(function() {\r
+                               Event._remove(b, 'DOMNodeInserted', handler);\r
+                       }, 1);\r
+               }\r
+       });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/ControlManager.js */\r
+\r
+(function() {\r
+       // Shorten names\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend;\r
+\r
+       tinymce.create('tinymce.ControlManager', {\r
+               ControlManager : function(ed, s) {\r
+                       var t = this, i;\r
+\r
+                       s = s || {};\r
+                       t.editor = ed;\r
+                       t.controls = {};\r
+                       t.onAdd = new tinymce.util.Dispatcher(t);\r
+                       t.onPostRender = new tinymce.util.Dispatcher(t);\r
+                       t.prefix = s.prefix || ed.id + '_';\r
+                       t._cls = {};\r
+\r
+                       t.onPostRender.add(function() {\r
+                               each(t.controls, function(c) {\r
+                                       c.postRender();\r
+                               });\r
+                       });\r
+               },\r
+\r
+               get : function(id) {\r
+                       return this.controls[this.prefix + id] || this.controls[id];\r
+               },\r
+\r
+               setActive : function(id, s) {\r
+                       var c = null;\r
+\r
+                       if (c = this.get(id))\r
+                               c.setActive(s);\r
+\r
+                       return c;\r
+               },\r
+\r
+               setDisabled : function(id, s) {\r
+                       var c = null;\r
+\r
+                       if (c = this.get(id))\r
+                               c.setDisabled(s);\r
+\r
+                       return c;\r
+               },\r
+\r
+               add : function(c) {\r
+                       var t = this;\r
+\r
+                       if (c) {\r
+                               t.controls[c.id] = c;\r
+                               t.onAdd.dispatch(c, t);\r
+                       }\r
+\r
+                       return c;\r
+               },\r
+\r
+               createControl : function(n) {\r
+                       var c, t = this, ed = t.editor;\r
+\r
+                       each(ed.plugins, function(p) {\r
+                               if (p.createControl) {\r
+                                       c = p.createControl(n, t);\r
+\r
+                                       if (c)\r
+                                               return false;\r
+                               }\r
+                       });\r
+\r
+                       switch (n) {\r
+                               case "|":\r
+                               case "separator":\r
+                                       return t.createSeparator();\r
+                       }\r
+\r
+                       if (!c && ed.buttons && (c = ed.buttons[n]))\r
+                               return t.createButton(n, c);\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createDropMenu : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, c, bm, v, cls;\r
+\r
+                       s = extend({\r
+                               'class' : 'mceDropDown',\r
+                               constrain : ed.settings.constrain_menus\r
+                       }, s);\r
+\r
+                       s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin';\r
+                       if (v = ed.getParam('skin_variant'))\r
+                               s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1);\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu;\r
+                       c = t.controls[id] = new cls(id, s);\r
+                       c.onAddItem.add(function(c, o) {\r
+                               var s = o.settings;\r
+\r
+                               s.title = ed.getLang(s.title, s.title);\r
+\r
+                               if (!s.onclick) {\r
+                                       s.onclick = function(v) {\r
+                                               ed.execCommand(s.cmd, s.ui || false, s.value);\r
+                                       };\r
+                               }\r
+                       });\r
+\r
+                       ed.onRemove.add(function() {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       // Fix for bug #1897785, #1898007\r
+                       if (tinymce.isIE) {\r
+                               c.onShowMenu.add(function() {\r
+                                       var s = ed.selection, n = s.getNode();\r
+\r
+                                       if (n.nodeName == 'IMG')\r
+                                               bm = s.getBookmark();\r
+                                       else\r
+                                               bm = 0;\r
+                               });\r
+\r
+                               c.onHideMenu.add(function() {\r
+                                       if (bm)\r
+                                               ed.selection.moveToBookmark(bm);\r
+                               });\r
+                       }\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createListBox : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls;\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               scope : s.scope,\r
+                               control_manager : t\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+\r
+                       if (ed.settings.use_native_selects)\r
+                               c = new tinymce.ui.NativeListBox(id, s);\r
+                       else {\r
+                               cls = cc || t._cls.listbox || tinymce.ui.ListBox;\r
+                               c = new cls(id, s);\r
+                       }\r
+\r
+                       t.controls[id] = c;\r
+\r
+                       // Fix focus problem in Safari\r
+                       if (tinymce.isWebKit) {\r
+                               c.onPostRender.add(function(c, n) {\r
+                                       // Store bookmark on mousedown\r
+                                       Event.add(n, 'mousedown', function() {\r
+                                               ed.bookmark = ed.selection.getBookmark('simple');\r
+                                       });\r
+\r
+                                       // Restore on focus, since it might be lost\r
+                                       Event.add(n, 'focus', function() {\r
+                                               ed.selection.moveToBookmark(ed.bookmark);\r
+                                               ed.bookmark = null;\r
+                                       });\r
+                               });\r
+                       }\r
+\r
+                       if (c.hideMenu)\r
+                               ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, o, c, cls;\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onclick && !s.menu_button) {\r
+                               s.onclick = function() {\r
+                                       ed.execCommand(s.cmd, s.ui || false, s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               unavailable_prefix : ed.getLang('unavailable', ''),\r
+                               scope : s.scope,\r
+                               control_manager : t\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+\r
+                       if (s.menu_button) {\r
+                               cls = cc || t._cls.menubutton || tinymce.ui.MenuButton;\r
+                               c = new cls(id, s);\r
+                               ed.onMouseDown.add(c.hideMenu, c);\r
+                       } else {\r
+                               cls = t._cls.button || tinymce.ui.Button;\r
+                               c = new cls(id, s);\r
+                       }\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createMenuButton : function(id, s) {\r
+                       s = s || {};\r
+                       s.menu_button = 1;\r
+\r
+                       return this.createButton(id, s);\r
+               },\r
+\r
+               createSplitButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls;\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onclick) {\r
+                               s.onclick = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               scope : s.scope,\r
+                               control_manager : t\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton;\r
+                       c = t.add(new cls(id, s));\r
+                       ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       return c;\r
+               },\r
+\r
+               createColorSplitButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls;\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onclick) {\r
+                               s.onclick = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               'menu_class' : ed.getParam('skin') + 'Skin',\r
+                               scope : s.scope,\r
+                               more_colors_title : ed.getLang('more_colors')\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton;\r
+                       c = new cls(id, s);\r
+                       ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       // Remove the menu element when the editor is removed\r
+                       ed.onRemove.add(function() {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createToolbar : function(id, s, cc) {\r
+                       var c, t = this, cls;\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.toolbar || tinymce.ui.Toolbar;\r
+                       c = new cls(id, s);\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createSeparator : function(cc) {\r
+                       var cls = cc || this._cls.separator || tinymce.ui.Separator;\r
+\r
+                       return new cls();\r
+               },\r
+\r
+               setControlType : function(n, c) {\r
+                       return this._cls[n.toLowerCase()] = c;\r
+               },\r
+\r
+               destroy : function() {\r
+                       each(this.controls, function(c) {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       this.controls = null;\r
+               }\r
+\r
+               });\r
+})();\r
+\r
+/* file:jscripts/tiny_mce/classes/WindowManager.js */\r
+\r
+(function() {\r
+       var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera;\r
+\r
+       tinymce.create('tinymce.WindowManager', {\r
+               WindowManager : function(ed) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+                       t.onOpen = new Dispatcher(t);\r
+                       t.onClose = new Dispatcher(t);\r
+                       t.params = {};\r
+                       t.features = {};\r
+               },\r
+\r
+               open : function(s, p) {\r
+                       var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;\r
+\r
+                       // Default some options\r
+                       s = s || {};\r
+                       p = p || {};\r
+                       sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window\r
+                       sh = isOpera ? vp.h : screen.height;\r
+                       s.name = s.name || 'mc_' + new Date().getTime();\r
+                       s.width = parseInt(s.width || 320);\r
+                       s.height = parseInt(s.height || 240);\r
+                       s.resizable = true;\r
+                       s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0);\r
+                       s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0);\r
+                       p.inline = false;\r
+                       p.mce_width = s.width;\r
+                       p.mce_height = s.height;\r
+                       p.mce_auto_focus = s.auto_focus;\r
+\r
+                       if (mo) {\r
+                               if (isIE) {\r
+                                       s.center = true;\r
+                                       s.help = false;\r
+                                       s.dialogWidth = s.width + 'px';\r
+                                       s.dialogHeight = s.height + 'px';\r
+                                       s.scroll = s.scrollbars || false;\r
+                               } else\r
+                                       s.modal = s.alwaysRaised = s.dialog = s.centerscreen = s.dependent = true;\r
+                       }\r
+\r
+                       // Build features string\r
+                       each(s, function(v, k) {\r
+                               if (tinymce.is(v, 'boolean'))\r
+                                       v = v ? 'yes' : 'no';\r
+\r
+                               if (!/^(name|url)$/.test(k)) {\r
+                                       if (isIE && mo)\r
+                                               f += (f ? ';' : '') + k + ':' + v;\r
+                                       else\r
+                                               f += (f ? ',' : '') + k + '=' + v;\r
+                               }\r
+                       });\r
+\r
+                       t.features = s;\r
+                       t.params = p;\r
+                       t.onOpen.dispatch(t, s, p);\r
+\r
+                       u = s.url || s.file;\r
+                       if (tinymce.relaxedDomain)\r
+                               u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;\r
+\r
+                       try {\r
+                               if (isIE && mo) {\r
+                                       w = 1;\r
+                                       window.showModalDialog(s.url || s.file, window, f);\r
+                               } else\r
+                                       w = window.open(u, s.name, f);\r
+                       } catch (ex) {\r
+                               // Ignore\r
+                       }\r
+\r
+                       if (!w)\r
+                               alert(t.editor.getLang('popup_blocked'));\r
+               },\r
+\r
+               close : function(w) {\r
+                       w.close();\r
+                       this.onClose.dispatch(this);\r
+               },\r
+\r
+               createInstance : function(cl, a, b, c, d, e) {\r
+                       var f = tinymce.resolve(cl);\r
+\r
+                       return new f(a, b, c, d, e);\r
+               },\r
+\r
+               confirm : function(t, cb, s) {\r
+                       cb.call(s || this, confirm(this._decode(this.editor.getLang(t, t))));\r
+               },\r
+\r
+               alert : function(tx, cb, s) {\r
+                       var t = this;\r
+       \r
+                       alert(t._decode(t.editor.getLang(tx, tx)));\r
+\r
+                       if (cb)\r
+                               cb.call(s || t);\r
+               },\r
+\r
+               // Internal functions\r
+\r
+               _decode : function(s) {\r
+                       return tinymce.DOM.decode(s).replace(/\\n/g, '\n');\r
+               }\r
+\r
+               });\r
+}());
\ No newline at end of file
index add2aa5a1a185e82ea58cd000b3b5d782fa83e07..9b40922c018888e9a16588e82caeac6978ad6217 100644 (file)
@@ -1,61 +1,61 @@
-/**
- * $Id: editable_selects.js 162 2007-01-03 16:16:52Z spocke $
- *
- * Makes select boxes editable.
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-var TinyMCE_EditableSelects = {
-       editSelectElm : null,
-
-       init : function() {
-               var nl = document.getElementsByTagName("select"), i, d = document, o;
-
-               for (i=0; i<nl.length; i++) {
-                       if (nl[i].className.indexOf('mceEditableSelect') != -1) {
-                               o = new Option('(value)', '__mce_add_custom__');
-
-                               o.className = 'mceAddSelectValue';
-
-                               nl[i].options[nl[i].options.length] = o;
-                               nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);');
-                       }
-               }
-       },
-
-       onChangeEditableSelect : function(se) {
-               var d = document, ne;
-
-               if (se.options[se.selectedIndex].value == '__mce_add_custom__') {
-                       ne = d.createElement("input");
-                       ne.id = se.id + "_custom";
-                       ne.name = se.name + "_custom";
-                       ne.type = "text";
-
-                       ne.style.width = se.clientWidth;
-                       se.parentNode.insertBefore(ne, se);
-                       se.style.display = 'none';
-                       ne.focus();
-                       ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;
-                       TinyMCE_EditableSelects.editSelectElm = se;
-               }
-       },
-
-       onBlurEditableSelectInput : function() {
-               var se = TinyMCE_EditableSelects.editSelectElm;
-
-               if (se) {
-                       if (se.previousSibling.value != '') {
-                               addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);
-                               selectByValue(document.forms[0], se.id, se.previousSibling.value);
-                       } else
-                               selectByValue(document.forms[0], se.id, '');
-
-                       se.style.display = 'inline';
-                       se.parentNode.removeChild(se.previousSibling);
-                       TinyMCE_EditableSelects.editSelectElm = null;
-               }
-       }
-};
+/**\r
+ * $Id: editable_selects.js 520 2008-01-07 16:30:32Z spocke $\r
+ *\r
+ * Makes select boxes editable.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, 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].onchange = TinyMCE_EditableSelects.onChangeEditableSelect;\r
+                       }\r
+               }\r
+       },\r
+\r
+       onChangeEditableSelect : function(e) {\r
+               var d = document, ne, se = window.event ? window.event.srcElement : e.target;\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.offsetWidth + 'px';\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
index 110a720e03db872580cda078400ee30218215f6c..c1f14090473feaf7bfb85a0b8650e9d789d36be1 100644 (file)
-/**
- * $Id: form_utils.js 162 2007-01-03 16:16:52Z spocke $
- *
- * Various form utilitiy functions.
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme");
-
-function getColorPickerHTML(id, target_form_element) {
-       var h = "";
-
-       h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';
-       h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"';
-       h += ' onmouseover="this.className=\'mceButtonOver\'"';
-       h += ' onmouseout="this.className=\'mceButtonNormal\'"';
-       h += ' onmousedown="this.className=\'mceButtonDown\'"';
-       h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
-       h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
-
-       return h;
-}
-
-function pickColor(e, target_form_element) {
-       if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")
-               tinyMCEPopup.pickColor(e, target_form_element);
-}
-
-function updateColor(img_id, form_element_id) {
-       document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;
-}
-
-function setBrowserDisabled(id, state) {
-       var img = document.getElementById(id);
-       var lnk = document.getElementById(id + "_link");
-
-       if (lnk) {
-               if (state) {
-                       lnk.setAttribute("realhref", lnk.getAttribute("href"));
-                       lnk.removeAttribute("href");
-                       tinyMCE.switchClass(img, 'mceButtonDisabled', true);
-               } else {
-                       lnk.setAttribute("href", lnk.getAttribute("realhref"));
-                       tinyMCE.switchClass(img, 'mceButtonNormal', false);
-               }
-       }
-}
-
-function getBrowserHTML(id, target_form_element, type, prefix) {
-       var option = prefix + "_" + type + "_browser_callback";
-       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
-       if (cb == null)
-               return "";
-
-       var html = "";
-
-       html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';
-       html += '<img id="' + id + '" src="' + themeBaseURL + '/images/browse.gif"';
-       html += ' onmouseover="this.className=\'mceButtonOver\';"';
-       html += ' onmouseout="this.className=\'mceButtonNormal\';"';
-       html += ' onmousedown="this.className=\'mceButtonDown\';"';
-       html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
-       html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
-
-       return html;
-}
-
-function openBrower(img_id, target_form_element, type, option) {
-       var img = document.getElementById(img_id);
-
-       if (img.className != "mceButtonDisabled")
-               tinyMCEPopup.openBrowser(target_form_element, type, option);
-}
-
-function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {
-       if (!form_obj || !form_obj.elements[field_name])
-               return;
-
-       var sel = form_obj.elements[field_name];
-
-       var found = false;
-       for (var i=0; i<sel.options.length; i++) {
-               var option = sel.options[i];
-
-               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {
-                       option.selected = true;
-                       found = true;
-               } else
-                       option.selected = false;
-       }
-
-       if (!found && add_custom && value != '') {
-               var option = new Option(value, value);
-               option.selected = true;
-               sel.options[sel.options.length] = option;
-               sel.selectedIndex = sel.options.length - 1;
-       }
-
-       return found;
-}
-
-function getSelectValue(form_obj, field_name) {
-       var elm = form_obj.elements[field_name];
-
-       if (elm == null || elm.options == null)
-               return "";
-
-       return elm.options[elm.selectedIndex].value;
-}
-
-function addSelectValue(form_obj, field_name, name, value) {
-       var s = form_obj.elements[field_name];
-       var o = new Option(name, value);
-       s.options[s.options.length] = o;
-}
-
-function addClassesToList(list_id, specific_option) {
-       // Setup class droplist
-       var styleSelectElm = document.getElementById(list_id);
-       var styles = tinyMCE.getParam('theme_advanced_styles', false);
-       styles = tinyMCE.getParam(specific_option, styles);
-
-       if (styles) {
-               var stylesAr = styles.split(';');
-
-               for (var i=0; i<stylesAr.length; i++) {
-                       if (stylesAr != "") {
-                               var key, value;
-
-                               key = stylesAr[i].split('=')[0];
-                               value = stylesAr[i].split('=')[1];
-
-                               styleSelectElm.options[styleSelectElm.length] = new Option(key, value);
-                       }
-               }
-       } else {
-               // Use auto impored classes
-               var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));
-               for (var i=0; i<csses.length; i++)
-                       styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);
-       }
-}
-
-function isVisible(element_id) {
-       var elm = document.getElementById(element_id);
-
-       return elm && elm.style.display != "none";
-}
-
-function convertRGBToHex(col) {
-       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
-
-       var rgb = col.replace(re, "$1,$2,$3").split(',');
-       if (rgb.length == 3) {
-               r = parseInt(rgb[0]).toString(16);
-               g = parseInt(rgb[1]).toString(16);
-               b = parseInt(rgb[2]).toString(16);
-
-               r = r.length == 1 ? '0' + r : r;
-               g = g.length == 1 ? '0' + g : g;
-               b = b.length == 1 ? '0' + b : b;
-
-               return "#" + r + g + b;
-       }
-
-       return col;
-}
-
-function convertHexToRGB(col) {
-       if (col.indexOf('#') != -1) {
-               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
-
-               r = parseInt(col.substring(0, 2), 16);
-               g = parseInt(col.substring(2, 4), 16);
-               b = parseInt(col.substring(4, 6), 16);
-
-               return "rgb(" + r + "," + g + "," + b + ")";
-       }
-
-       return col;
-}
-
-function trimSize(size) {
-       return size.replace(new RegExp('[^0-9%]', 'gi'), '');
-}
-
-function getCSSSize(size) {
-       size = trimSize(size);
-
-       if (size == "")
-               return "";
-
-       return size.indexOf('%') != -1 ? size : size + "px";
-}
-
-function getStyle(elm, attrib, style) {
-       var val = tinyMCE.getAttrib(elm, attrib);
-
-       if (val != '')
-               return '' + val;
-
-       if (typeof(style) == 'undefined')
-               style = attrib;
-
-       val = eval('elm.style.' + style);
-
-       return val == null ? '' : '' + val;
-}
+/**\r
+ * $Id: form_utils.js 673 2008-03-06 13:26:20Z spocke $\r
+ *\r
+ * Various form utilitiy functions.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme"));\r
+\r
+function getColorPickerHTML(id, target_form_element) {\r
+       var h = "";\r
+\r
+       h += '<a id="' + id + '_link" href="javascript:;" onclick="tinyMCEPopup.pickColor(event,\'' + target_form_element +'\');" onmousedown="return false;" class="pickcolor">';\r
+       h += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"></span></a>';\r
+\r
+       return h;\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
+                       tinyMCEPopup.dom.addClass(img, 'disabled');\r
+               } else {\r
+                       if (lnk.getAttribute("realhref"))\r
+                               lnk.setAttribute("href", lnk.getAttribute("realhref"));\r
+\r
+                       tinyMCEPopup.dom.removeClass(img, 'disabled');\r
+               }\r
+       }\r
+}\r
+\r
+function getBrowserHTML(id, target_form_element, type, prefix) {\r
+       var option = prefix + "_" + type + "_browser_callback", cb, html;\r
+\r
+       cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback"));\r
+\r
+       if (!cb)\r
+               return "";\r
+\r
+       html = "";\r
+       html += '<a id="' + id + '_link" href="javascript:openBrowser(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;" class="browse">';\r
+       html += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"></span></a>';\r
+\r
+       return html;\r
+}\r
+\r
+function openBrowser(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 = tinyMCEPopup.getParam('theme_advanced_styles', false);\r
+       styles = tinyMCEPopup.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
+               tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) {\r
+                       styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']);\r
+               });\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(/([0-9\.]+)px|(%|in|cm|mm|em|ex|pt|pc)/, '$1$2');\r
+}\r
+\r
+function getCSSSize(size) {\r
+       size = trimSize(size);\r
+\r
+       if (size == "")\r
+               return "";\r
+\r
+       // Add px\r
+       if (/^[0-9]+$/.test(size))\r
+               size += 'px';\r
+\r
+       return size;\r
+}\r
+\r
+function getStyle(elm, attrib, style) {\r
+       var val = tinyMCEPopup.dom.getAttrib(elm, attrib);\r
+\r
+       if (val != '')\r
+               return '' + val;\r
+\r
+       if (typeof(style) == 'undefined')\r
+               style = attrib;\r
+\r
+       return tinyMCEPopup.dom.getStyle(elm, style);\r
+}\r
diff --git a/program/js/tiny_mce/utils/mclayer.js b/program/js/tiny_mce/utils/mclayer.js
deleted file mode 100644 (file)
index 23982db..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $
- *
- * Moxiecode floating layer script.
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-function MCLayer(id) {
-       this.id = id;
-       this.settings = new Array();
-       this.blockerElement = null;
-       this.isMSIE = navigator.appName == "Microsoft Internet Explorer";
-       this.events = false;
-       this.autoHideCallback = null;
-}
-
-MCLayer.prototype = {
-       moveRelativeTo : function(re, p, a) {
-               var rep = this.getAbsPosition(re);
-               var w = parseInt(re.offsetWidth);
-               var h = parseInt(re.offsetHeight);
-               var x, y;
-
-               switch (p) {
-                       case "tl":
-                               break;
-
-                       case "tr":
-                               x = rep.absLeft + w;
-                               y = rep.absTop;
-                               break;
-
-                       case "bl":
-                               break;
-
-                       case "br":
-                               break;
-               }
-
-               this.moveTo(x, y);
-       },
-
-       moveBy : function(dx, dy) {
-               var e = this.getElement();
-               var x = parseInt(e.style.left);
-               var y = parseInt(e.style.top);
-
-               e.style.left = (x + dx) + "px";
-               e.style.top = (y + dy) + "px";
-
-               this.updateBlocker();
-       },
-
-       moveTo : function(x, y) {
-               var e = this.getElement();
-
-               e.style.left = x + "px";
-               e.style.top = y + "px";
-
-               this.updateBlocker();
-       },
-
-       show : function() {
-               MCLayer.visibleLayer = this;
-
-               this.getElement().style.display = 'block';
-               this.updateBlocker();
-       },
-
-       hide : function() {
-               this.getElement().style.display = 'none';
-               this.updateBlocker();
-       },
-
-       setAutoHide : function(s, cb) {
-               this.autoHideCallback = cb;
-               this.registerEventHandlers();
-       },
-
-       getElement : function() {
-               return document.getElementById(this.id);
-       },
-
-       updateBlocker : function() {
-               if (!this.isMSIE)
-                       return;
-
-               var e = this.getElement();
-               var b = this.getBlocker();
-               var x = this.parseInt(e.style.left);
-               var y = this.parseInt(e.style.top);
-               var w = this.parseInt(e.offsetWidth);
-               var 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;
-       },
-
-       getBlocker : function() {
-               if (!this.blockerElement) {
-                       var d = document, b = d.createElement("iframe");
-
-                       b.style.cssText = 'display: none; left: 0px; position: absolute; 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;
-       },
-
-       registerEventHandlers : function() {
-               if (!this.events) {
-                       var d = document;
-
-                       this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown);
-
-                       this.events = true;
-               }
-       },
-
-       addEvent : function(o, n, h) {
-               if (o.attachEvent)
-                       o.attachEvent("on" + n, h);
-               else
-                       o.addEventListener(n, h, false);
-       },
-
-       onMouseDown : function(e) {
-               e = typeof(e) == "undefined" ? window.event : e;
-               var b = document.body;
-               var l = MCLayer.visibleLayer;
-
-               if (l) {
-                       var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX;
-                       var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY;
-                       var el = l.getElement();
-                       var x = parseInt(el.style.left);
-                       var y = parseInt(el.style.top);
-                       var w = parseInt(el.offsetWidth);
-                       var h = parseInt(el.offsetHeight);
-
-                       if (!(mx > x && mx < x + w && my > y && my < y + h)) {
-                               MCLayer.visibleLayer = null;
-
-                               if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my))
-                                       return true;
-
-                               l.hide();
-                       }
-               }
-       },
-
-       addCSSClass : function(e, c) {
-               this.removeCSSClass(e, c);
-               var a = this.explode(' ', e.className);
-               a[a.length] = c;
-               e.className = a.join(' ');
-       },
-
-       removeCSSClass : function(e, c) {
-               var a = this.explode(' ', e.className), i;
-
-               for (i=0; i<a.length; i++) {
-                       if (a[i] == c)
-                               a[i] = '';
-               }
-
-               e.className = a.join(' ');
-       },
-
-       explode : function(d, s) {
-               var ar = s.split(d);
-               var oar = new Array();
-
-               for (var i = 0; i<ar.length; i++) {
-                       if (ar[i] != "")
-                               oar[oar.length] = ar[i];
-               }
-
-               return oar;
-       },
-
-       parseInt : function(s) {
-               if (s == null || s == '')
-                       return 0;
-
-               return parseInt(s);
-       }
-}
index d6434028340f9ec652dc856b1728f8aa828e33f2..284501ee9470f0598bef0c174073cf65c5c8e83d 100644 (file)
@@ -1,74 +1,76 @@
-/**
- * $Id: mctabs.js 162 2007-01-03 16:16:52Z spocke $
- *
- * Moxiecode DHTML Tabs script.
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-function MCTabs() {
-       this.settings = new Array();
-};
-
-MCTabs.prototype.init = function(settings) {
-       this.settings = settings;
-};
-
-MCTabs.prototype.getParam = function(name, default_value) {
-       var value = null;
-
-       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
-
-       // Fix bool values
-       if (value == "true" || value == "false")
-               return (value == "true");
-
-       return value;
-};
-
-MCTabs.prototype.displayTab = function(tab_id, panel_id) {
-       var panelElm = document.getElementById(panel_id);
-       var panelContainerElm = panelElm ? panelElm.parentNode : null;
-       var tabElm = document.getElementById(tab_id);
-       var tabContainerElm = tabElm ? tabElm.parentNode : null;
-       var selectionClass = this.getParam('selection_class', 'current');
-
-       if (tabElm && tabContainerElm) {
-               var nodes = tabContainerElm.childNodes;
-
-               // Hide all other tabs
-               for (var i=0; i<nodes.length; i++) {
-                       if (nodes[i].nodeName == "LI")
-                               nodes[i].className = '';
-               }
-
-               // Show selected tab
-               tabElm.className = 'current';
-       }
-
-       if (panelElm && panelContainerElm) {
-               var nodes = panelContainerElm.childNodes;
-
-               // Hide all other panels
-               for (var i=0; i<nodes.length; i++) {
-                       if (nodes[i].nodeName == "DIV")
-                               nodes[i].className = 'panel';
-               }
-
-               // Show selected panel
-               panelElm.className = 'current';
-       }
-};
-
-MCTabs.prototype.getAnchor = function() {
-       var pos, url = document.location.href;
-
-       if ((pos = url.lastIndexOf('#')) != -1)
-               return url.substring(pos + 1);
-
-       return "";
-};
-
-// Global instance
-var mcTabs = new MCTabs();
+/**\r
+ * $Id: mctabs.js 758 2008-03-30 13:53:29Z spocke $\r
+ *\r
+ * Moxiecode DHTML Tabs script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function MCTabs() {\r
+       this.settings = [];\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, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i;\r
+\r
+       panelElm= document.getElementById(panel_id);\r
+       panelContainerElm = panelElm ? panelElm.parentNode : null;\r
+       tabElm = document.getElementById(tab_id);\r
+       tabContainerElm = tabElm ? tabElm.parentNode : null;\r
+       selectionClass = this.getParam('selection_class', 'current');\r
+\r
+       if (tabElm && tabContainerElm) {\r
+               nodes = tabContainerElm.childNodes;\r
+\r
+               // Hide all other tabs\r
+               for (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
+               nodes = panelContainerElm.childNodes;\r
+\r
+               // Hide all other panels\r
+               for (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
index 92b44edc02e7cf52a4067217b4cc3047054013ee..cde4c979851f50539fc9d8fea3198cce47b72cec 100644 (file)
-/**
- * $Id: validate.js 162 2007-01-03 16:16:52Z spocke $
- *
- * Various form validation methods.
- *
- * @author Moxiecode
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/**
-       // String validation:
-
-       if (!Validator.isEmail('myemail'))
-               alert('Invalid email.');
-
-       // Form validation:
-
-       var f = document.forms['myform'];
-
-       if (!Validator.isEmail(f.myemail))
-               alert('Invalid email.');
-*/
-
-var Validator = {
-       isEmail : function(s) {
-               return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');
-       },
-
-       isAbsUrl : function(s) {
-               return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');
-       },
-
-       isSize : function(s) {
-               return this.test(s, '^[0-9]+(px|%)?$');
-       },
-
-       isId : function(s) {
-               return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$');
-       },
-
-       isEmpty : function(s) {
-               var nl, i;
-
-               if (s.nodeName == 'SELECT' && s.selectedIndex < 1)
-                       return true;
-
-               if (s.type == 'checkbox' && !s.checked)
-                       return true;
-
-               if (s.type == 'radio') {
-                       for (i=0, nl = s.form.elements; i<nl.length; i++) {
-                               if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked)
-                                       return false;
-                       }
-
-                       return true;
-               }
-
-               return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s);
-       },
-
-       isNumber : function(s, d) {
-               return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$'));
-       },
-
-       test : function(s, p) {
-               s = s.nodeType == 1 ? s.value : s;
-
-               return s == '' || new RegExp(p).test(s);
-       }
-};
-
-var AutoValidator = {
-       settings : {
-               id_cls : 'id',
-               int_cls : 'int',
-               url_cls : 'url',
-               number_cls : 'number',
-               email_cls : 'email',
-               size_cls : 'size',
-               required_cls : 'required',
-               invalid_cls : 'invalid',
-               min_cls : 'min',
-               max_cls : 'max'
-       },
-
-       init : function(s) {
-               var n;
-
-               for (n in s)
-                       this.settings[n] = s[n];
-       },
-
-       validate : function(f) {
-               var i, nl, s = this.settings, c = 0;
-
-               nl = this.tags(f, 'label');
-               for (i=0; i<nl.length; i++)
-                       this.removeClass(nl[i], s.invalid_cls);
-
-               c += this.validateElms(f, 'input');
-               c += this.validateElms(f, 'select');
-               c += this.validateElms(f, 'textarea');
-
-               return c == 3;
-       },
-
-       invalidate : function(n) {
-               this.mark(n.form, n);
-       },
-
-       reset : function(e) {
-               var t = new Array('label', 'input', 'select', 'textarea');
-               var i, j, nl, s = this.settings;
-
-               if (e == null)
-                       return;
-
-               for (i=0; i<t.length; i++) {
-                       nl = this.tags(e.form ? e.form : e, t[i]);
-                       for (j=0; j<nl.length; j++)
-                               this.removeClass(nl[j], s.invalid_cls);
-               }
-       },
-
-       validateElms : function(f, e) {
-               var nl, i, n, s = this.settings, st = true, va = Validator, v;
-
-               nl = this.tags(f, e);
-               for (i=0; i<nl.length; i++) {
-                       n = nl[i];
-
-                       this.removeClass(n, s.invalid_cls);
-
-                       if (this.hasClass(n, s.required_cls) && va.isEmpty(n))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.number_cls) && !va.isNumber(n))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.email_cls) && !va.isEmail(n))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.size_cls) && !va.isSize(n))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.id_cls) && !va.isId(n))
-                               st = this.mark(f, n);
-
-                       if (this.hasClass(n, s.min_cls, true)) {
-                               v = this.getNum(n, s.min_cls);
-
-                               if (isNaN(v) || parseInt(n.value) < parseInt(v))
-                                       st = this.mark(f, n);
-                       }
-
-                       if (this.hasClass(n, s.max_cls, true)) {
-                               v = this.getNum(n, s.max_cls);
-
-                               if (isNaN(v) || parseInt(n.value) > parseInt(v))
-                                       st = this.mark(f, n);
-                       }
-               }
-
-               return st;
-       },
-
-       hasClass : function(n, c, d) {
-               return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className);
-       },
-
-       getNum : function(n, c) {
-               c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0];
-               c = c.replace(/[^0-9]/g, '');
-
-               return c;
-       },
-
-       addClass : function(n, c, b) {
-               var o = this.removeClass(n, c);
-               n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;
-       },
-
-       removeClass : function(n, c) {
-               c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');
-               return n.className = c != ' ' ? c : '';
-       },
-
-       tags : function(f, s) {
-               return f.getElementsByTagName(s);
-       },
-
-       mark : function(f, n) {
-               var s = this.settings;
-
-               this.addClass(n, s.invalid_cls);
-               this.markLabels(f, n, s.invalid_cls);
-
-               return false;
-       },
-
-       markLabels : function(f, n, ic) {
-               var nl, i;
-
-               nl = this.tags(f, "label");
-               for (i=0; i<nl.length; i++) {
-                       if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id)
-                               this.addClass(nl[i], ic);
-               }
-
-               return null;
-       }
-};
+/**\r
+ * $Id: validate.js 758 2008-03-30 13:53:29Z spocke $\r
+ *\r
+ * Various form validation methods.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2008, 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]+(%|in|cm|mm|em|ex|pt|pc|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 = ['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
diff --git a/program/lib/._enriched.inc b/program/lib/._enriched.inc
new file mode 100644 (file)
index 0000000..a30e55e
Binary files /dev/null and b/program/lib/._enriched.inc differ
diff --git a/program/lib/._utf7.inc b/program/lib/._utf7.inc
new file mode 100644 (file)
index 0000000..b8f1889
Binary files /dev/null and b/program/lib/._utf7.inc differ
diff --git a/program/lib/._washtml.php b/program/lib/._washtml.php
new file mode 100644 (file)
index 0000000..ee0df99
Binary files /dev/null and b/program/lib/._washtml.php differ
diff --git a/program/lib/html2text.inc b/program/lib/html2text.inc
deleted file mode 100644 (file)
index 7d7d9d1..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-<?php
-
-/*************************************************************************
-*                                                                       *
-* class.html2text.inc                                                   *
-*                                                                       *
-*************************************************************************
-*                                                                       *
-* Converts HTML to formatted plain text                                 *
-*                                                                       *
-* Copyright (c) 2005 Jon Abernathy <jon@chuggnutt.com>                  *
-* All rights reserved.                                                  *
-*                                                                       *
-* This script is free software; you can redistribute it and/or modify   *
-* it under the terms of the GNU General Public License as published by  *
-* the Free Software Foundation; either version 2 of the License, or     *
-* (at your option) any later version.                                   *
-*                                                                       *
-* The GNU General Public License can be found at                        *
-* http://www.gnu.org/copyleft/gpl.html.                                 *
-*                                                                       *
-* This script is distributed in the hope that it will be useful,        *
-* but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the          *
-* GNU General Public License for more details.                          *
-*                                                                       *
-* Author(s): Jon Abernathy <jon@chuggnutt.com>                          *
-*                                                                       *
-* Last modified: 04/06/05                                               *
-* Modified: 2004/05/19 (tbr)                                            *
-*                                                                       *
-*************************************************************************/
-
-
-/**
-*  Takes HTML and converts it to formatted, plain text.
-*
-*  Thanks to Alexander Krug (http://www.krugar.de/) to pointing out and
-*  correcting an error in the regexp search array. Fixed 7/30/03.
-*
-*  Updated set_html() function's file reading mechanism, 9/25/03.
-*
-*  Thanks to Joss Sanglier (http://www.dancingbear.co.uk/) for adding
-*  several more HTML entity codes to the $search and $replace arrays.
-*  Updated 11/7/03.
-*
-*  Thanks to Darius Kasperavicius (http://www.dar.dar.lt/) for
-*  suggesting the addition of $allowed_tags and its supporting function
-*  (which I slightly modified). Updated 3/12/04.
-*
-*  Thanks to Justin Dearing for pointing out that a replacement for the
-*  <TH> tag was missing, and suggesting an appropriate fix.
-*  Updated 8/25/04.
-*
-*  Thanks to Mathieu Collas (http://www.myefarm.com/) for finding a
-*  display/formatting bug in the _build_link_list() function: email
-*  readers would show the left bracket and number ("[1") as part of the
-*  rendered email address.
-*  Updated 12/16/04.
-*
-*  Thanks to Wojciech Bajon (http://histeria.pl/) for submitting code
-*  to handle relative links, which I hadn't considered. I modified his
-*  code a bit to handle normal HTTP links and MAILTO links. Also for
-*  suggesting three additional HTML entity codes to search for.
-*  Updated 03/02/05.
-*
-*  Thanks to Jacob Chandler for pointing out another link condition
-*  for the _build_link_list() function: "https".
-*  Updated 04/06/05.
-*
-*  @author Jon Abernathy <jon@chuggnutt.com>
-*  @version 0.6.1
-*  @since PHP 4.0.2
-*/
-class html2text
-{
-
-    /**
-     *  Contains the HTML content to convert.
-     *
-     *  @var string $html
-     *  @access public
-     */
-    var $html;
-
-    /**
-     *  Contains the converted, formatted text.
-     *
-     *  @var string $text
-     *  @access public
-     */
-    var $text;
-
-    /**
-     *  Maximum width of the formatted text, in columns.
-     *
-     *  @var integer $width
-     *  @access public
-     */
-    var $width = 70;
-
-    /**
-     *  List of preg* regular expression patterns to search for,
-     *  used in conjunction with $replace.
-     *
-     *  @var array $search
-     *  @access public
-     *  @see $replace
-     */
-    var $search = array(
-        "/\r/",                                  // Non-legal carriage return
-        "/[\n\t]+/",                             // Newlines and tabs
-        '/<script[^>]*>.*?<\/script>/i',         // <script>s -- which strip_tags supposedly has problems with
-        //'/<!-- .* -->/',                         // Comments -- which strip_tags might have problem a with
-        '/<a [^>]*href=("|\')([^"\']+)\1[^>]*>(.+?)<\/a>/ie', // <a href="">
-        '/<h[123][^>]*>(.+?)<\/h[123]>/ie',      // H1 - H3
-        '/<h[456][^>]*>(.+?)<\/h[456]>/ie',      // H4 - H6
-        '/<p[^>]*>/i',                           // <P>
-        '/<br[^>]*>/i',                          // <br>
-        '/<b[^>]*>(.+?)<\/b>/ie',                // <b>
-        '/<i[^>]*>(.+?)<\/i>/i',                 // <i>
-        '/(<ul[^>]*>|<\/ul>)/i',                 // <ul> and </ul>
-        '/(<ol[^>]*>|<\/ol>)/i',                 // <ol> and </ol>
-        '/<li[^>]*>/i',                          // <li>
-        '/<hr[^>]*>/i',                          // <hr>
-        '/(<table[^>]*>|<\/table>)/i',           // <table> and </table>
-        '/(<tr[^>]*>|<\/tr>)/i',                 // <tr> and </tr>
-        '/<td[^>]*>(.+?)<\/td>/i',               // <td> and </td>
-        '/<th[^>]*>(.+?)<\/th>/ie',              // <th> and </th>
-        '/&nbsp;/i',
-        '/&quot;/i',
-        '/&gt;/i',
-        '/&lt;/i',
-        '/&(amp|#38);/i',
-        '/&copy;/i',
-        '/&trade;/i',
-        '/&#8220;/',
-        '/&#8221;/',
-        '/&#8211;/',
-        '/&#(8217|39);/',
-        '/&#169;/',
-        '/&#8482;/',
-        '/&#151;/',
-        '/&#147;/',
-        '/&#148;/',
-        '/&#149;/',
-        '/&reg;/i',
-        '/&bull;/i',
-        '/&[&;]+;/i'
-    );
-
-    /**
-     *  List of pattern replacements corresponding to patterns searched.
-     *
-     *  @var array $replace
-     *  @access public
-     *  @see $search
-     */
-    var $replace = array(
-        '',                                     // Non-legal carriage return
-        ' ',                                    // Newlines and tabs
-        '',                                     // <script>s -- which strip_tags supposedly has problems with
-        //'',                                  // Comments -- which strip_tags might have problem a with
-        '$this->_build_link_list("\\2", "\\3")', // <a href="">
-        "strtoupper(\"\n\n\\1\n\n\")",          // H1 - H3
-        "ucwords(\"\n\n\\1\n\")",               // H4 - H6
-        "\n\n",                                 // <P>
-        "\n",                                   // <br>
-        'strtoupper("\\1")',                    // <b>
-        '_\\1_',                                // <i>
-        "\n\n",                                 // <ul> and </ul>
-        "\n\n",                                 // <ol> and </ol>
-        "\t*",                                  // <li>
-        "\n-------------------------\n",        // <hr>
-        "\n\n",                                 // <table> and </table>
-        "\n",                                   // <tr> and </tr>
-        "\t\t\\1\n",                            // <td> and </td>
-        "strtoupper(\"\t\t\\1\n\")",            // <th> and </th>
-        ' ',
-        '"',
-        '>',
-        '<',
-        '&',
-        '(c)',
-        '(tm)',
-        '"',
-        '"',
-        '-',
-        "'",
-        '(c)',
-        '(tm)',
-        '--',
-        '"',
-        '"',
-        '*',
-        '(R)',
-        '*',
-        ''
-    );
-
-    /**
-     *  Contains a list of HTML tags to allow in the resulting text.
-     *
-     *  @var string $allowed_tags
-     *  @access public
-     *  @see set_allowed_tags()
-     */
-    var $allowed_tags = '';
-
-    /**
-     *  Contains the base URL that relative links should resolve to.
-     *
-     *  @var string $url
-     *  @access public
-     */
-    var $url;
-
-    /**
-     *  Indicates whether content in the $html variable has been converted yet.
-     *
-     *  @var boolean $converted
-     *  @access private
-     *  @see $html, $text
-     */
-    var $_converted = false;
-
-    /**
-     *  Contains URL addresses from links to be rendered in plain text.
-     *
-     *  @var string $link_list
-     *  @access private
-     *  @see _build_link_list()
-     */
-    var $_link_list = array();
-    
-    /**
-     * Boolean flag, true if a table of link URLs should be listed after the text.
-     * 
-     * @var boolean $_do_links
-     * @access private
-     * @see html2text()
-     */
-    var $_do_links = true;
-
-    /**
-     *  Constructor.
-     *
-     *  If the HTML source string (or file) is supplied, the class
-     *  will instantiate with that source propagated, all that has
-     *  to be done it to call get_text().
-     *
-     *  @param string $source HTML content
-     *  @param boolean $from_file Indicates $source is a file to pull content from
-     *  @param boolean $do_link_table indicate whether a table of link URLs is desired
-     *  @access public
-     *  @return void
-     */
-    function html2text( $source = '', $from_file = false, $produce_link_table = true )
-    {
-        if ( !empty($source) ) {
-            $this->set_html($source, $from_file);
-        }
-        $this->set_base_url();
-        $this->_do_links = $produce_link_table;
-    }
-
-    /**
-     *  Loads source HTML into memory, either from $source string or a file.
-     *
-     *  @param string $source HTML content
-     *  @param boolean $from_file Indicates $source is a file to pull content from
-     *  @access public
-     *  @return void
-     */
-    function set_html( $source, $from_file = false )
-    {
-        $this->html = $source;
-
-        if ( $from_file && file_exists($source) ) {
-            $fp = fopen($source, 'r');
-            $this->html = fread($fp, filesize($source));
-            fclose($fp);
-        }
-
-        $this->_converted = false;
-    }
-
-    /**
-     *  Returns the text, converted from HTML.
-     *
-     *  @access public
-     *  @return string
-     */
-    function get_text()
-    {
-        if ( !$this->_converted ) {
-            $this->_convert();
-        }
-
-        return $this->text;
-    }
-
-    /**
-     *  Prints the text, converted from HTML.
-     *
-     *  @access public
-     *  @return void
-     */
-    function print_text()
-    {
-        print $this->get_text();
-    }
-
-    /**
-     *  Alias to print_text(), operates identically.
-     *
-     *  @access public
-     *  @return void
-     *  @see print_text()
-     */
-    function p()
-    {
-        print $this->get_text();
-    }
-
-    /**
-     *  Sets the allowed HTML tags to pass through to the resulting text.
-     *
-     *  Tags should be in the form "<p>", with no corresponding closing tag.
-     *
-     *  @access public
-     *  @return void
-     */
-    function set_allowed_tags( $allowed_tags = '' )
-    {
-        if ( !empty($allowed_tags) ) {
-            $this->allowed_tags = $allowed_tags;
-        }
-    }
-
-    /**
-     *  Sets a base URL to handle relative links.
-     *
-     *  @access public
-     *  @return void
-     */
-    function set_base_url( $url = '' )
-    {
-        if ( empty($url) ) {
-            $this->url = 'http://' . $_SERVER['HTTP_HOST'];
-        } else {
-            // Strip any trailing slashes for consistency (relative
-            // URLs may already start with a slash like "/file.html")
-            if ( substr($url, -1) == '/' ) {
-                $url = substr($url, 0, -1);
-            }
-            $this->url = $url;
-        }
-    }
-
-    /**
-     *  Workhorse function that does actual conversion.
-     *
-     *  First performs custom tag replacement specified by $search and
-     *  $replace arrays. Then strips any remaining HTML tags, reduces whitespace
-     *  and newlines to a readable format, and word wraps the text to
-     *  $width characters.
-     *
-     *  @access private
-     *  @return void
-     */
-    function _convert()
-    {
-        // Variables used for building the link list
-        //$link_count = 1;
-        //$this->_link_list = '';
-
-        $text = trim(stripslashes($this->html));
-
-        // Run our defined search-and-replace
-        $text = preg_replace($this->search, $this->replace, $text);
-
-        // Strip any other HTML tags
-        $text = strip_tags($text, $this->allowed_tags);
-
-        // Bring down number of empty lines to 2 max
-        $text = preg_replace("/\n\s+\n/", "\n", $text);
-        $text = preg_replace("/[\n]{3,}/", "\n\n", $text);
-
-        // Add link list
-        if ( sizeof($this->_link_list) ) {
-            $text .= "\n\nLinks:\n------\n";
-            foreach ($this->_link_list as $id => $link) {
-                $text .= '[' . ($id+1) . '] ' . $link . "\n";
-            }
-        }
-
-        // Wrap the text to a readable format
-        // for PHP versions >= 4.0.2. Default width is 75
-        $text = wordwrap($text, $this->width);
-
-        $this->text = $text;
-
-        $this->_converted = true;
-    }
-
-    /**
-     *  Helper function called by preg_replace() on link replacement.
-     *
-     *  Maintains an internal list of links to be displayed at the end of the
-     *  text, with numeric indices to the original point in the text they
-     *  appeared. Also makes an effort at identifying and handling absolute
-     *  and relative links.
-     *
-     *  @param integer $link_count Counter tracking current link number
-     *  @param string $link URL of the link
-     *  @param string $display Part of the text to associate number with
-     *  @access private
-     *  @return string
-    */
-    function _build_link_list($link, $display)
-      {
-      if (! $this->_do_links) return $display;
-
-      $link_lc = strtolower($link);
-      
-      if (substr($link_lc, 0, 7) == 'http://' || substr($link_lc, 0, 8) == 'https://' || substr($link_lc, 0, 7) == 'mailto:')
-        {
-        $url = $link;
-        }
-      else
-        {
-        $url = $this->url;
-        if ($link{0} != '/') {
-             $url .= '/';
-            }
-        $url .= $link;
-        }
-
-      $index = array_search($url, $this->_link_list);
-      if ($index===FALSE)
-        {
-        $index = sizeof($this->_link_list);
-        $this->_link_list[$index] = $url;
-        }
-              
-      return $display . ' [' . ($index+1) . ']';
-      }
-}
-
-?>
\ No newline at end of file
diff --git a/program/lib/html2text.php b/program/lib/html2text.php
new file mode 100644 (file)
index 0000000..7d7d9d1
--- /dev/null
@@ -0,0 +1,451 @@
+<?php
+
+/*************************************************************************
+*                                                                       *
+* class.html2text.inc                                                   *
+*                                                                       *
+*************************************************************************
+*                                                                       *
+* Converts HTML to formatted plain text                                 *
+*                                                                       *
+* Copyright (c) 2005 Jon Abernathy <jon@chuggnutt.com>                  *
+* All rights reserved.                                                  *
+*                                                                       *
+* This script is free software; you can redistribute it and/or modify   *
+* it under the terms of the GNU General Public License as published by  *
+* the Free Software Foundation; either version 2 of the License, or     *
+* (at your option) any later version.                                   *
+*                                                                       *
+* The GNU General Public License can be found at                        *
+* http://www.gnu.org/copyleft/gpl.html.                                 *
+*                                                                       *
+* This script is distributed in the hope that it will be useful,        *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the          *
+* GNU General Public License for more details.                          *
+*                                                                       *
+* Author(s): Jon Abernathy <jon@chuggnutt.com>                          *
+*                                                                       *
+* Last modified: 04/06/05                                               *
+* Modified: 2004/05/19 (tbr)                                            *
+*                                                                       *
+*************************************************************************/
+
+
+/**
+*  Takes HTML and converts it to formatted, plain text.
+*
+*  Thanks to Alexander Krug (http://www.krugar.de/) to pointing out and
+*  correcting an error in the regexp search array. Fixed 7/30/03.
+*
+*  Updated set_html() function's file reading mechanism, 9/25/03.
+*
+*  Thanks to Joss Sanglier (http://www.dancingbear.co.uk/) for adding
+*  several more HTML entity codes to the $search and $replace arrays.
+*  Updated 11/7/03.
+*
+*  Thanks to Darius Kasperavicius (http://www.dar.dar.lt/) for
+*  suggesting the addition of $allowed_tags and its supporting function
+*  (which I slightly modified). Updated 3/12/04.
+*
+*  Thanks to Justin Dearing for pointing out that a replacement for the
+*  <TH> tag was missing, and suggesting an appropriate fix.
+*  Updated 8/25/04.
+*
+*  Thanks to Mathieu Collas (http://www.myefarm.com/) for finding a
+*  display/formatting bug in the _build_link_list() function: email
+*  readers would show the left bracket and number ("[1") as part of the
+*  rendered email address.
+*  Updated 12/16/04.
+*
+*  Thanks to Wojciech Bajon (http://histeria.pl/) for submitting code
+*  to handle relative links, which I hadn't considered. I modified his
+*  code a bit to handle normal HTTP links and MAILTO links. Also for
+*  suggesting three additional HTML entity codes to search for.
+*  Updated 03/02/05.
+*
+*  Thanks to Jacob Chandler for pointing out another link condition
+*  for the _build_link_list() function: "https".
+*  Updated 04/06/05.
+*
+*  @author Jon Abernathy <jon@chuggnutt.com>
+*  @version 0.6.1
+*  @since PHP 4.0.2
+*/
+class html2text
+{
+
+    /**
+     *  Contains the HTML content to convert.
+     *
+     *  @var string $html
+     *  @access public
+     */
+    var $html;
+
+    /**
+     *  Contains the converted, formatted text.
+     *
+     *  @var string $text
+     *  @access public
+     */
+    var $text;
+
+    /**
+     *  Maximum width of the formatted text, in columns.
+     *
+     *  @var integer $width
+     *  @access public
+     */
+    var $width = 70;
+
+    /**
+     *  List of preg* regular expression patterns to search for,
+     *  used in conjunction with $replace.
+     *
+     *  @var array $search
+     *  @access public
+     *  @see $replace
+     */
+    var $search = array(
+        "/\r/",                                  // Non-legal carriage return
+        "/[\n\t]+/",                             // Newlines and tabs
+        '/<script[^>]*>.*?<\/script>/i',         // <script>s -- which strip_tags supposedly has problems with
+        //'/<!-- .* -->/',                         // Comments -- which strip_tags might have problem a with
+        '/<a [^>]*href=("|\')([^"\']+)\1[^>]*>(.+?)<\/a>/ie', // <a href="">
+        '/<h[123][^>]*>(.+?)<\/h[123]>/ie',      // H1 - H3
+        '/<h[456][^>]*>(.+?)<\/h[456]>/ie',      // H4 - H6
+        '/<p[^>]*>/i',                           // <P>
+        '/<br[^>]*>/i',                          // <br>
+        '/<b[^>]*>(.+?)<\/b>/ie',                // <b>
+        '/<i[^>]*>(.+?)<\/i>/i',                 // <i>
+        '/(<ul[^>]*>|<\/ul>)/i',                 // <ul> and </ul>
+        '/(<ol[^>]*>|<\/ol>)/i',                 // <ol> and </ol>
+        '/<li[^>]*>/i',                          // <li>
+        '/<hr[^>]*>/i',                          // <hr>
+        '/(<table[^>]*>|<\/table>)/i',           // <table> and </table>
+        '/(<tr[^>]*>|<\/tr>)/i',                 // <tr> and </tr>
+        '/<td[^>]*>(.+?)<\/td>/i',               // <td> and </td>
+        '/<th[^>]*>(.+?)<\/th>/ie',              // <th> and </th>
+        '/&nbsp;/i',
+        '/&quot;/i',
+        '/&gt;/i',
+        '/&lt;/i',
+        '/&(amp|#38);/i',
+        '/&copy;/i',
+        '/&trade;/i',
+        '/&#8220;/',
+        '/&#8221;/',
+        '/&#8211;/',
+        '/&#(8217|39);/',
+        '/&#169;/',
+        '/&#8482;/',
+        '/&#151;/',
+        '/&#147;/',
+        '/&#148;/',
+        '/&#149;/',
+        '/&reg;/i',
+        '/&bull;/i',
+        '/&[&;]+;/i'
+    );
+
+    /**
+     *  List of pattern replacements corresponding to patterns searched.
+     *
+     *  @var array $replace
+     *  @access public
+     *  @see $search
+     */
+    var $replace = array(
+        '',                                     // Non-legal carriage return
+        ' ',                                    // Newlines and tabs
+        '',                                     // <script>s -- which strip_tags supposedly has problems with
+        //'',                                  // Comments -- which strip_tags might have problem a with
+        '$this->_build_link_list("\\2", "\\3")', // <a href="">
+        "strtoupper(\"\n\n\\1\n\n\")",          // H1 - H3
+        "ucwords(\"\n\n\\1\n\")",               // H4 - H6
+        "\n\n",                                 // <P>
+        "\n",                                   // <br>
+        'strtoupper("\\1")',                    // <b>
+        '_\\1_',                                // <i>
+        "\n\n",                                 // <ul> and </ul>
+        "\n\n",                                 // <ol> and </ol>
+        "\t*",                                  // <li>
+        "\n-------------------------\n",        // <hr>
+        "\n\n",                                 // <table> and </table>
+        "\n",                                   // <tr> and </tr>
+        "\t\t\\1\n",                            // <td> and </td>
+        "strtoupper(\"\t\t\\1\n\")",            // <th> and </th>
+        ' ',
+        '"',
+        '>',
+        '<',
+        '&',
+        '(c)',
+        '(tm)',
+        '"',
+        '"',
+        '-',
+        "'",
+        '(c)',
+        '(tm)',
+        '--',
+        '"',
+        '"',
+        '*',
+        '(R)',
+        '*',
+        ''
+    );
+
+    /**
+     *  Contains a list of HTML tags to allow in the resulting text.
+     *
+     *  @var string $allowed_tags
+     *  @access public
+     *  @see set_allowed_tags()
+     */
+    var $allowed_tags = '';
+
+    /**
+     *  Contains the base URL that relative links should resolve to.
+     *
+     *  @var string $url
+     *  @access public
+     */
+    var $url;
+
+    /**
+     *  Indicates whether content in the $html variable has been converted yet.
+     *
+     *  @var boolean $converted
+     *  @access private
+     *  @see $html, $text
+     */
+    var $_converted = false;
+
+    /**
+     *  Contains URL addresses from links to be rendered in plain text.
+     *
+     *  @var string $link_list
+     *  @access private
+     *  @see _build_link_list()
+     */
+    var $_link_list = array();
+    
+    /**
+     * Boolean flag, true if a table of link URLs should be listed after the text.
+     * 
+     * @var boolean $_do_links
+     * @access private
+     * @see html2text()
+     */
+    var $_do_links = true;
+
+    /**
+     *  Constructor.
+     *
+     *  If the HTML source string (or file) is supplied, the class
+     *  will instantiate with that source propagated, all that has
+     *  to be done it to call get_text().
+     *
+     *  @param string $source HTML content
+     *  @param boolean $from_file Indicates $source is a file to pull content from
+     *  @param boolean $do_link_table indicate whether a table of link URLs is desired
+     *  @access public
+     *  @return void
+     */
+    function html2text( $source = '', $from_file = false, $produce_link_table = true )
+    {
+        if ( !empty($source) ) {
+            $this->set_html($source, $from_file);
+        }
+        $this->set_base_url();
+        $this->_do_links = $produce_link_table;
+    }
+
+    /**
+     *  Loads source HTML into memory, either from $source string or a file.
+     *
+     *  @param string $source HTML content
+     *  @param boolean $from_file Indicates $source is a file to pull content from
+     *  @access public
+     *  @return void
+     */
+    function set_html( $source, $from_file = false )
+    {
+        $this->html = $source;
+
+        if ( $from_file && file_exists($source) ) {
+            $fp = fopen($source, 'r');
+            $this->html = fread($fp, filesize($source));
+            fclose($fp);
+        }
+
+        $this->_converted = false;
+    }
+
+    /**
+     *  Returns the text, converted from HTML.
+     *
+     *  @access public
+     *  @return string
+     */
+    function get_text()
+    {
+        if ( !$this->_converted ) {
+            $this->_convert();
+        }
+
+        return $this->text;
+    }
+
+    /**
+     *  Prints the text, converted from HTML.
+     *
+     *  @access public
+     *  @return void
+     */
+    function print_text()
+    {
+        print $this->get_text();
+    }
+
+    /**
+     *  Alias to print_text(), operates identically.
+     *
+     *  @access public
+     *  @return void
+     *  @see print_text()
+     */
+    function p()
+    {
+        print $this->get_text();
+    }
+
+    /**
+     *  Sets the allowed HTML tags to pass through to the resulting text.
+     *
+     *  Tags should be in the form "<p>", with no corresponding closing tag.
+     *
+     *  @access public
+     *  @return void
+     */
+    function set_allowed_tags( $allowed_tags = '' )
+    {
+        if ( !empty($allowed_tags) ) {
+            $this->allowed_tags = $allowed_tags;
+        }
+    }
+
+    /**
+     *  Sets a base URL to handle relative links.
+     *
+     *  @access public
+     *  @return void
+     */
+    function set_base_url( $url = '' )
+    {
+        if ( empty($url) ) {
+            $this->url = 'http://' . $_SERVER['HTTP_HOST'];
+        } else {
+            // Strip any trailing slashes for consistency (relative
+            // URLs may already start with a slash like "/file.html")
+            if ( substr($url, -1) == '/' ) {
+                $url = substr($url, 0, -1);
+            }
+            $this->url = $url;
+        }
+    }
+
+    /**
+     *  Workhorse function that does actual conversion.
+     *
+     *  First performs custom tag replacement specified by $search and
+     *  $replace arrays. Then strips any remaining HTML tags, reduces whitespace
+     *  and newlines to a readable format, and word wraps the text to
+     *  $width characters.
+     *
+     *  @access private
+     *  @return void
+     */
+    function _convert()
+    {
+        // Variables used for building the link list
+        //$link_count = 1;
+        //$this->_link_list = '';
+
+        $text = trim(stripslashes($this->html));
+
+        // Run our defined search-and-replace
+        $text = preg_replace($this->search, $this->replace, $text);
+
+        // Strip any other HTML tags
+        $text = strip_tags($text, $this->allowed_tags);
+
+        // Bring down number of empty lines to 2 max
+        $text = preg_replace("/\n\s+\n/", "\n", $text);
+        $text = preg_replace("/[\n]{3,}/", "\n\n", $text);
+
+        // Add link list
+        if ( sizeof($this->_link_list) ) {
+            $text .= "\n\nLinks:\n------\n";
+            foreach ($this->_link_list as $id => $link) {
+                $text .= '[' . ($id+1) . '] ' . $link . "\n";
+            }
+        }
+
+        // Wrap the text to a readable format
+        // for PHP versions >= 4.0.2. Default width is 75
+        $text = wordwrap($text, $this->width);
+
+        $this->text = $text;
+
+        $this->_converted = true;
+    }
+
+    /**
+     *  Helper function called by preg_replace() on link replacement.
+     *
+     *  Maintains an internal list of links to be displayed at the end of the
+     *  text, with numeric indices to the original point in the text they
+     *  appeared. Also makes an effort at identifying and handling absolute
+     *  and relative links.
+     *
+     *  @param integer $link_count Counter tracking current link number
+     *  @param string $link URL of the link
+     *  @param string $display Part of the text to associate number with
+     *  @access private
+     *  @return string
+    */
+    function _build_link_list($link, $display)
+      {
+      if (! $this->_do_links) return $display;
+
+      $link_lc = strtolower($link);
+      
+      if (substr($link_lc, 0, 7) == 'http://' || substr($link_lc, 0, 8) == 'https://' || substr($link_lc, 0, 7) == 'mailto:')
+        {
+        $url = $link;
+        }
+      else
+        {
+        $url = $this->url;
+        if ($link{0} != '/') {
+             $url .= '/';
+            }
+        $url .= $link;
+        }
+
+      $index = array_search($url, $this->_link_list);
+      if ($index===FALSE)
+        {
+        $index = sizeof($this->_link_list);
+        $this->_link_list[$index] = $url;
+        }
+              
+      return $display . ' [' . ($index+1) . ']';
+      }
+}
+
+?>
\ No newline at end of file
index 96353dd2f844e4c2042f9a423d9df555f3dcc387..e2cd724daf99e57b0ae35d3b786be8e4e4f02bd3 100644 (file)
                - Abort do-loop on socket errors (fgets returns false)
                - $ICL_SSL is not boolean anymore but contains the connection schema (ssl or tls)
                - Removed some debuggers (echo ...)
+               File altered by Aleksander Machniak <alec@alec.pl>
+               - RFC3501 [7.1] don't call CAPABILITY if was returned in server 
+                 optional resposne in iil_Connect()
+               - trim(chop()) replaced by trim()
+               - added iil_Escape() with support for " and \ in folder names
+               - support \ character in username in iil_C_Login()
+               - fixed iil_MultLine(): use iil_ReadBytes() instead of iil_ReadLine()
+               - fixed iil_C_FetchStructureString() to handle many literal strings in response
+               - removed hardcoded data size in iil_ReadLine() 
+               - added iil_PutLine() wrapper for fputs()
+               - code cleanup and identation fixes
 
 ********************************************************/
 
@@ -150,30 +161,41 @@ class iilThreadHeader
        var $mid;
 }
 
-
 function iil_xor($string, $string2) {
-    $result = '';
-    $size = strlen($string);
-    for ($i=0; $i<$size; $i++) {
-       $result .= chr(ord($string[$i]) ^ ord($string2[$i]));
-    }
-    return $result;
+       $result = '';
+       $size = strlen($string);
+       for ($i=0; $i<$size; $i++) {
+               $result .= chr(ord($string[$i]) ^ ord($string2[$i]));
+       }
+       return $result;
+}
+
+function iil_PutLine($fp, $string, $endln=true) {
+//     console('C: '. $string);
+       return fputs($fp, $string . ($endln ? "\r\n" : ''));
 }
 
 function iil_ReadLine($fp, $size) {
-    $line = '';
-    if (!$fp) {
-        return $line;
-    }
-    do {
-       // FIXME: hardcode size?
-        $buffer = fgets($fp, 2048);
-        if ($buffer === false) {
-            break;
-        }
-        $line .= $buffer;
-    } while ($buffer[strlen($buffer)-1] != "\n");
-    return $line;
+       $line = '';
+
+       if (!$fp) {
+               return $line;
+       }
+    
+       if (!$size) {
+               $size = 1024;
+       }
+    
+       do {
+               $buffer = fgets($fp, $size);
+               if ($buffer === false) {
+                       break;
+               }
+//             console('S: '. chop($buffer));
+               $line .= $buffer;
+       } while ($buffer[strlen($buffer)-1] != "\n");
+       
+       return $line;
 }
 
 function iil_MultLine($fp, $line) {
@@ -184,30 +206,32 @@ function iil_MultLine($fp, $line) {
                preg_match_all('/(.*)\{([0-9]+)\}$/', $line, $a);
                $bytes = $a[2][0];
                while (strlen($out) < $bytes) {
-                   $line = iil_ReadLine($fp, 1024); 
-                       $out .= chop($line);
+                       $line = iil_ReadBytes($fp, $bytes); 
+                       $out .= $line;
                }
                $line = $a[1][0] . "\"$out\"";
+//             console('[...] '. $out);
        }
        return $line;
 }
 
 function iil_ReadBytes($fp, $bytes) {
-    $data = '';
-    $len  = 0;
-    do {
-        $data .= fread($fp, $bytes-$len);
-        if ($len == strlen($data)) {
-            break; //nothing was read -> exit to avoid apache lockups
-        }
-        $len = strlen($data);
-    } while ($len < $bytes);
-    return $data;
+       $data = '';
+       $len  = 0;
+       do {
+               $data .= fread($fp, $bytes-$len);
+               if ($len == strlen($data)) {
+                       break; //nothing was read -> exit to avoid apache lockups
+               }
+               $len = strlen($data);
+       } while ($len < $bytes);
+       
+       return $data;
 }
 
 function iil_ReadReply($fp) {
        do {
-               $line = chop(trim(iil_ReadLine($fp, 1024)));
+               $line = trim(iil_ReadLine($fp, 1024));
        } while ($line[0] == '*');
        
        return $line;
@@ -217,39 +241,43 @@ function iil_ParseResult($string) {
        $a=explode(' ', $string);
        if (count($a) > 2) {
                if (strcasecmp($a[1], 'OK') == 0) {
-                   return 0;
+                       return 0;
                } else if (strcasecmp($a[1], 'NO') == 0) {
-                   return -1;
+                       return -1;
                } else if (strcasecmp($a[1], 'BAD') == 0) {
-                   return -2;
-        }
+                       return -2;
+               }
        }
-    return -3;
+       return -3;
 }
 
 // check if $string starts with $match
 function iil_StartsWith($string, $match) {
        $len = strlen($match);
        if ($len == 0) {
-           return false;
-    }
+               return false;
+       }
        if (strncmp($string, $match, $len) == 0) {
-           return true;
-    }
+               return true;
+       }
        return false;
 }
 
 function iil_StartsWithI($string, $match) {
        $len = strlen($match);
        if ($len == 0) {
-           return false;
-    }
+               return false;
+       }
        if (strncasecmp($string, $match, $len) == 0) {
-           return true;
-    }
+               return true;
+       }
        return false;
 }
 
+function iil_Escape($string)
+{
+       return strtr($string, array('"'=>'\\"', '\\' => '\\\\')); 
+}
 
 function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
     
@@ -261,6 +289,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
         $ipad .= chr(0x36);
         $opad .= chr(0x5C);
     }
+
     // pad $pass so it's 64 bytes
     $padLen = 64 - strlen($pass);
     for ($i=0;$i<$padLen;$i++) {
@@ -276,7 +305,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
     $reply = base64_encode('"' . $user . '" "' . $hash . '"');
     
     // send result, get reply
-    fputs($conn->fp, $reply . "\r\n");
+    iil_PutLine($conn->fp, $reply);
     $line = iil_ReadLine($conn->fp, 1024);
     
     // process result
@@ -293,8 +322,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
 
 function iil_C_Login(&$conn, $user, $password) {
 
-    $password = strtr($password, array('"'=>'\\"', '\\' => '\\\\'));  
-    fputs($conn->fp, "a001 LOGIN $user \"$password\"\r\n");
+    iil_PutLine($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password).'"');
 
     do {
         $line = iil_ReadReply($conn->fp);
@@ -322,10 +350,10 @@ function iil_C_Login(&$conn, $user, $password) {
 function iil_ParseNamespace2($str, &$i, $len=0, $l) {
        if (!$l) {
            $str = str_replace('NIL', '()', $str);
-    }
+       }
        if (!$len) {
            $len = strlen($str);
-    }
+       }
        $data      = array();
        $in_quotes = false;
        $elem      = 0;
@@ -336,17 +364,17 @@ function iil_ParseNamespace2($str, &$i, $len=0, $l) {
                        $data[$elem] = iil_ParseNamespace2($str, $i, $len, $l++);
                        $elem++;
                } else if ($c == ')' && !$in_quotes) {
-                   return $data;
-        } else if ($c == '\\') {
+                       return $data;
+               } else if ($c == '\\') {
                        $i++;
                        if ($in_quotes) {
-                           $data[$elem] .= $c.$str[$i];
-            }
+                               $data[$elem] .= $c.$str[$i];
+                       }
                } else if ($c == '"') {
                        $in_quotes = !$in_quotes;
                        if (!$in_quotes) {
-                           $elem++;
-            }
+                               $elem++;
+                       }
                } else if ($in_quotes) {
                        $data[$elem].=$c;
                }
@@ -365,7 +393,7 @@ function iil_C_NameSpace(&$conn) {
            return true;
        }
     
-       fputs($conn->fp, "ns1 NAMESPACE\r\n");
+       iil_PutLine($conn->fp, "ns1 NAMESPACE");
        do {
                $line = iil_ReadLine($conn->fp, 1024);
                if (iil_StartsWith($line, '* NAMESPACE')) {
@@ -393,11 +421,10 @@ function iil_C_NameSpace(&$conn) {
        $my_prefs["rootdir"] = substr($conn->rootdir, 0, -1);
        
        return true;
-
 }
 
 function iil_Connect($host, $user, $password) {        
-    global $iil_error, $iil_errornum;
+       global $iil_error, $iil_errornum;
        global $ICL_SSL, $ICL_PORT;
        global $IMAP_NO_CACHE;
        global $my_prefs, $IMAP_USE_INTERNAL_DATE;
@@ -414,11 +441,11 @@ function iil_Connect($host, $user, $password) {
        if (func_num_args() >= 4) {
                $auth_array = func_get_arg(3);
                if (is_array($auth_array)) {
-                   $auth_method = $auth_array['imap'];
-        }
+                       $auth_method = $auth_array['imap'];
+               }
                if (empty($auth_method)) {
-            $auth_method = "plain";
-        }
+                       $auth_method = "plain";
+               }
        }
        $message = "INITIAL: $auth_method\n";
                
@@ -436,27 +463,27 @@ function iil_Connect($host, $user, $password) {
        $conn->cache_dirty = array();
        
        if ($my_prefs['sort_field'] == 'INTERNALDATE') {
-           $IMAP_USE_INTERNAL_DATE = true;
-    } else if ($my_prefs['sort_field'] == 'DATE') {
-        $IMAP_USE_INTERNAL_DATE = false;
-    }
+               $IMAP_USE_INTERNAL_DATE = true;
+       } else if ($my_prefs['sort_field'] == 'DATE') {
+               $IMAP_USE_INTERNAL_DATE = false;
+       }
        //echo '<!-- conn sort_field: '.$my_prefs['sort_field'].' //-->';
        
        //check input
        if (empty($host)) {
-           $iil_error .= "Invalid host\n";
-    }
+               $iil_error .= "Invalid host\n";
+       }
        if (empty($user)) {
-           $iil_error .= "Invalid user\n";
-    }
+               $iil_error .= "Invalid user\n";
+       }
        if (empty($password)) {
-           $iil_error .= "Invalid password\n";
-    }
+               $iil_error .= "Invalid password\n";
+       }
        if (!empty($iil_error)) {
-           return false;
-    }
+               return false;
+       }
        if (!$ICL_PORT) {
-           $ICL_PORT = 143;
+               $ICL_PORT = 143;
        }
     
        //check for SSL
@@ -467,48 +494,56 @@ function iil_Connect($host, $user, $password) {
        //open socket connection
        $conn->fp = fsockopen($host, $ICL_PORT, $errno, $errstr, 10);
        if (!$conn->fp) {
-        $iil_error    = "Could not connect to $host at port $ICL_PORT: $errstr";
-        $iil_errornum = -1;
+               $iil_error = "Could not connect to $host at port $ICL_PORT: $errstr";
+               $iil_errornum = -1;
                return false;
        }
 
        $iil_error .= "Socket connection established\r\n";
-       $line       = iil_ReadLine($conn->fp, 300);
-
-       if (strcasecmp($auth_method, "check") == 0) {
-               //check for supported auth methods
-               
-               //default to plain text auth
-               $auth_method = 'plain';
-                       
-               //check for CRAM-MD5
-               fputs($conn->fp, "cp01 CAPABILITY\r\n");
+       $line       = iil_ReadLine($conn->fp, 1024);
+
+       // RFC3501 [7.1] optional CAPABILITY response
+       // commented out, because it's not working always as should
+//     if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
+//             $conn->capability = explode(' ', $matches[1]);
+//     } else {
+               iil_PutLine($conn->fp, "cp01 CAPABILITY");
                do {
-                   $line = trim(chop(iil_ReadLine($conn->fp, 100)));
+                       $line = trim(iil_ReadLine($conn->fp, 1024));
 
-                   $conn->message .= "$line\n";
+                       $conn->message .= "$line\n";
 
                        $a = explode(' ', $line);
                        if ($line[0] == '*') {
                                while (list($k, $w) = each($a)) {
-                                   if ($w != '*' && $w != 'CAPABILITY') {
+                                       if ($w != '*' && $w != 'CAPABILITY')
                                        $conn->capability[] = $w;
-                    }
-                                       if ((strcasecmp($w, "AUTH=CRAM_MD5") == 0)||
-                                               (strcasecmp($w, "AUTH=CRAM-MD5") == 0)) {
-                                           $auth_method = "auth";
-                                       }
                                }
                        }
                } while ($a[0] != 'cp01');
+//     }
+
+       if (strcasecmp($auth_method, "check") == 0) {
+               //check for supported auth methods
+               
+               //default to plain text auth
+               $auth_method = 'plain';
+                       
+               //check for CRAM-MD5
+               foreach ($conn->capability as $c)
+                       if (strcasecmp($c, 'AUTH=CRAM_MD5') == 0 ||
+                               strcasecmp($c, 'AUTH=CRAM-MD5') == 0) {
+                               $auth_method = 'auth';
+                               break;
+                       }
        }
 
        if (strcasecmp($auth_method, 'auth') == 0) {
                $conn->message .= "Trying CRAM-MD5\n";
 
                //do CRAM-MD5 authentication
-               fputs($conn->fp, "a000 AUTHENTICATE CRAM-MD5\r\n");
-               $line = trim(chop(iil_ReadLine($conn->fp, 1024)));
+               iil_PutLine($conn->fp, "a000 AUTHENTICATE CRAM-MD5");
+               $line = trim(iil_ReadLine($conn->fp, 1024));
         
                $conn->message .= "$line\n";
         
@@ -521,8 +556,7 @@ function iil_Connect($host, $user, $password) {
                        $conn->message .= "Tried CRAM-MD5: $result \n";
                } else {
                        $conn->message .='No challenge ('.htmlspecialchars($line)."), try plain\n";
-                       
-            $auth = 'plain';            
+                       $auth = 'plain';            
                }
        }
                
@@ -546,7 +580,7 @@ function iil_Connect($host, $user, $password) {
 
 function iil_Close(&$conn) {
        iil_C_WriteCache($conn);
-       if (fputs($conn->fp, "I LOGOUT\r\n")) {
+       if (iil_PutLine($conn->fp, "I LOGOUT")) {
                fgets($conn->fp, 1024);
                fclose($conn->fp);
                $conn->fp = false;
@@ -556,7 +590,6 @@ function iil_Close(&$conn) {
 function iil_ClearCache($user, $host) {
 }
 
-
 function iil_C_WriteCache(&$conn) {
        //echo "<!-- doing iil_C_WriteCache //-->\n";
        if (!$conn->do_cache) return false;
@@ -595,14 +628,14 @@ function iil_C_LoadCache(&$conn, $folder) {
 function iil_C_ExpireCachedItems(&$conn, $folder, $message_set) {
        
        if (!$conn->do_cache) {
-           return;     //caching disabled
+               return; //caching disabled
        }
-    if (!is_array($conn->cache[$folder])) {
-        return;        //cache not initialized|empty
+       if (!is_array($conn->cache[$folder])) {
+               return; //cache not initialized|empty
+       }
+       if (count($conn->cache[$folder]) == 0) {
+               return; //cache not initialized|empty
        }
-    if (count($conn->cache[$folder]) == 0) {
-        return;        //cache not initialized|empty
-    }
     
        $uids = iil_C_FetchHeaderIndex($conn, $folder, $message_set, 'UID');
        $num_removed = 0;
@@ -639,8 +672,8 @@ function iil_ExplodeQuotedString($delimiter, $string) {
        while ( list($key, $val) = each($quotes)) {
                if (($key % 2) == 1) {
                        $quotes[$key] = str_replace($delimiter, "_!@!_", $quotes[$key]);
-        }
-    }
+               }
+       }
        $string=implode('"', $quotes);
        
        $result=explode($delimiter, $string);
@@ -653,13 +686,13 @@ function iil_ExplodeQuotedString($delimiter, $string) {
 
 function iil_CheckForRecent($host, $user, $password, $mailbox) {
        if (empty($mailbox)) {
-           $mailbox = 'INBOX';
+               $mailbox = 'INBOX';
        }
     
        $conn = iil_Connect($host, $user, $password, 'plain');
        $fp   = $conn->fp;
        if ($fp) {
-               fputs($fp, "a002 EXAMINE \"$mailbox\"\r\n");
+               iil_PutLine($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"");
                do {
                        $line=chop(iil_ReadLine($fp, 300));
                        $a=explode(' ', $line);
@@ -668,7 +701,7 @@ function iil_CheckForRecent($host, $user, $password, $mailbox) {
             }
                } while (!iil_StartsWith($a[0], 'a002'));
 
-               fputs($fp, "a003 LOGOUT\r\n");
+               iil_PutLine($fp, "a003 LOGOUT");
                fclose($fp);
        } else {
            $result = -2;
@@ -678,57 +711,57 @@ function iil_CheckForRecent($host, $user, $password, $mailbox) {
 }
 
 function iil_C_Select(&$conn, $mailbox) {
-       $fp = $conn->fp;
-       
+
        if (empty($mailbox)) {
-           return false;
+               return false;
        }
-    if (strcmp($conn->selected, $mailbox) == 0) {
-        return true;
+       if (strcmp($conn->selected, $mailbox) == 0) {
+               return true;
        }
     
        iil_C_LoadCache($conn, $mailbox);
        
-       if (fputs($fp, "sel1 SELECT \"$mailbox\"\r\n")) {
+       if (iil_PutLine($conn->fp, "sel1 SELECT \"".iil_Escape($mailbox).'"')) {
                do {
-                       $line=chop(iil_ReadLine($fp, 300));
-                       $a=explode(' ', $line);
+                       $line = chop(iil_ReadLine($conn->fp, 300));
+                       $a = explode(' ', $line);
                        if (count($a) == 3) {
                                if (strcasecmp($a[2], 'EXISTS') == 0) {
-                                   $conn->exists = (int) $a[1];
+                                       $conn->exists = (int) $a[1];
                                }
-                if (strcasecmp($a[2], 'RECENT') == 0) {
-                    $conn->recent = (int) $a[1];
-                }
+                               if (strcasecmp($a[2], 'RECENT') == 0) {
+                                       $conn->recent = (int) $a[1];
+                               }
                        }
                } while (!iil_StartsWith($line, 'sel1'));
 
-               $a=explode(' ', $line);
+               $a = explode(' ', $line);
 
                if (strcasecmp($a[1], 'OK') == 0) {
                        $conn->selected = $mailbox;
                        return true;
                }
        }
-    return false;
+       return false;
 }
 
 function iil_C_CheckForRecent(&$conn, $mailbox) {
        if (empty($mailbox)) {
-           $mailbox = 'INBOX';
+               $mailbox = 'INBOX';
        }
     
        iil_C_Select($conn, $mailbox);
        if ($conn->selected == $mailbox) {
-           return $conn->recent;
+               return $conn->recent;
        }
-    return false;
+       return false;
 }
 
 function iil_C_CountMessages(&$conn, $mailbox, $refresh = false) {
        if ($refresh) {
                $conn->selected= '';
        }
+       
        iil_C_Select($conn, $mailbox);
        if ($conn->selected == $mailbox) {
                return $conn->exists;
@@ -743,16 +776,16 @@ function iil_SplitHeaderLine($string) {
                $res[1] = trim(substr($string, $pos+1));
                return $res;
        }
-    return $string;
+       return $string;
 }
 
 function iil_StrToTime($str) {
        $IMAP_MONTHS    = $GLOBALS['IMAP_MONTHS'];
-    $IMAP_SERVER_TZ = $GLOBALS['IMAP_SERVER_TR'];
+       $IMAP_SERVER_TZ = $GLOBALS['IMAP_SERVER_TR'];
                
        if ($str) {
-        $time1 = strtotime($str);
-    }
+           $time1 = strtotime($str);
+       }
        if ($time1 && $time1 != -1) {
            return $time1-$IMAP_SERVER_TZ;
        }
@@ -766,7 +799,7 @@ function iil_StrToTime($str) {
        $pos = strpos($str, ' ');
        if (!is_numeric(substr($str, 0, $pos))) {
            $str = substr($str, $pos+1);
-    }
+       }
        //explode, take good parts
        $a = explode(' ', $str);
 
@@ -797,7 +830,8 @@ function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
        $field = strtoupper($field);
        if ($field == 'INTERNALDATE') {
            $field = 'ARRIVAL';
-    }
+       }
+       
        $fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1,
         'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1);
        
@@ -809,21 +843,21 @@ function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
        
        if (!empty($add)) {
            $add = " $add";
-    }
+       }
 
        $fp       = $conn->fp;
        $command  = 's ' . $is_uid . 'SORT (' . $field . ') ';
-    $command .= $encoding . ' ALL' . "$add\r\n";
+       $command .= $encoding . ' ALL' . $add;
        $line     = $data = '';
        
-       if (!fputs($fp, $command)) {
+       if (!iil_PutLine($fp, $command)) {
            return false;
-    }
+       }
        do {
                $line = chop(iil_ReadLine($fp, 1024));
                if (iil_StartsWith($line, '* SORT')) {
-                   $data .= ($data?' ':'') . substr($line, 7);
-        }
+                       $data .= ($data?' ':'') . substr($line, 7);
+               }
        } while ($line[0]!='s');
        
        if (empty($data)) {
@@ -845,14 +879,14 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                
        if (empty($index_field)) {
            $index_field = 'DATE';
-    }
+       }
        $index_field = strtoupper($index_field);
        
        list($from_idx, $to_idx) = explode(':', $message_set);
        if (empty($message_set) || (isset($to_idx)
-        && (int)$from_idx > (int)$to_idx)) {
+           && (int)$from_idx > (int)$to_idx)) {
                return false;
-    }
+       }
        
        //$fields_a['DATE'] = ($IMAP_USE_INTERNAL_DATE?6:1);
        $fields_a['DATE']         = 1;
@@ -876,21 +910,21 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
        /*  Do "SELECT" command */
        if (!iil_C_Select($conn, $mailbox)) {
            return false;
-    }
+       }
     
        /* FETCH date,from,subject headers */
        if ($mode == 1) {
                $key     = 'fhi' . ($c++);
-               $request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])\r\n";
-               if (!fputs($fp, $request)) {
+               $request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])";
+               if (!iil_PutLine($fp, $request)) {
                    return false;
-        }
+               }
                do {
                        
                        $line=chop(iil_ReadLine($fp, 200));
                        $a=explode(' ', $line);
                        if (($line[0] == '*') && ($a[2] == 'FETCH')
-                && ($line[strlen($line)-1] != ')')) {
+                           && ($line[strlen($line)-1] != ')')) {
                                $id=$a[1];
 
                                $str=$line=chop(iil_ReadLine($fp, 300));
@@ -909,7 +943,7 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                                                                $result[$id] = str_replace('"', '', $string);
                                                                if ($normalize) {
                                                                    $result[$id] = strtoupper($result[$id]);
-                                }
+                                                               }
                                                        }
                                                        $str=$line;
                                                }
@@ -929,9 +963,9 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                                        $line      = chop($line);
                                        
                                        if ($received>$bytes) {
-                        break;
+                                               break;
                                        } else if (!$line) {
-                        continue;
+                                               continue;
                                        }
 
                                        list($field, $string) = explode(': ', $line);
@@ -940,7 +974,7 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                                                $result[$id] = iil_StrToTime($string);
                                        } else if ($index_field != 'DATE') {
                                                $result[$id]=strtoupper(str_replace('"', '', $string));
-                    }
+                                       }
                                } while ($line[0] != ')');
                        } else {
                                //one line response, not expected so ignore                             
@@ -951,10 +985,10 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
        }else if ($mode == 6) {
 
                $key     = 'fhi' . ($c++);
-               $request = $key . " FETCH $message_set (INTERNALDATE)\r\n";
-               if (!fputs($fp, $request)) {
+               $request = $key . " FETCH $message_set (INTERNALDATE)";
+               if (!iil_PutLine($fp, $request)) {
                    return false;
-        }
+               }
                do {
                        $line=chop(iil_ReadLine($fp, 200));
                        if ($line[0] == '*') {
@@ -985,15 +1019,15 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                    $field_name = 'RFC822.SIZE';
                } else {
                    $field_name = $index_field;
-        }
+               }
         
                /*                      FETCH uid, size, flags          */
                $key     = 'fhi' .($c++);
-               $request = $key . " FETCH $message_set ($field_name)\r\n";
+               $request = $key . " FETCH $message_set ($field_name)";
 
-               if (!fputs($fp, $request)) {
+               if (!iil_PutLine($fp, $request)) {
                    return false;
-        }
+               }
                do {
                        $line=chop(iil_ReadLine($fp, 200));
                        $a = explode(' ', $line);
@@ -1007,9 +1041,9 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                                if (isset($result[$id])) {
                                    continue; //if we already got the data, skip forward
                                }
-                if ($a[3]!=$field_name) {
-                    continue;  //make sure it's returning what we requested
-                           }
+                               if ($a[3]!=$field_name) {
+                                       continue;  //make sure it's returning what we requested
+                               }
                 
                                /*  Caution, bad assumptions, next several lines */
                                if ($mode == 2) {
@@ -1031,10 +1065,10 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
                //if we have less, try and fill in the "gaps"
                if (count($result) < $should_have) {
                        for ($i=$start_mid; $i<=$end_mid; $i++) {
-                           if (!isset($result[$i])) {
-                               $result[$i] = '';
-                }
-            }
+                               if (!isset($result[$i])) {
+                                       $result[$i] = '';
+                               }
+                       }
                }
        }
        return $result; 
@@ -1069,16 +1103,17 @@ function iil_CompressMessageSet($message_set) {
                        } else {
                            $result[] = $start . ':' . $prev;   //push sequence as start_id:end_id
                        }
-            $start = $id;                                                      //start of new sequence
+                       $start = $id;                   //start of new sequence
                }
                $prev = $id;
        }
+
        //handle the last sequence/id
        if ($start==$prev) {
            $result[] = $prev;
-    } else {
-        $result[] = $start.':'.$prev;
-    }
+       } else {
+           $result[] = $start.':'.$prev;
+       }
     
        //return as comma separated string
        return implode(',', $result);
@@ -1087,7 +1122,7 @@ function iil_CompressMessageSet($message_set) {
 function iil_C_UIDsToMIDs(&$conn, $mailbox, $uids) {
        if (!is_array($uids) || count($uids) == 0) {
            return array();
-    }
+       }
        return iil_C_Search($conn, $mailbox, 'UID ' . implode(',', $uids));
 }
 
@@ -1096,7 +1131,7 @@ function iil_C_UIDToMID(&$conn, $mailbox, $uid) {
        if (count($result) == 1) {
            return $result[0];
        }
-    return false;
+        return false;
 }
 
 function iil_C_FetchUIDs(&$conn,$mailbox) {
@@ -1105,7 +1140,7 @@ function iil_C_FetchUIDs(&$conn,$mailbox) {
        $num = iil_C_CountMessages($conn, $mailbox);
        if ($num == 0) {
            return array();
-    }
+       }
        $message_set = '1' . ($num>1?':' . $num:'');
        
        //if cache not enabled, just call iil_C_FetchHeaderIndex on 'UID' field
@@ -1137,7 +1172,7 @@ function iil_C_FetchUIDs(&$conn,$mailbox) {
                $temp = iil_C_Search($conn, $mailbox, 'UID ' . $data['d'][$num]);
                if (!$temp || !is_array($temp) || $temp[0] != $num) {
                    $cache_good = -3;
-        }
+               }
        }
 
        //if cached data's good, return it
@@ -1172,7 +1207,7 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
        if (empty($message_set) || (isset($to_idx)
         && (int)$from_idx > (int)$to_idx)) {
                return false;
-    }
+       }
 
        $result = array();
        $uids   = iil_C_FetchUIDs($conn, $mailbox);
@@ -1189,13 +1224,13 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
                                        $result[$uid]->id = $id;
                                } else {
                                    $needed_set .= ($needed_set ? ',' : '') . $id;
-                }
+                               }
                        }
                        if ($needed_set) {
                            $message_set = $needed_set;
                        } else {
                            $message_set = '';
-            }
+                       }
                }
        }
        $message_set = iil_CompressMessageSet($message_set);
@@ -1209,16 +1244,16 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
                $key        = 'fh';
                $fp         = $conn->fp;
                $request    = $key . " FETCH $message_set ";
-        $request   .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])\r\n";
+               $request   .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])";
                $mid_to_id  = array();
-               if (!fputs($fp, $request)) {
+               if (!iil_PutLine($fp, $request)) {
                    return false;
-        }
+               }
                do {
                        $line = chop(iil_ReadLine($fp, 1024));
                        if ($debug) {
                            echo $line . "\n";
-            }
+                       }
                        if (ereg('\{[0-9]+\}$', $line)) {
                                $a       = explode(' ', $line);
                                $new = array();
@@ -1228,8 +1263,8 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
                                do {
                                        $line = chop(iil_ReadLine($fp, 1024), "\r\n");
                                        if (iil_StartsWithI($line, 'Message-ID:')
-                        || (iil_StartsWithI($line,'In-Reply-To:'))
-                        || (iil_StartsWithI($line,'SUBJECT:'))) {
+                                               || (iil_StartsWithI($line,'In-Reply-To:'))
+                                               || (iil_StartsWithI($line,'SUBJECT:'))) {
 
                                                $pos        = strpos($line, ':');
                                                $field_name = substr($line, 0, $pos);
@@ -1260,7 +1295,7 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
        if ($conn->do_cache) {
                if (count($result)!=count($cached)) {
                        cache_write($conn->user, $conn->host, $mailbox . '.thhd', $result);
-        }
+               }
        }
        
        //echo 'iil_FetchThreadHeaders:'."\n";
@@ -1274,7 +1309,7 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
 
        list($from_idx, $to_idx) = explode(':', $message_set);
        if (empty($message_set) || (isset($to_idx)
-        && (int)$from_idx > (int)$to_idx)) {
+               && (int)$from_idx > (int)$to_idx)) {
                return false;
        }
     
@@ -1292,7 +1327,7 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
        /*  Do "SELECT" command */
        if (!iil_C_Select($conn, $mailbox)) {
            return false;
-    }
+       }
     
        /* FETCH date,from,subject headers */
        $mid_to_id = array();
@@ -1313,7 +1348,7 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
                //                      'IN-REPLY-TO'=>$header['r'], 'SUBJECT'=>$header['s']);
                $id  = $header->id;
                $new = array('id' => $id, 'MESSAGE-ID' => $header->mid, 
-            'IN-REPLY-TO' => $header->irt, 'SUBJECT' => $header->sbj);
+                       'IN-REPLY-TO' => $header->irt, 'SUBJECT' => $header->sbj);
 
                /* add to message-id -> mid lookup table */
                $mid_to_id[$new['MESSAGE-ID']] = $id;
@@ -1329,8 +1364,8 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
                if (eregi($sbj_filter_pat, $new['SUBJECT'])) {
                    $has_re = true;
                }
-        if ($has_re||$new['IN-REPLY-TO']) {
-            $sbj_pre = 'RE:';
+               if ($has_re||$new['IN-REPLY-TO']) {
+                   $sbj_pre = 'RE:';
                }
         
                /* strip out 're:', 'fw:' etc */
@@ -1339,22 +1374,22 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
                } else {
                    $sbj = $new['SUBJECT'];
                }
-        $new['SUBJECT'] = $sbj_pre.$sbj;
+               $new['SUBJECT'] = $sbj_pre.$sbj;
                
                
                /* if subject not a known thread-root, add to list */
                if ($debug) {
                    echo $id . ' ' . $new['SUBJECT'] . "\t" . $new['MESSAGE-ID'] . "\n";
                }
-        $root_id = $roots[$sbj];
+               $root_id = $roots[$sbj];
                
                if ($root_id && ($has_re || !$root_in_root[$root_id])) {
                        if ($debug) {
                            echo "\tfound root: $root_id\n";
                        }
-            $sub_mids[$new['MESSAGE-ID']] = $root_id;
+                       $sub_mids[$new['MESSAGE-ID']] = $root_id;
                        $result[$root_id][]           = $id;
-               }else if (!isset($roots[$sbj]) || (!$has_re && $root_in_root[$root_id])) {
+               } else if (!isset($roots[$sbj]) || (!$has_re && $root_in_root[$root_id])) {
                        /* try to use In-Reply-To header to find root 
                                unless subject contains 'Re:' */
                        if ($has_re&&$new['IN-REPLY-TO']) {
@@ -1369,7 +1404,7 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
                                        if ($debug) {
                                            echo "\tfound parent: ".$new['SUBJECT']."\n";
                                        }
-                    $result[$temp][]              = $id;
+                                       $result[$temp][]              = $id;
                                        $sub_mids[$new['MESSAGE-ID']] = $temp;
                                        $sbj                          = '';
                                } else {
@@ -1383,16 +1418,15 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
                                if ($debug) {
                                    echo "\t added to root\n";
                                }
-                $roots[$sbj]                  = $id;
+                               $roots[$sbj]                  = $id;
                                $root_in_root[$id]            = !$has_re;
                                $sub_mids[$new['MESSAGE-ID']] = $id;
                                $result[$id]                  = array($id);
                        }
                        if ($debug) {
                            echo $new['MESSAGE-ID'] . "\t" . $sbj . "\n";
-            }
+                       }
                }
-                       
        }
        
        //now that we've gone through all the messages,
@@ -1403,7 +1437,7 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
                        if (!$root_id || $root_id==$id) {
                            continue;
                        }
-            $result[$root_id] = array_merge($result[$root_id],$result[$id]);
+                       $result[$root_id] = array_merge($result[$root_id],$result[$id]);
                        unset($result[$id]);
                }
        }
@@ -1415,15 +1449,14 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
        if ($debug) {
            print_r($roots);
        }
-    //print_r($result);
+
        return $result;
 }
 
-
 function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
        if (!is_array($tree) || !is_array($index)) {
            return false;
-    }
+       }
     
        //create an id to position lookup table
        $i = 0;
@@ -1460,7 +1493,6 @@ function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
                }
        }
        
-       
        //sort by key, this basically sorts all threads
        ksort($itree);
        $i   = 0;
@@ -1470,7 +1502,6 @@ function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
                $i++;
        }
        
-       //return
        return $out;
 }
 
@@ -1538,9 +1569,9 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
        $request .= " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ";
        $request .= "(DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC ";
        $request .= "CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID ";
-       $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])\r\n";
+       $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])";
 
-       if (!fputs($fp, $request)) {
+       if (!iil_PutLine($fp, $request)) {
                return false;
        }
        do {
@@ -1565,10 +1596,10 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
                        do {
                                $line = chop(iil_ReadLine($fp, 300), "\r\n");
                                if (ord($line[0])<=32) {
-                                   $lines[$i] .= (empty($lines[$i])?'':"\n").trim(chop($line));
+                                   $lines[$i] .= (empty($lines[$i])?'':"\n").trim($line);
                                } else {
                                        $i++;
-                                       $lines[$i] = trim(chop($line));
+                                       $lines[$i] = trim($line);
                                }
                                /* 
                                        The preg_match below works around communigate imap, which outputs " UID <number>)".
@@ -1671,12 +1702,12 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
        */
        $command_key = 'fh' . ($c++);
        $request     = $command_key . $prefix;
-       $request    .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)\r\n";
+       $request    .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)";
        
-       if (!fputs($fp, $request)) {
+       if (!iil_PutLine($fp, $request)) {
            return false;
        }
-    do {
+       do {
                $line = chop(iil_ReadLine($fp, 200));
                //$a = explode(' ', $line);
                //if (($line[0]=="*") && ($a[2]=="FETCH")) {
@@ -1731,7 +1762,7 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
                                                            $result[$id]->answered = true;
                                                        } else if (strcasecmp($val, "\$MDNSent") == 0) {
                                                            $result[$id]->mdn_sent = true;
-                            }
+                                                       }
                                                }
                                                $result[$id]->flags = $flags_a;
                                        }
@@ -1787,18 +1818,17 @@ function iil_C_FetchHeader(&$conn, $mailbox, $id, $uidfetch=false) {
        return false;
 }
 
-
 function iil_SortHeaders($a, $field, $flag) {
        if (empty($field)) {
            $field = 'uid';
-    }
+       }
        $field = strtolower($field);
        if ($field == 'date' || $field == 'internaldate') {
            $field = 'timestamp';
-    }
+       }
        if (empty($flag)) {
            $flag = 'ASC';
-    }
+       }
     
        $flag     = strtoupper($flag);
        $stripArr = ($field=='subject') ? array('Re: ','Fwd: ','Fw: ','"') : array('"');
@@ -1821,12 +1851,12 @@ function iil_SortHeaders($a, $field, $flag) {
                                $data = @strtotime($val->date);
                                if ($data == false) {
                                        $data = $val->timestamp;
-                }
+                               }
                        } else {
                                $data = $val->$field;
                                if (is_string($data)) {
                                        $data=strtoupper(str_replace($stripArr, '', $data));
-                }
+                               }
                        }
                        $index[$key]=$data;
                }
@@ -1834,9 +1864,9 @@ function iil_SortHeaders($a, $field, $flag) {
                // sort index
                $i = 0;
                if ($flag == 'ASC') {
-                   asort($index);
-        } else {
-            arsort($index);
+                       asort($index);
+               } else {
+                       arsort($index);
                }
         
                // form new array based on index 
@@ -1852,15 +1882,15 @@ function iil_SortHeaders($a, $field, $flag) {
 }
 
 function iil_C_Expunge(&$conn, $mailbox) {
-       $fp = $conn->fp;
+
        if (iil_C_Select($conn, $mailbox)) {
                $c = 0;
-               fputs($fp, "exp1 EXPUNGE\r\n");
+               iil_PutLine($conn->fp, "exp1 EXPUNGE");
                do {
-                       $line=chop(iil_ReadLine($fp, 100));
+                       $line=chop(iil_ReadLine($conn->fp, 100));
                        if ($line[0] == '*') {
-                $c++;
-            }
+                               $c++;
+                       }
                } while (!iil_StartsWith($line, 'exp1'));
                
                if (iil_ParseResult($line) == 0) {
@@ -1894,12 +1924,12 @@ function iil_C_ModFlag(&$conn, $mailbox, $messages, $flag, $mod) {
     
        if (iil_C_Select($conn, $mailbox)) {
                $c = 0;
-               fputs($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")\r\n");
+               iil_PutLine($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")");
                do {
                        $line=chop(iil_ReadLine($fp, 100));
                        if ($line[0] == '*') {
                            $c++;
-            }
+                       }
                } while (!iil_StartsWith($line, 'flg'));
 
                if (iil_ParseResult($line) == 0) {
@@ -1929,23 +1959,21 @@ function iil_C_Undelete(&$conn, $mailbox, $messages) {
        return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '-');
 }
 
-
 function iil_C_Unseen(&$conn, $mailbox, $messages) {
        return iil_C_ModFlag($conn, $mailbox, $messages, 'SEEN', '-');
 }
 
-
 function iil_C_Copy(&$conn, $messages, $from, $to) {
        $fp = $conn->fp;
 
        if (empty($from) || empty($to)) {
            return -1;
-    }
+       }
     
        if (iil_C_Select($conn, $from)) {
                $c=0;
                
-               fputs($fp, "cpy1 COPY $messages \"$to\"\r\n");
+               iil_PutLine($fp, "cpy1 COPY $messages \"".iil_Escape($to)."\"");
                $line=iil_ReadReply($fp);
                return iil_ParseResult($line);
        } else {
@@ -1955,7 +1983,7 @@ function iil_C_Copy(&$conn, $messages, $from, $to) {
 
 function iil_FormatSearchDate($month, $day, $year) {
        $month  = (int) $month;
-    $months = $GLOBALS['IMAP_MONTHS'];
+       $months = $GLOBALS['IMAP_MONTHS'];
        return $day . '-' . $months[$month] . '-' . $year;
 }
 
@@ -1965,10 +1993,10 @@ function iil_C_CountUnseen(&$conn, $folder) {
                $str = implode(',', $index);
                if (empty($str)) {
                    return false;
-        }
+               }
                return count($index);
        }
-    return false;
+       return false;
 }
 
 function iil_C_UID2ID(&$conn, $folder, $uid) {
@@ -1978,7 +2006,7 @@ function iil_C_UID2ID(&$conn, $folder, $uid) {
                        $count = count($id_a);
                        if ($count > 1) {
                            return false;
-            }
+                       }
                        return $id_a[0];
                }
        }
@@ -1989,11 +2017,11 @@ function iil_C_ID2UID(&$conn, $folder, $id) {
        $fp = $conn->fp;
        if ($id == 0) {
            return      -1;
-    }
-    $result = -1;
+       }
+       $result = -1;
        if (iil_C_Select($conn, $folder)) {
                $key = 'FUID';
-               if (fputs($fp, "$key FETCH $id (UID)\r\n")) {
+               if (iil_PutLine($fp, "$key FETCH $id (UID)")) {
                        do {
                                $line=chop(iil_ReadLine($fp, 1024));
                                if (eregi("^\* $id FETCH \(UID (.*)\)", $line, $r)) {
@@ -2010,10 +2038,10 @@ function iil_C_Search(&$conn, $folder, $criteria) {
        if (iil_C_Select($conn, $folder)) {
                $c = 0;
                
-               $query = 'srch1 SEARCH ' . chop($criteria) . "\r\n";
-               fputs($fp, $query);
+               $query = 'srch1 SEARCH ' . chop($criteria);
+               iil_PutLine($fp, $query);
                do {
-                       $line=trim(chop(iil_ReadLine($fp, 10000)));
+                       $line=trim(iil_ReadLine($fp, 10000));
                        if (eregi("^\* SEARCH", $line)) {
                                $str = trim(substr($line, 8));
                                $messages = explode(' ', $str);
@@ -2025,24 +2053,22 @@ function iil_C_Search(&$conn, $folder, $criteria) {
                    return $messages;
                }
                $conn->error = 'iil_C_Search: ' . $line . "\n";
-               return false;
-               
+               return false;   
        }
        $conn->error = "iil_C_Search: Couldn't select \"$folder\"\n";
        return false;
 }
 
 function iil_C_Move(&$conn, $messages, $from, $to) {
-       $fp = $conn->fp;
-       
-       if (!$from || !$to) {
-           return -1;
-       }
-    
-       $r = iil_C_Copy($conn, $messages, $from,$to);
-       if ($r==0) {
-               return iil_C_Delete($conn, $from, $messages);
-       }
+    $fp = $conn->fp;
+
+    if (!$from || !$to) {
+        return -1;
+    }
+    $r = iil_C_Copy($conn, $messages, $from,$to);
+    if ($r==0) {
+        return iil_C_Delete($conn, $from, $messages);
+    }
     return $r;
 }
 
@@ -2065,9 +2091,9 @@ function iil_C_GetHierarchyDelimiter(&$conn) {
        $delimiter = false;
        
        //try (LIST "" ""), should return delimiter (RFC2060 Sec 6.3.8)
-       if (!fputs($fp, 'ghd LIST "" ""' . "\r\n")) {
+       if (!iil_PutLine($fp, 'ghd LIST "" ""')) {
            return false;
-    }
+       }
     
        do {
                $line=iil_ReadLine($fp, 500);
@@ -2076,7 +2102,7 @@ function iil_C_GetHierarchyDelimiter(&$conn) {
                        $a=iil_ExplodeQuotedString(' ', $line);
                        if ($a[0] == '*') {
                            $delimiter = str_replace('"', '', $a[count($a)-2]);
-            }
+                       }
                }
        } while (!iil_StartsWith($line, 'ghd'));
 
@@ -2086,7 +2112,7 @@ function iil_C_GetHierarchyDelimiter(&$conn) {
     
        //if that fails, try namespace extension
        //try to fetch namespace data
-       fputs($conn->fp, "ns1 NAMESPACE\r\n");
+       iil_PutLine($conn->fp, "ns1 NAMESPACE");
        do {
                $line = iil_ReadLine($conn->fp, 1024);
                if (iil_StartsWith($line, '* NAMESPACE')) {
@@ -2109,7 +2135,7 @@ function iil_C_GetHierarchyDelimiter(&$conn) {
        $first_userspace = $user_space_data[0];
        if (!is_array($first_userspace)) {
            return false;
-    }
+       }
     
        //extract delimiter
        $delimiter = $first_userspace[1];       
@@ -2123,20 +2149,22 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
        $ignore = $IGNORE_FOLDERS[strtolower($conn->host)];
                
        $fp = $conn->fp;
+       
        if (empty($mailbox)) {
            $mailbox = '*';
-    }
+       }
+       
        if (empty($ref) && $conn->rootdir) {
            $ref = $conn->rootdir;
        }
     
-    // send command
-       if (!fputs($fp, "lmb LIST \"".$ref."\" \"$mailbox\"\r\n")) {
+       // send command
+       if (!iil_PutLine($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"")) {
            return false;
-    }
+       }
     
        $i = 0;
-    // get folder list
+       // get folder list
        do {
                $line = iil_ReadLine($fp, 500);
                $line = iil_MultLine($fp, $line);
@@ -2144,33 +2172,34 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
                $a = explode(' ', $line);
                if (($line[0] == '*') && ($a[1] == 'LIST')) {
                        $line = rtrim($line);
-            // split one line
+                       // split one line
                        $a = iil_ExplodeQuotedString(' ', $line);
+                       // last string is folder name
+                       $folder = trim($a[count($a)-1], '"');
             
-            // last string is folder name
-                       $folder = str_replace('"', '', $a[count($a)-1]);
+                       if (empty($ignore) || (!empty($ignore)
+                               && !eregi($ignore, $folder))) {
+                               $folders[$i] = $folder;
+                       }
             
-            if (empty($ignore) || (!empty($ignore)
-                && !eregi($ignore, $folder))) {
-                $folders[$i] = $folder;
-            }
-            
-            // second from last is delimiter
-            $delim = str_replace('"', '', $a[count($a)-2]);
-            // is it a container?
-            $i++;
+                       // second from last is delimiter
+                       $delim = trim($a[count($a)-2], '"');
+                       // is it a container?
+                       $i++;
                }
        } while (!iil_StartsWith($line, 'lmb'));
 
        if (is_array($folders)) {
-        if (!empty($ref)) {
-            // if rootdir was specified, make sure it's the first element
-            // some IMAP servers (i.e. Courier) won't return it
-            if ($ref[strlen($ref)-1]==$delim) $ref = substr($ref, 0, strlen($ref)-1);
-            if ($folders[0]!=$ref) array_unshift($folders, $ref);
-        }
-        return $folders;
-       }else if (iil_ParseResult($line) == 0) {
+           if (!empty($ref)) {
+               // if rootdir was specified, make sure it's the first element
+               // some IMAP servers (i.e. Courier) won't return it
+               if ($ref[strlen($ref)-1]==$delim)
+                   $ref = substr($ref, 0, strlen($ref)-1);
+               if ($folders[0]!=$ref)
+                   array_unshift($folders, $ref);
+           }
+           return $folders;
+       } else if (iil_ParseResult($line) == 0) {
                return array('INBOX');
        } else {
                $conn->error = $line;
@@ -2178,7 +2207,6 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
        }
 }
 
-
 function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
        global $IGNORE_FOLDERS;
        
@@ -2193,15 +2221,15 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
        }
        $folders = array();
 
-    // send command
-       if (!fputs($fp, 'lsb LSUB "' . $ref . '" "' . $mailbox.'"' . "\r\n")) {
+       // send command
+       if (!iil_PutLine($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"')) {
                $conn->error = "Couldn't send LSUB command\n";
                return false;
        }
        
        $i = 0;
        
-    // get folder list
+       // get folder list
        do {
                $line = iil_ReadLine($fp, 500);
                $line = iil_MultLine($fp, $line);
@@ -2210,86 +2238,83 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
                if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) {
                        $line = rtrim($line);
             
-            // split one line
+                       // split one line
                        $a = iil_ExplodeQuotedString(' ', $line);
             
-            // last string is folder name
-            //$folder = UTF7DecodeString(str_replace('"', '', $a[count($a)-1]));
-            $folder = str_replace('"', '', $a[count($a)-1]);
+                       // last string is folder name
+                       //$folder = UTF7DecodeString(str_replace('"', '', $a[count($a)-1]));
+                       $folder = trim($a[count($a)-1], '"');
             
                        if ((!in_array($folder, $folders)) && (empty($ignore)
-                || (!empty($ignore) && !eregi($ignore, $folder)))) {
+                               || (!empty($ignore) && !eregi($ignore, $folder)))) {
                            $folders[$i] = $folder;
-            }
+                       }
             
-            // second from last is delimiter
-            $delim = str_replace('"', '', $a[count($a)-2]);
+                       // second from last is delimiter
+                       $delim = trim($a[count($a)-2], '"');
             
-            // is it a container?
-            $i++;
+                       // is it a container?
+                       $i++;
                }
        } while (!iil_StartsWith($line, 'lsb'));
 
        if (is_array($folders)) {
-        if (!empty($ref)) {
-            // if rootdir was specified, make sure it's the first element
-            // some IMAP servers (i.e. Courier) won't return it
-            if ($ref[strlen($ref)-1]==$delim) {
-                $ref = substr($ref, 0, strlen($ref)-1);
-            }
-            if ($folders[0]!=$ref) {
-                array_unshift($folders, $ref);
-            }
-        }
-        return $folders;
+           if (!empty($ref)) {
+               // if rootdir was specified, make sure it's the first element
+               // some IMAP servers (i.e. Courier) won't return it
+               if ($ref[strlen($ref)-1]==$delim) {
+                   $ref = substr($ref, 0, strlen($ref)-1);
+               }
+               if ($folders[0]!=$ref) {
+                   array_unshift($folders, $ref);
+               }
+           }
+           return $folders;
        }
        $conn->error = $line;
        return false;
 }
 
-
 function iil_C_Subscribe(&$conn, $folder) {
        $fp = $conn->fp;
 
-       $query = 'sub1 SUBSCRIBE "' . $folder. '"' . "\r\n";
-       fputs($fp, $query);
+       $query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"';
+       iil_PutLine($fp, $query);
 
-       $line = trim(chop(iil_ReadLine($fp, 10000)));
+       $line = trim(iil_ReadLine($fp, 10000));
        return iil_ParseResult($line);
 }
 
-
 function iil_C_UnSubscribe(&$conn, $folder) {
        $fp = $conn->fp;
 
-       $query = 'usub1 UNSUBSCRIBE "' . $folder . '"' . "\r\n";
-       fputs($fp, $query);
+       $query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"';
+       iil_PutLine($fp, $query);
     
-       $line = trim(chop(iil_ReadLine($fp, 10000)));
+       $line = trim(iil_ReadLine($fp, 10000));
        return iil_ParseResult($line);
 }
 
-
 function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
        $fp     = $conn->fp;
        $result = false;
        if (($part == 0) || (empty($part))) {
            $part = 'HEADER';
-    } else {
-        $part .= '.MIME';
+       } else {
+           $part .= '.MIME';
        }
     
        if (iil_C_Select($conn, $mailbox)) {
                $key     = 'fh' . ($c++);
-               $request = $key . " FETCH $id (BODY.PEEK[$part])\r\n";
-               if (!fputs($fp, $request)) return false;
+               $request = $key . " FETCH $id (BODY.PEEK[$part])";
+               if (!iil_PutLine($fp, $request)) return false;
                do {
                        $line = chop(iil_ReadLine($fp, 200));
                        $a    = explode(' ', $line);
                        if (($line[0] == '*') && ($a[2] == 'FETCH')
                 && ($line[strlen($line)-1] != ')')) {
                                $line=iil_ReadLine($fp, 300);
-                               while (chop($line) != ')') {
+                               while (trim($line) != ')') {
                                        $result .= $line;
                                        $line=iil_ReadLine($fp, 300);
                                }
@@ -2300,13 +2325,13 @@ function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
        return $result;
 }
 
-
 function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
-    /* modes:
+       /* modes:
         1: return string
         2: print
         3: base64 and print
-    */
+       */
+       
        $fp     = $conn->fp;
        $result = false;
        if (($part == 0) || empty($part)) {
@@ -2314,95 +2339,103 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
        }
     
        if (iil_C_Select($conn, $mailbox)) {
-        $reply_key = '* ' . $id;
+               $reply_key = '* ' . $id;
         
-        // format request
+               // format request
                $key     = 'ftch' . ($c++) . ' ';
-               $request = $key . "FETCH $id (BODY.PEEK[$part])\r\n";
-        // send request
-               if (!fputs($fp, $request)) {
+               $request = $key . "FETCH $id (BODY.PEEK[$part])";
+               // send request
+               if (!iil_PutLine($fp, $request)) {
                    return false;
-        }
+               }
         
-        // receive reply line
-        do {
-            $line = chop(iil_ReadLine($fp, 1000));
-            $a    = explode(' ', $line);
-        } while ($a[2] != 'FETCH');
-        $len = strlen($line);
-        if ($line[$len-1] == ')') {
-            //one line response, get everything between first and last quotes
-            $from = strpos($line, '"') + 1;
-            $to   = strrpos($line, '"');
-            $len  = $to - $from;
-            if ($mode == 1) {
-                $result = substr($line, $from, $len);
-            } else if ($mode == 2) {
-                echo substr($line, $from, $len);
-            } else if ($mode == 3) {
-                echo base64_decode(substr($line, $from, $len));
-            }
-        }else if ($line[$len-1] == '}') {
-            //multi-line request, find sizes of content and receive that many bytes
-            $from     = strpos($line, '{') + 1;
-            $to       = strrpos($line, '}');
-            $len      = $to - $from;
-            $sizeStr  = substr($line, $from, $len);
-            $bytes    = (int)$sizeStr;
-            $received = 0;
-            while ($received < $bytes) {
-                $remaining = $bytes - $received;
-                $line      = iil_ReadLine($fp, 1024);
-                $len       = strlen($line);
+               // receive reply line
+               do {
+                       $line = chop(iil_ReadLine($fp, 1000));
+                       $a    = explode(' ', $line);
+               } while ($a[2] != 'FETCH');
+               $len = strlen($line);
+    
+               if ($line[$len-1] == ')') {
+                       // one line response, get everything between first and last quotes
+                       if (substr($line, -4, 3) == 'NIL') {
+                               // NIL response
+                               $result = '';
+                       } else {
+                               $from = strpos($line, '"') + 1;
+                               $to   = strrpos($line, '"');
+                               $len  = $to - $from;
+                               $result = substr($line, $from, $len);
+                       }
+           
+                       if ($mode == 2) {
+                               echo $result;
+                       } else if ($mode == 3) {
+                               echo base64_decode($result);
+                       }
+               } else if ($line[$len-1] == '}') {
+                       //multi-line request, find sizes of content and receive that many bytes
+                       $from     = strpos($line, '{') + 1;
+                       $to       = strrpos($line, '}');
+                       $len      = $to - $from;
+                       $sizeStr  = substr($line, $from, $len);
+                       $bytes    = (int)$sizeStr;
+                       $received = 0;
+
+                       while ($received < $bytes) {
+                               $remaining = $bytes - $received;
+                               $line      = iil_ReadLine($fp, 1024);
+                               $len       = strlen($line);
                 
-                if ($len > $remaining) {
-                    $line = substr($line, 0, $remaining);
-                }
-                $received += strlen($line);
-                if ($mode == 1) {
-                    $result .= chop($line) . "\n";
-                } else if ($mode == 2) {
-                    echo chop($line) . "\n"; flush();
-                } else if ($mode == 3) {
-                    echo base64_decode($line); flush();
-                }
-            }
-        }
-        // read in anything up until 'til last line
+                               if ($len > $remaining) {
+                                       $line = substr($line, 0, $remaining);
+                               }
+                               $received += strlen($line);
+                               if ($mode == 1) {
+                                       $result .= rtrim($line, "\t\r\n\0\x0B") . "\n";
+                               } else if ($mode == 2) {
+                                       echo rtrim($line, "\t\r\n\0\x0B") . "\n"; flush();
+                               } else if ($mode == 3) {
+                                       echo base64_decode($line); flush();
+                               }
+                       }
+               }
+               // read in anything up until 'til last line
                do {
-            $line = iil_ReadLine($fp, 1024);
+                       $line = iil_ReadLine($fp, 1024);
                } while (!iil_StartsWith($line, $key));
         
-        if ($result) {
-                       $result = chop($result);
-            return $result; // substr($result, 0, strlen($result)-1);
-        }
-        return false;
+               if ($result) {
+                       $result = rtrim($result, "\t\r\n\0\x0B");
+                       return $result; // substr($result, 0, strlen($result)-1);
+               }
+               
+               return false;
        } else {
                echo 'Select failed.';
        }
     
-    if ($mode==1) {
-        return $result;
-    }
-    return $received;
+       if ($mode==1) {
+               return $result;
+       }
+       return $received;
 }
 
 function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part) {
-    return iil_C_HandlePartBody($conn, $mailbox, $id, $part, 1);
+       return iil_C_HandlePartBody($conn, $mailbox, $id, $part, 1);
 }
 
 function iil_C_PrintPartBody(&$conn, $mailbox, $id, $part) {
-    iil_C_HandlePartBody($conn, $mailbox, $id, $part, 2);
+       iil_C_HandlePartBody($conn, $mailbox, $id, $part, 2);
 }
 
 function iil_C_PrintBase64Body(&$conn, $mailbox, $id, $part) {
-    iil_C_HandlePartBody($conn, $mailbox, $id, $part, 3);
+       iil_C_HandlePartBody($conn, $mailbox, $id, $part, 3);
 }
 
 function iil_C_CreateFolder(&$conn, $folder) {
        $fp = $conn->fp;
-       if (fputs($fp, 'c CREATE "' . $folder . '"' . "\r\n")) {
+       if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) {
                do {
                        $line=iil_ReadLine($fp, 300);
                } while ($line[0] != 'c');
@@ -2414,31 +2447,31 @@ function iil_C_CreateFolder(&$conn, $folder) {
 
 function iil_C_RenameFolder(&$conn, $from, $to) {
        $fp = $conn->fp;
-       if (fputs($fp, 'r RENAME "' . $from . '" "' . $to . '"' . "\r\n")) {
+       if (iil_PutLine($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"')) {
                do {
                        $line = iil_ReadLine($fp, 300);
                } while ($line[0] != 'r');
                return (iil_ParseResult($line) == 0);
        }
-    return false;
+       return false;
 }
 
 function iil_C_DeleteFolder(&$conn, $folder) {
        $fp = $conn->fp;
-       if (fputs($fp, 'd DELETE "' . $folder. '"' . "\r\n")) {
+       if (iil_PutLine($fp, 'd DELETE "' . iil_Escape($folder). '"')) {
                do {
                        $line=iil_ReadLine($fp, 300);
                } while ($line[0] != 'd');
                return (iil_ParseResult($line) == 0);
        }
-    $conn->error = "Couldn't send command\n";
+       $conn->error = "Couldn't send command\n";
        return false;
 }
 
 function iil_C_Append(&$conn, $folder, &$message) {
        if (!$folder) {
-        return false;
-    }
+               return false;
+       }
        $fp = $conn->fp;
 
        $message = str_replace("\r", '', $message);
@@ -2446,11 +2479,12 @@ function iil_C_Append(&$conn, $folder, &$message) {
 
        $len = strlen($message);
        if (!$len) {
-        return false;
+               return false;
        }
-       $request = 'A APPEND "' . $folder .'" (\\Seen) {' . $len . "}\r\n";
+
+       $request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}';
     
-       if (fputs($fp, $request)) {
+       if (iil_PutLine($fp, $request)) {
                $line=iil_ReadLine($fp, 100);           
                $sent = fwrite($fp, $message."\r\n");
                do {
@@ -2460,15 +2494,14 @@ function iil_C_Append(&$conn, $folder, &$message) {
                $result = (iil_ParseResult($line) == 0);
                if (!$result) {
                    $conn->error .= $line . "\n";
-        }
+               }
                return $result;
-       
        }
+
        $conn->error .= "Couldn't send command \"$request\"\n";
-    return false;
+       return false;
 }
 
-
 function iil_C_AppendFromFile(&$conn, $folder, $path) {
        if (!$folder) {
            return false;
@@ -2477,8 +2510,8 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
        //open message file
        $in_fp = false;                         
        if (file_exists(realpath($path))) {
-           $in_fp = fopen($path, 'r');
-    }
+               $in_fp = fopen($path, 'r');
+       }
        if (!$in_fp) { 
                $conn->error .= "Couldn't open $path for reading\n";
                return false;
@@ -2487,24 +2520,24 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
        $fp  = $conn->fp;
        $len = filesize($path);
        if (!$len) {
-           return false;
+               return false;
        }
     
        //send APPEND command
-       $request    = 'A APPEND "' . $folder . '" (\\Seen) {' . $len . "}\r\n";
+       $request    = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
        $bytes_sent = 0;
-       if (fputs($fp, $request)) {
+       if (iil_PutLine($fp, $request)) {
                $line = iil_ReadLine($fp, 100);
                                
                //send file
                while (!feof($in_fp)) {
                        $buffer      = fgets($in_fp, 4096);
                        $bytes_sent += strlen($buffer);
-                       fputs($fp, $buffer);
+                       iil_PutLine($fp, $buffer, false);
                }
                fclose($in_fp);
 
-               fputs($fp, "\r\n");
+               iil_PutLine($fp, '');
 
                //read response
                do {
@@ -2515,44 +2548,29 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
                if (!$result) {
                    $conn->error .= $line . "\n";
                }
-        return $result;
-       
+        
+               return $result;
        }
+       
        $conn->error .= "Couldn't send command \"$request\"\n";
        return false;
 }
 
-
 function iil_C_FetchStructureString(&$conn, $folder, $id) {
        $fp     = $conn->fp;
        $result = false;
+       
        if (iil_C_Select($conn, $folder)) {
                $key = 'F1247';
         
-               if (fputs($fp, "$key FETCH $id (BODYSTRUCTURE)\r\n")) {
+               if (iil_PutLine($fp, "$key FETCH $id (BODYSTRUCTURE)")) {
                        do {
-                               $line=chop(iil_ReadLine($fp, 5000));
-                               if ($line[0] == '*') {
-                                       if (ereg("\}$", $line)) {
-                                               preg_match('/(.+)\{([0-9]+)\}/', $line, $match);  
-                                               $result = $match[1];
-                                               do {
-                                                       $line = chop(iil_ReadLine($fp, 100));
-                                                       if (!preg_match("/^$key/", $line)) {
-                                                           $result .= $line;
-                            } else {
-                                $done = true;
-                            }
-                                               } while (!$done);
-                                       } else {
-                                               $result = $line;
-                                       }
-                                       list($pre, $post) = explode('BODYSTRUCTURE ', $result);
-                                       
-                                       //truncate last ')' and return
-                                       $result = substr($post, 0, strlen($post)-1);
-                               }
+                               $line = iil_ReadLine($fp, 5000);
+                               $line = iil_MultLine($fp, $line);
+                               $result .= $line;
                        } while (!preg_match("/^$key/", $line));
+
+                       $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -(strlen($result)-strrpos($result, $key)+1)));
                }
        }
        return $result;
@@ -2577,12 +2595,12 @@ function iil_C_GetQuota(&$conn) {
        $quota_line = '';
        
        //get line containing quota info
-       if (fputs($fp, 'QUOT1 GETQUOTAROOT "INBOX"' . "\r\n")) {
+       if (iil_PutLine($fp, 'QUOT1 GETQUOTAROOT "INBOX"')) {
                do {
                        $line=chop(iil_ReadLine($fp, 5000));
                        if (iil_StartsWith($line, '* QUOTA ')) {
-                           $quota_line = $line;
-            }
+                               $quota_line = $line;
+                       }
                } while (!iil_StartsWith($line, 'QUOT1'));
        }
        
@@ -2605,12 +2623,12 @@ function iil_C_GetQuota(&$conn) {
        return $result;
 }
 
-
 function iil_C_ClearFolder(&$conn, $folder) {
        $num_in_trash = iil_C_CountMessages($conn, $folder);
        if ($num_in_trash > 0) {
-           iil_C_Delete($conn, $folder, '1:' . $num_in_trash);
-    }
+               iil_C_Delete($conn, $folder, '1:' . $num_in_trash);
+       }
        return (iil_C_Expunge($conn, $folder) >= 0);
 }
+
 ?>
diff --git a/program/lib/magic b/program/lib/magic
deleted file mode 100644 (file)
index 85b5e8b..0000000
+++ /dev/null
@@ -1,10810 +0,0 @@
-# Magic
-# Magic data for file(1) command.
-# Machine-generated from src/cmd/file/magdir/*; edit there only!
-# Format is described in magic(files), where:
-# files is 5 on V7 and BSD, 4 on SV, and ?? in the SVID.
-
-#------------------------------------------------------------------------------
-# Localstuff:  file(1) magic for locally observed files
-#
-# $Id: Localstuff,v 1.4 2003/03/23 04:17:27 christos Exp $
-# Add any locally observed files here.  Remember:
-# text if readable, executable if runnable binary, data if unreadable.
-
-#------------------------------------------------------------------------------
-# zyxel:  file(1) magic for ZyXEL modems
-#
-# From <rob@pe1chl.ampr.org>
-# These are the /etc/magic entries to decode datafiles as used for the
-# ZyXEL U-1496E DATA/FAX/VOICE modems.  (This header conforms to a
-# ZyXEL-defined standard)
-
-0      string          ZyXEL\002       ZyXEL voice data
->10    byte            0               - CELP encoding
->10    byte&0x0B       1               - ADPCM2 encoding
->10    byte&0x0B       2               - ADPCM3 encoding
->10    byte&0x0B       3               - ADPCM4 encoding
->10    byte&0x0B       8               - New ADPCM3 encoding
->10    byte&0x04       4               with resync
-
-#------------------------------------------------------------------------------
-# file(1) magic(5) data for xdelta  Josh MacDonald <jmacd@CS.Berkeley.EDU>
-#
-0      string  %XDELTA%        XDelta binary patch file 0.14
-0      string  %XDZ000%        XDelta binary patch file 0.18
-0      string  %XDZ001%        XDelta binary patch file 0.20
-0      string  %XDZ002%        XDelta binary patch file 1.0
-0      string  %XDZ003%        XDelta binary patch file 1.0.4
-0      string  %XDZ004%        XDelta binary patch file 1.1
-#------------------------------------------------------------------------
-# sysex: file(1) magic for MIDI sysex files
-#
-# 
-0      byte                    0xF0            SysEx File -
-
-# North American Group
->1     byte                    0x01            Sequential
->1     byte                    0x02            IDP
->1     byte                    0x03            OctavePlateau
->1     byte                    0x04            Moog
->1     byte                    0x05            Passport
->1     byte                    0x06            Lexicon
->1     byte                    0x07            Kurzweil
->1     byte                    0x08            Fender
->1     byte                    0x09            Gulbransen
->1     byte                    0x0a            AKG
->1     byte                    0x0b            Voyce
->1     byte                    0x0c            Waveframe
->1     byte                    0x0d            ADA
->1     byte                    0x0e            Garfield
->1     byte                    0x0f            Ensoniq
->1     byte                    0x10            Oberheim
->1     byte                    0x11            Apple
->1     byte                    0x12            GreyMatter
->1     byte                    0x14            PalmTree
->1     byte                    0x15            JLCooper
->1     byte                    0x16            Lowrey
->1     byte                    0x17            AdamsSmith
->1     byte                    0x18            E-mu
->1     byte                    0x19            Harmony
->1     byte                    0x1a            ART
->1     byte                    0x1b            Baldwin
->1     byte                    0x1c            Eventide
->1     byte                    0x1d            Inventronics
->1     byte                    0x1f            Clarity
-
-# European Group
->1     byte                    0x21            SIEL
->1     byte                    0x22            Synthaxe
->1     byte                    0x24            Hohner
->1     byte                    0x25            Twister
->1     byte                    0x26            Solton
->1     byte                    0x27            Jellinghaus
->1     byte                    0x28            Southworth
->1     byte                    0x29            PPG
->1     byte                    0x2a            JEN
->1     byte                    0x2b            SSL
->1     byte                    0x2c            AudioVertrieb
-
->1     byte                    0x2f            ELKA
->>3    byte                    0x09            EK-44
-
->1     byte                    0x30            Dynacord
->1     byte                    0x33            Clavia
->1     byte                    0x39            Soundcraft
-
->1     byte                    0x3e            Waldorf
->>3    byte                    0x7f            Microwave I
-
-# Japanese Group
->1     byte                    0x40            Kawai
->>3    byte                    0x20            K1
->>3    byte                    0x22            K4
-
->1     byte                    0x41            Roland
->>3    byte                    0x14            D-50
->>3    byte                    0x2b            U-220
->>3    byte                    0x02            TR-707
-
->1     byte                    0x42            Korg
->>3    byte                    0x19            M1
-
->1     byte                    0x43            Yamaha
->1     byte                    0x44            Casio
->1     byte                    0x46            Kamiya
->1     byte                    0x47            Akai
->1     byte                    0x48            Victor
->1     byte                    0x49            Mesosha
->1     byte                    0x4b            Fujitsu
->1     byte                    0x4c            Sony
->1     byte                    0x4e            Teac
->1     byte                    0x50            Matsushita
->1     byte                    0x51            Fostex
->1     byte                    0x52            Zoom
->1     byte                    0x54            Matsushita
->1     byte                    0x57            Acoustic tech. lab.
-
->1     belong&0xffffff00       0x00007400      Ta Horng
->1     belong&0xffffff00       0x00007500      e-Tek
->1     belong&0xffffff00       0x00007600      E-Voice
->1     belong&0xffffff00       0x00007700      Midisoft
->1     belong&0xffffff00       0x00007800      Q-Sound
->1     belong&0xffffff00       0x00007900      Westrex
->1     belong&0xffffff00       0x00007a00      Nvidia*
->1     belong&0xffffff00       0x00007b00      ESS
->1     belong&0xffffff00       0x00007c00      Mediatrix
->1     belong&0xffffff00       0x00007d00      Brooktree
->1     belong&0xffffff00       0x00007e00      Otari
->1     belong&0xffffff00       0x00007f00      Key Electronics
->1     belong&0xffffff00       0x00010000      Shure
->1     belong&0xffffff00       0x00010100      AuraSound
->1     belong&0xffffff00       0x00010200      Crystal
->1     belong&0xffffff00       0x00010300      Rockwell
->1     belong&0xffffff00       0x00010400      Silicon Graphics
->1     belong&0xffffff00       0x00010500      Midiman
->1     belong&0xffffff00       0x00010600      PreSonus
->1     belong&0xffffff00       0x00010800      Topaz
->1     belong&0xffffff00       0x00010900      Cast Lightning
->1     belong&0xffffff00       0x00010a00      Microsoft
->1     belong&0xffffff00       0x00010b00      Sonic Foundry
->1     belong&0xffffff00       0x00010c00      Line 6
->1     belong&0xffffff00       0x00010d00      Beatnik Inc.
->1     belong&0xffffff00       0x00010e00      Van Koerving
->1     belong&0xffffff00       0x00010f00      Altech Systems
->1     belong&0xffffff00       0x00011000      S & S Research
->1     belong&0xffffff00       0x00011100      VLSI Technology
->1     belong&0xffffff00       0x00011200      Chromatic
->1     belong&0xffffff00       0x00011300      Sapphire
->1     belong&0xffffff00       0x00011400      IDRC
->1     belong&0xffffff00       0x00011500      Justonic Tuning
->1     belong&0xffffff00       0x00011600      TorComp
->1     belong&0xffffff00       0x00011700      Newtek Inc.
->1     belong&0xffffff00       0x00011800      Sound Sculpture
->1     belong&0xffffff00       0x00011900      Walker Technical
->1     belong&0xffffff00       0x00011a00      Digital Harmony
->1     belong&0xffffff00       0x00011b00      InVision
->1     belong&0xffffff00       0x00011c00      T-Square
->1     belong&0xffffff00       0x00011d00      Nemesys
->1     belong&0xffffff00       0x00011e00      DBX
->1     belong&0xffffff00       0x00011f00      Syndyne
->1     belong&0xffffff00       0x00012000      Bitheadz        
->1     belong&0xffffff00       0x00012100      Cakewalk
->1     belong&0xffffff00       0x00012200      Staccato
->1     belong&0xffffff00       0x00012300      National Semicon.
->1     belong&0xffffff00       0x00012400      Boom Theory
->1     belong&0xffffff00       0x00012500      Virtual DSP Corp
->1     belong&0xffffff00       0x00012600      Antares
->1     belong&0xffffff00       0x00012700      Angel Software
->1     belong&0xffffff00       0x00012800      St Louis Music
->1     belong&0xffffff00       0x00012900      Lyrrus dba G-VOX
->1     belong&0xffffff00       0x00012a00      Ashley Audio
->1     belong&0xffffff00       0x00012b00      Vari-Lite
->1     belong&0xffffff00       0x00012c00      Summit Audio
->1     belong&0xffffff00       0x00012d00      Aureal Semicon.
->1     belong&0xffffff00       0x00012e00      SeaSound
->1     belong&0xffffff00       0x00012f00      U.S. Robotics
->1     belong&0xffffff00       0x00013000      Aurisis
->1     belong&0xffffff00       0x00013100      Nearfield Multimedia
->1     belong&0xffffff00       0x00013200      FM7 Inc.
->1     belong&0xffffff00       0x00013300      Swivel Systems
->1     belong&0xffffff00       0x00013400      Hyperactive
->1     belong&0xffffff00       0x00013500      MidiLite
->1     belong&0xffffff00       0x00013600      Radical
->1     belong&0xffffff00       0x00013700      Roger Linn
->1     belong&0xffffff00       0x00013800      Helicon
->1     belong&0xffffff00       0x00013900      Event
->1     belong&0xffffff00       0x00013a00      Sonic Network
->1     belong&0xffffff00       0x00013b00      Realtime Music
->1     belong&0xffffff00       0x00013c00      Apogee Digital
-
->1     belong&0xffffff00       0x00202b00      Medeli Electronics
->1     belong&0xffffff00       0x00202c00      Charlie Lab
->1     belong&0xffffff00       0x00202d00      Blue Chip Music
->1     belong&0xffffff00       0x00202e00      BEE OH Corp
->1     belong&0xffffff00       0x00202f00      LG Semicon America
->1     belong&0xffffff00       0x00203000      TESI
->1     belong&0xffffff00       0x00203100      EMAGIC
->1     belong&0xffffff00       0x00203200      Behringer
->1     belong&0xffffff00       0x00203300      Access Music
->1     belong&0xffffff00       0x00203400      Synoptic
->1     belong&0xffffff00       0x00203500      Hanmesoft Corp
->1     belong&0xffffff00       0x00203600      Terratec
->1     belong&0xffffff00       0x00203700      Proel SpA
->1     belong&0xffffff00       0x00203800      IBK MIDI
->1     belong&0xffffff00       0x00203900      IRCAM
->1     belong&0xffffff00       0x00203a00      Propellerhead Software
->1     belong&0xffffff00       0x00203b00      Red Sound Systems
->1     belong&0xffffff00       0x00203c00      Electron ESI AB
->1     belong&0xffffff00       0x00203d00      Sintefex Audio
->1     belong&0xffffff00       0x00203e00      Music and More
->1     belong&0xffffff00       0x00203f00      Amsaro
->1     belong&0xffffff00       0x00204000      CDS Advanced Technology
->1     belong&0xffffff00       0x00204100      Touched by Sound
->1     belong&0xffffff00       0x00204200      DSP Arts
->1     belong&0xffffff00       0x00204300      Phil Rees Music
->1     belong&0xffffff00       0x00204400      Stamer Musikanlagen GmbH
->1     belong&0xffffff00       0x00204500      Soundart
->1     belong&0xffffff00       0x00204600      C-Mexx Software
->1     belong&0xffffff00       0x00204700      Klavis Tech.
->1     belong&0xffffff00       0x00204800      Noteheads AB
-
-0      string                  T707            Roland TR-707 Data
-
-#------------------------------------------------------------------------------
-# sccs:  file(1) magic for SCCS archives
-#
-# SCCS archive structure:
-# \001h01207
-# \001s 00276/00000/00000
-# \001d D 1.1 87/09/23 08:09:20 ian 1 0
-# \001c date and time created 87/09/23 08:09:20 by ian
-# \001e
-# \001u
-# \001U
-# ... etc.
-# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550).
-# *Sigh*. And these both came from various parts of the USG.
-# Maybe we should just switch everybody from SCCS to RCS!
-# Further, you can't just say '\001h0', because the five-digit number
-# is a checksum that could (presumably) have any leading digit,
-# and we don't have regular expression matching yet. 
-# Hence the following official kludge:
-8      string          \001s\                  SCCS archive data
-#------------------------------------------------------------------------------
-# allegro:  file(1) magic for Allegro datafiles
-# Toby Deshane <hac@shoelace.digivill.net>
-#
-0 belong 0x736C6821   Allegro datafile (packed)
-0 belong 0x736C682E   Allegro datafile (not packed/autodetect)
-0 belong 0x736C682B   Allegro datafile (appended exe data)
-#------------------------------------------------------------------------------
-# file(1) magic for cvs(1) files
-# From Hendrik Scholz <hendrik@scholz.net>
-
-0   string /1\ :pserver:    cvs password text file
-
-
-#------------------------------------------------------------------------------
-# vicar:  file(1) magic for VICAR files.
-#
-# From: Ossama Othman <othman@astrosun.tn.cornell.edu
-# VICAR is JPL's in-house spacecraft image processing program
-# VICAR image
-0      string  LBLSIZE=        VICAR image data
->32    string  BYTE            \b, 8 bits  = VAX byte
->32    string  HALF            \b, 16 bits = VAX word     = Fortran INTEGER*2
->32    string  FULL            \b, 32 bits = VAX longword = Fortran INTEGER*4
->32    string  REAL            \b, 32 bits = VAX longword = Fortran REAL*4
->32    string  DOUB            \b, 64 bits = VAX quadword = Fortran REAL*8
->32    string  COMPLEX         \b, 64 bits = VAX quadword = Fortran COMPLEX*8
-# VICAR label file
-43     string  SFDU_LABEL      VICAR label file
-
-#------------------------------------------------------------------------------
-# varied.out:  file(1) magic for various USG systems
-#
-#      Herewith many of the object file formats used by USG systems.
-#      Most have been moved to files for a particular processor,
-#      and deleted if they duplicate other entries.
-#
-0      short           0610            Perkin-Elmer executable
-# AMD 29K
-0      beshort         0572            amd 29k coff noprebar executable
-0      beshort         01572           amd 29k coff prebar executable
-0      beshort         0160007         amd 29k coff archive
-# Cray
-6      beshort         0407            unicos (cray) executable
-# Ultrix 4.3
-596    string          \130\337\377\377        Ultrix core file
->600   string          >\0             from '%s'
-# BeOS and MAcOS PEF executables
-# From: hplus@zilker.net (Jon Watte)
-0      string          Joy!peffpwpc    header for PowerPC PEF executable
-#
-# ava assembler/linker Uros Platise <uros.platise@ijs.si>
-0       string          avaobj  AVR assembler object code
->7      string          >\0     version '%s'
-# gnu gmon magic From: Eugen Dedu <dedu@ese-metz.fr>
-0      string          gmon            GNU prof performance data
->4     long            x               - version %ld
-# From: Dave Pearson <davep@davep.org>
-# Harbour <URL:http://www.harbour-project.org/> HRB files.
-0      string          \xc0HRB         Harbour HRB file
->4     short           x               version %d
-
-# From: "Stefan A. Haubenthal" <polluks@web.de>
-0      belong          0x000001EB      Plan 9 executable
-
-#------------------------------------------------------------------------------
-# c64:  file(1) magic for various commodore 64 related files
-#
-# From <doj@cubic.org>
-
-0x16500        belong          0x12014100      D64 Image
-0x16500        belong          0x12014180      D71 Image
-0x61800 belong         0x28034400      D81 Image
-0      string          C64\40CARTRIDGE CCS C64 Emultar Cartridge Image
-0      belong          0x43154164      X64 Image
-
-0      string          GCR-1541        GCR Image
->8     byte            x               version: $i
->9     byte            x               tracks: %i
-
-9      string          PSUR            ARC archive (c64)
-2      string          -LH1-           LHA archive (c64)
-
-0      string          C64File         PC64 Emulator file
->8     string          >\0             "%s"
-0      string          C64Image        PC64 Freezer Image
-
-0      beshort         0x38CD          C64 PCLink Image
-0      string          CBM\144\0\0     Power 64 C64 Emulator Snapshot
-
-0      belong          0xFF424CFF      WRAptor packer (c64)
-#------------------------------------------------------------------------------
-# games:  file(1) for games
-
-# Thomas M. Ott (ThMO)
-1      string  =WAD            DOOM data,
->0     string  =I              main wad
->0     string  =P              patch wad
->0     byte    x               unknown junk
-
-# Fabio Bonelli <fabiobonelli@libero.it>
-# Quake II - III data files
-0       string  IDP2           Quake II 3D Model file,
->20     long    x               %lu skin(s),
->8      long    x               (%lu x
->12     long    x              %lu),
->40     long    x               %lu frame(s),
->16     long    x               Frame size %lu bytes,
->24     long   x               %lu vertices/frame,
->28     long    x              %lu texture coordinates,
->32     long    x               %lu triangles/frame
-
-0       string  IBSP            Quake
->4      long    0x26            II Map file (BSP)
->4      long    0x2E           III Map file (BSP)
-
-0       string  IDS2            Quake II SP2 sprite file
-
-#---------------------------------------------------------------------------
-# Doom and Quake
-# submitted by Nicolas Patrois
-
-# DOOM
-
-0       string  IWAD    DOOM or DOOM ][ world
-0       string  PWAD    DOOM or DOOM ][ extension world
-
-0       string  \xcb\x1dBoom\xe6\xff\x03\x01    Boom or linuxdoom demo
-# some doom lmp files don't match, I've got one beginning with \x6d\x02\x01\x01
-
-24      string  LxD\ 203        Linuxdoom save
->0      string  x       , name=%s
->44     string  x       , world=%s
-
-# Quake
-
-0       string  PACK    Quake I or II world or extension
-
-#0       string  -1\x0a  Quake I demo
-#>30     string  x        version %.4s
-#>61     string  x        level %s       
-
-#0       string  5\x0a   Quake I save
-
-# The levels
-
-# Quake 1
-
-0      string  5\x0aIntroduction             Quake I save: start Introduction
-0      string  5\x0athe_Slipgate_Complex     Quake I save: e1m1 The slipgate complex
-0      string  5\x0aCastle_of_the_Damned     Quake I save: e1m2 Castle of the damned
-0      string  5\x0athe_Necropolis           Quake I save: e1m3 The necropolis
-0      string  5\x0athe_Grisly_Grotto        Quake I save: e1m4 The grisly grotto
-0      string  5\x0aZiggurat_Vertigo         Quake I save: e1m8 Ziggurat vertigo (secret)
-0      string  5\x0aGloom_Keep               Quake I save: e1m5 Gloom keep
-0      string  5\x0aThe_Door_To_Chthon       Quake I save: e1m6 The door to Chthon
-0      string  5\x0aThe_House_of_Chthon      Quake I save: e1m7 The house of Chthon
-0      string  5\x0athe_Installation         Quake I save: e2m1 The installation
-0      string  5\x0athe_Ogre_Citadel         Quake I save: e2m2 The ogre citadel
-0      string  5\x0athe_Crypt_of_Decay       Quake I save: e2m3 The crypt of decay (dopefish lives!)
-0      string  5\x0aUnderearth               Quake I save: e2m7 Underearth (secret)
-0      string  5\x0athe_Ebon_Fortress        Quake I save: e2m4 The ebon fortress
-0      string  5\x0athe_Wizard's_Manse       Quake I save: e2m5 The wizard's manse
-0      string  5\x0athe_Dismal_Oubliette     Quake I save: e2m6 The dismal oubliette
-0      string  5\x0aTermination_Central      Quake I save: e3m1 Termination central
-0      string  5\x0aVaults_of_Zin            Quake I save: e3m2 Vaults of Zin
-0      string  5\x0athe_Tomb_of_Terror       Quake I save: e3m3 The tomb of terror
-0      string  5\x0aSatan's_Dark_Delight     Quake I save: e3m4 Satan's dark delight
-0      string  5\x0athe_Haunted_Halls        Quake I save: e3m7 The haunted halls (secret)
-0      string  5\x0aWind_Tunnels             Quake I save: e3m5 Wind tunnels
-0      string  5\x0aChambers_of_Torment      Quake I save: e3m6 Chambers of torment
-0      string  5\x0athe_Sewage_System        Quake I save: e4m1 The sewage system
-0      string  5\x0aThe_Tower_of_Despair     Quake I save: e4m2 The tower of despair
-0      string  5\x0aThe_Elder_God_Shrine     Quake I save: e4m3 The elder god shrine
-0      string  5\x0athe_Palace_of_Hate       Quake I save: e4m4 The palace of hate
-0      string  5\x0aHell's_Atrium            Quake I save: e4m5 Hell's atrium
-0      string  5\x0athe_Nameless_City        Quake I save: e4m8 The nameless city (secret)
-0      string  5\x0aThe_Pain_Maze            Quake I save: e4m6 The pain maze
-0      string  5\x0aAzure_Agony              Quake I save: e4m7 Azure agony
-0      string  5\x0aShub-Niggurath's_Pit     Quake I save: end Shub-Niggurath's pit
-
-# Quake DeathMatch levels
-
-0      string  5\x0aPlace_of_Two_Deaths         Quake I save: dm1 Place of two deaths
-0      string  5\x0aClaustrophobopolis          Quake I save: dm2 Claustrophobopolis
-0      string  5\x0aThe_Abandoned_Base          Quake I save: dm3 The abandoned base
-0      string  5\x0aThe_Bad_Place               Quake I save: dm4 The bad place
-0      string  5\x0aThe_Cistern                 Quake I save: dm5 The cistern
-0      string  5\x0aThe_Dark_Zone               Quake I save: dm6 The dark zone
-
-# Scourge of Armagon
-
-0      string  5\x0aCommand_HQ               Quake I save: start Command HQ
-0      string  5\x0aThe_Pumping_Station      Quake I save: hip1m1 The pumping station
-0      string  5\x0aStorage_Facility         Quake I save: hip1m2 Storage facility
-0      string  5\x0aMilitary_Complex         Quake I save: hip1m5 Military complex (secret)
-0      string  5\x0athe_Lost_Mine            Quake I save: hip1m3 The lost mine
-0      string  5\x0aResearch_Facility        Quake I save: hip1m4 Research facility
-0      string  5\x0aAncient_Realms           Quake I save: hip2m1 Ancient realms
-0      string  5\x0aThe_Gremlin's_Domain     Quake I save: hip2m6 The gremlin's domain (secret)
-0      string  5\x0aThe_Black_Cathedral      Quake I save: hip2m2 The black cathedral
-0      string  5\x0aThe_Catacombs            Quake I save: hip2m3 The catacombs
-0      string  5\x0athe_Crypt__              Quake I save: hip2m4 The crypt
-0      string  5\x0aMortum's_Keep            Quake I save: hip2m5 Mortum's keep
-0      string  5\x0aTur_Torment              Quake I save: hip3m1 Tur torment
-0      string  5\x0aPandemonium              Quake I save: hip3m2 Pandemonium
-0      string  5\x0aLimbo                    Quake I save: hip3m3 Limbo
-0      string  5\x0athe_Edge_of_Oblivion     Quake I save: hipdm1 The edge of oblivion (secret)
-0      string  5\x0aThe_Gauntlet             Quake I save: hip3m4 The gauntlet
-0      string  5\x0aArmagon's_Lair           Quake I save: hipend Armagon's lair
-
-# Malice
-
-0      string  5\x0aThe_Academy      Quake I save: start The academy
-0      string  5\x0aThe_Lab          Quake I save: d1 The lab
-0      string  5\x0aArea_33          Quake I save: d1b Area 33
-0      string  5\x0aSECRET_MISSIONS  Quake I save: d3b Secret missions
-0      string  5\x0aThe_Hospital     Quake I save: d10 The hospital (secret)
-0      string  5\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret)
-0      string  5\x0aBACK_2_MALICE    Quake I save: d4b Back to Malice
-0      string  5\x0aArea44           Quake I save: d1c Area 44
-0      string  5\x0aTakahiro_Towers  Quake I save: d2 Takahiro towers
-0      string  5\x0aA_Rat's_Life     Quake I save: d3 A rat's life
-0      string  5\x0aInto_The_Flood   Quake I save: d4 Into the flood
-0      string  5\x0aThe_Flood        Quake I save: d5 The flood
-0      string  5\x0aNuclear_Plant    Quake I save: d6 Nuclear plant
-0      string  5\x0aThe_Incinerator_Plant    Quake I save: d7 The incinerator plant
-0      string  5\x0aThe_Foundry              Quake I save: d7b The foundry
-0      string  5\x0aThe_Underwater_Base      Quake I save: d8 The underwater base
-0      string  5\x0aTakahiro_Base            Quake I save: d9 Takahiro base
-0      string  5\x0aTakahiro_Laboratories    Quake I save: d12 Takahiro laboratories
-0      string  5\x0aStayin'_Alive    Quake I save: d13 Stayin' alive
-0      string  5\x0aB.O.S.S._HQ      Quake I save: d14 B.O.S.S. HQ
-0      string  5\x0aSHOWDOWN!        Quake I save: d15 Showdown!
-
-# Malice DeathMatch levels
-
-0      string  5\x0aThe_Seventh_Precinct        Quake I save: ddm1 The seventh precinct
-0      string  5\x0aSub_Station                 Quake I save: ddm2 Sub station
-0      string  5\x0aCrazy_Eights!               Quake I save: ddm3 Crazy eights!
-0      string  5\x0aEast_Side_Invertationa      Quake I save: ddm4 East side invertationa
-0      string  5\x0aSlaughterhouse              Quake I save: ddm5 Slaughterhouse
-0      string  5\x0aDOMINO                      Quake I save: ddm6 Domino
-0      string  5\x0aSANDRA'S_LADDER             Quake I save: ddm7 Sandra's ladder
-
-
-0      string  MComprHD        MAME CHD compressed hard disk image,
->12    belong  x               version %lu
-#------------------------------------------------------------------------------
-# Mavroyanopoulos Nikos <nmav@hellug.gr>
-# mcrypt:   file(1) magic for mcrypt 2.2.x;
-0      string          \0m\3           mcrypt 2.5 encrypted data,
->4     string          >\0             algorithm: %s,
->>&1   leshort         >0              keysize: %d bytes,
->>>&0  string          >\0             mode: %s,
-
-0      string          \0m\2           mcrypt 2.2 encrypted data,
->3     byte            0               algorithm: blowfish-448,
->3     byte            1               algorithm: DES,
->3     byte            2               algorithm: 3DES,
->3     byte            3               algorithm: 3-WAY,
->3     byte            4               algorithm: GOST,
->3     byte            6               algorithm: SAFER-SK64,
->3     byte            7               algorithm: SAFER-SK128,
->3     byte            8               algorithm: CAST-128,
->3     byte            9               algorithm: xTEA,
->3     byte            10              algorithm: TWOFISH-128,
->3     byte            11              algorithm: RC2,
->3     byte            12              algorithm: TWOFISH-192,
->3     byte            13              algorithm: TWOFISH-256,
->3     byte            14              algorithm: blowfish-128,
->3     byte            15              algorithm: blowfish-192,
->3     byte            16              algorithm: blowfish-256,
->3     byte            100             algorithm: RC6,
->3     byte            101             algorithm: IDEA,
->4     byte            0               mode: CBC,
->4     byte            1               mode: ECB,
->4     byte            2               mode: CFB,
->4     byte            3               mode: OFB,
->4     byte            4               mode: nOFB,
->5     byte            0               keymode: 8bit
->5     byte            1               keymode: 4bit
->5     byte            2               keymode: SHA-1 hash
->5     byte            3               keymode: MD5 hash
-
-#------------------------------------------------------------------------------
-# archive:  file(1) magic for archive formats (see also "msdos" for self-
-#           extracting compressed archives)
-#
-# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.
-# pre-POSIX "tar" archives are handled in the C code.
-
-# POSIX tar archives
-257    string          ustar\0         POSIX tar archive
-257    string          ustar\040\040\0 GNU tar archive
-
-# cpio archives
-#
-# Yes, the top two "cpio archive" formats *are* supposed to just be "short".
-# The idea is to indicate archives produced on machines with the same
-# byte order as the machine running "file" with "cpio archive", and
-# to indicate archives produced on machines with the opposite byte order
-# from the machine running "file" with "byte-swapped cpio archive".
-#
-# The SVR4 "cpio(4)" hints that there are additional formats, but they
-# are defined as "short"s; I think all the new formats are
-# character-header formats and thus are strings, not numbers.
-0      short           070707          cpio archive
-0      short           0143561         byte-swapped cpio archive
-0      string          070707          ASCII cpio archive (pre-SVR4 or odc)
-0      string          070701          ASCII cpio archive (SVR4 with no CRC)
-0      string          070702          ASCII cpio archive (SVR4 with CRC)
-
-# Debian package (needs to go before regular portable archives)
-#
-0      string          !<arch>\ndebian
->8     string          debian-split    part of multipart Debian package
->8     string          debian-binary   Debian binary package
->68    string          >\0             (format %s)
->81    string          bz2             \b, uses bzip2 compression
->84    string          gz              \b, uses gzip compression
-#>136  ledate          x               created: %s
-
-# other archives
-0      long            0177555         very old archive
-0      short           0177555         very old PDP-11 archive
-0      long            0177545         old archive
-0      short           0177545         old PDP-11 archive
-0      long            0100554         apl workspace
-0      string          =<ar>           archive
-
-# MIPS archive (needs to go before regular portable archives)
-#
-0      string  !<arch>\n__________E    MIPS archive
->20    string  U                       with MIPS Ucode members
->21    string  L                       with MIPSEL members
->21    string  B                       with MIPSEB members
->19    string  L                       and an EL hash table
->19    string  B                       and an EB hash table
->22    string  X                       -- out of date
-
-0      string          -h-             Software Tools format archive text
-
-#
-# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is
-# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
-#
-# 0    string          !<arch>         current ar archive
-# 0    long            0x213c6172      archive file
-#
-# and for SVR1 archives, we have:
-#
-# 0    string          \<ar>           System V Release 1 ar archive
-# 0    string          =<ar>           archive
-#
-# XXX - did Aegis really store shared libraries, breakpointed modules,
-# and absolute code program modules in the same format as new-style
-# "ar" archives?
-#
-0      string          !<arch>         current ar archive
->8     string          __.SYMDEF       random library
->0     belong          =65538          - pre SR9.5
->0     belong          =65539          - post SR9.5
->0     beshort         2               - object archive
->0     beshort         3               - shared library module
->0     beshort         4               - debug break-pointed module
->0     beshort         5               - absolute code program module
-0      string          \<ar>           System V Release 1 ar archive
-0      string          =<ar>           archive
-#
-# XXX - from "vax", which appears to collect a bunch of byte-swapped
-# thingies, to help you recognize VAX files on big-endian machines;
-# with "leshort", "lelong", and "string", that's no longer necessary....
-#
-0      belong          0x65ff0000      VAX 3.0 archive
-0      belong          0x3c61723e      VAX 5.0 archive
-#
-0      long            0x213c6172      archive file
-0      lelong          0177555         very old VAX archive
-0      leshort         0177555         very old PDP-11 archive
-#
-# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
-# be a random library (it said 0xff65 rather than 0177545).
-#
-0      lelong          0177545         old VAX archive
->8     string          __.SYMDEF       random library
-0      leshort         0177545         old PDP-11 archive
->8     string          __.SYMDEF       random library
-#
-# From "pdp" (but why a 4-byte quantity?)
-#
-0      lelong          0x39bed         PDP-11 old archive
-0      lelong          0x39bee         PDP-11 4.0 archive
-
-# ARC archiver, from Daniel Quinlan (quinlan@yggdrasil.com)
-#
-# The first byte is the magic (0x1a), byte 2 is the compression type for
-# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS
-# filename of the first file (null terminated).  Since some types collide
-# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),
-# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%).  0x01 collides with terminfo.
-0      lelong&0x8080ffff       0x0000081a      ARC archive data, dynamic LZW
-0      lelong&0x8080ffff       0x0000091a      ARC archive data, squashed
-0      lelong&0x8080ffff       0x0000021a      ARC archive data, uncompressed
-0      lelong&0x8080ffff       0x0000031a      ARC archive data, packed
-0      lelong&0x8080ffff       0x0000041a      ARC archive data, squeezed
-0      lelong&0x8080ffff       0x0000061a      ARC archive data, crunched
-
-# Acorn archive formats (Disaster prone simpleton, m91dps@ecs.ox.ac.uk)
-# I can't create either SPARK or ArcFS archives so I have not tested this stuff
-# [GRR:  the original entries collide with ARC, above; replaced with combined
-#  version (not tested)]
-#0     byte            0x1a            RISC OS archive
-#>1    string          archive         (ArcFS format)
-#0     string          \032archive     RISC OS archive (ArcFS format)
-0       string          \032            RISC OS archive (spark format)
-0       string          Archive\000     RISC OS archive (ArcFS format)
-
-# ARJ archiver (jason@jarthur.Claremont.EDU)
-0      leshort         0xea60          ARJ archive data
->5     byte            x               \b, v%d,
->8     byte            &0x04           multi-volume,
->8     byte            &0x10           slash-switched,
->8     byte            &0x20           backup,
->34    string          x               original name: %s,
->7     byte            0               os: MS-DOS
->7     byte            1               os: PRIMOS
->7     byte            2               os: Unix
->7     byte            3               os: Amiga
->7     byte            4               os: Macintosh
->7     byte            5               os: OS/2
->7     byte            6               os: Apple ][ GS
->7     byte            7               os: Atari ST
->7     byte            8               os: NeXT
->7     byte            9               os: VAX/VMS
->3     byte            >0              %d]
-
-# HA archiver (Greg Roelofs, newt@uchicago.edu)
-# This is a really bad format. A file containing HAWAII will match this...
-#0     string          HA              HA archive data,
-#>2    leshort         =1              1 file,
-#>2    leshort         >1              %u files,
-#>4    byte&0x0f       =0              first is type CPY
-#>4    byte&0x0f       =1              first is type ASC
-#>4    byte&0x0f       =2              first is type HSC
-#>4    byte&0x0f       =0x0e           first is type DIR
-#>4    byte&0x0f       =0x0f           first is type SPECIAL
-
-# HPACK archiver (Peter Gutmann, pgut1@cs.aukuni.ac.nz)
-0      string          HPAK            HPACK archive data
-
-# JAM Archive volume format, by Dmitry.Kohmanyuk@UA.net
-0      string          \351,\001JAM\           JAM archive,
->7     string          >\0                     version %.4s
->0x26  byte            =0x27                   -
->>0x2b string          >\0                     label %.11s,
->>0x27 lelong          x                       serial %08x,
->>0x36 string          >\0                     fstype %.8s
-
-# LHARC/LHA archiver (Greg Roelofs, newt@uchicago.edu)
-2      string          -lh0-           LHarc 1.x archive data [lh0]
-2      string          -lh1-           LHarc 1.x archive data [lh1]
-2      string          -lz4-           LHarc 1.x archive data [lz4]
-2      string          -lz5-           LHarc 1.x archive data [lz5]
-#      [never seen any but the last; -lh4- reported in comp.compression:]
-2      string          -lzs-           LHa 2.x? archive data [lzs]
-2      string          -lh\40-         LHa 2.x? archive data [lh ]
-2      string          -lhd-           LHa 2.x? archive data [lhd]
-2      string          -lh2-           LHa 2.x? archive data [lh2]
-2      string          -lh3-           LHa 2.x? archive data [lh3]
-2      string          -lh4-           LHa (2.x) archive data [lh4]
-2      string          -lh5-           LHa (2.x) archive data [lh5]
-2      string          -lh6-           LHa (2.x) archive data [lh6]
-2      string          -lh7-           LHa (2.x) archive data [lh7]
->20    byte            x               - header level %d
-
-# RAR archiver (Greg Roelofs, newt@uchicago.edu)
-0      string          Rar!            RAR archive data,
->44    byte            x               v%0x,
->35    byte            0               os: MS-DOS
->35    byte            1               os: OS/2
->35    byte            2               os: Win32
->35    byte            3               os: Unix
-
-# SQUISH archiver (Greg Roelofs, newt@uchicago.edu)
-0      string          SQSH            squished archive data (Acorn RISCOS)
-
-# UC2 archiver (Greg Roelofs, newt@uchicago.edu)
-# I can't figure out the self-extracting form of these buggers...
-0      string          UC2\x1a         UC2 archive data
-
-# ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
-0      string          PK\003\004      Zip archive data
->4     byte            0x09            \b, at least v0.9 to extract
->4     byte            0x0a            \b, at least v1.0 to extract
->4     byte            0x0b            \b, at least v1.1 to extract
->4     byte            0x14            \b, at least v2.0 to extract
-
-# Zoo archiver
-20     lelong          0xfdc4a7dc      Zoo archive data
->4     byte            >48             \b, v%c.
->>6    byte            >47             \b%c
->>>7   byte            >47             \b%c
->32    byte            >0              \b, modify: v%d
->>33   byte            x               \b.%d+
->42    lelong          0xfdc4a7dc      \b,
->>70   byte            >0              extract: v%d
->>>71  byte            x               \b.%d+
-
-# Shell archives
-10     string          #\ This\ is\ a\ shell\ archive  shell archive text
-
-#
-# LBR. NB: May conflict with the questionable 
-#          "binary Computer Graphics Metafile" format.
-#
-0       string  \0\ \ \ \ \ \ \ \ \ \ \ \0\0    LBR archive data
-#
-# PMA (CP/M derivative of LHA)
-#
-2       string          -pm0-           PMarc archive data [pm0]
-2       string          -pm1-           PMarc archive data [pm1]
-2       string          -pm2-           PMarc archive data [pm2]
-2       string          -pms-           PMarc SFX archive (CP/M, DOS)
-5       string          -pc1-           PopCom compressed executable (CP/M)
-
-# From Rafael Laboissiere <rafael@laboissiere.net>
-# The Project Revision Control System (see
-# http://prcs.sourceforge.net) generates a packaged project
-# file which is recognized by the following entry: 
-0      leshort         0xeb81  PRCS packaged project
-
-# Microsoft cabinets 
-# by David Necas (Yeti) <yeti@physics.muni.cz>
-#0     string  MSCF\0\0\0\0    Microsoft cabinet file data,
-#>25   byte    x               v%d
-#>24   byte    x               \b.%d
-# MPi: All CABs have version 1.3, so this is pointless.
-# Better magic in debian-additions.
-
-# GTKtalog catalogs 
-# by David Necas (Yeti) <yeti@physics.muni.cz>
-4      string  gtktalog\       GTKtalog catalog data,
->13    string  3               version 3
->>14   beshort 0x677a          (gzipped)
->>14   beshort !0x677a         (not gzipped)
->13    string  >3              version %s
-
-############################################################################
-# Parity archive reconstruction file, the 'par' file format now used on Usenet.
-0       string          PAR\0  PARity archive data
->48    leshort         =0      - Index file
->48    leshort         >0      - file number %d
-
-# Felix von Leitner <felix-file@fefe.de>
-0      string  d8:announce     BitTorrent file
-
-# Atari MSA archive - Teemu Hukkanen <tjhukkan@iki.fi>
-0       beshort 0x0e0f          Atari MSA archive data
->2      beshort x              \b, %d sectors per track
->4      beshort 0              \b, 1 sided
->4      beshort 1              \b, 2 sided
->6      beshort x              \b, starting track: %d
->8      beshort x              \b, ending track: %d
-
-# Alternate ZIP string (amc@arwen.cs.berkeley.edu)
-0      string  PK00PK\003\004  Zip archive data
-
-# ACE archive (from http://www.wotsit.org/download.asp?f=ace)
-# by Stefan `Sec` Zehl <sec@42.org>
-7      string          **ACE**         ACE compressed archive
->15    byte    >0              version %d
->16    byte    =0x00           \b, from MS-DOS
->16    byte    =0x01           \b, from OS/2
->16    byte    =0x02           \b, from Win/32
->16    byte    =0x03           \b, from Unix
->16    byte    =0x04           \b, from MacOS
->16    byte    =0x05           \b, from WinNT
->16    byte    =0x06           \b, from Primos
->16    byte    =0x07           \b, from AppleGS
->16    byte    =0x08           \b, from Atari
->16    byte    =0x09           \b, from Vax/VMS
->16    byte    =0x0A           \b, from Amiga
->16    byte    =0x0B           \b, from Next
->14    byte    x               \b, version %d to extract
->5     leshort &0x0080         \b, multiple volumes,
->>17   byte    x               \b (part %d),
->5     leshort &0x0002         \b, contains comment
->5     leshort &0x0200         \b, sfx
->5     leshort &0x0400         \b, small dictionary
->5     leshort &0x0800         \b, multi-volume
->5     leshort &0x1000         \b, contains AV-String
->>30   string\x16*UNREGISTERED\x20VERSION*     (unregistered)
->5     leshort &0x2000         \b, with recovery record
->5     leshort &0x4000         \b, locked
->5     leshort &0x8000         \b, solid
-# Date in MS-DOS format (whatever that is)
-#>18   lelong  x               Created on
-
-# sfArk : compression program for Soundfonts (sf2) by Dirk Jagdmann
-# <doj@cubic.org>
-0x1A   string  sfArk           sfArk compressed Soundfont
->0x15  string  2
->>0x1  string  >\0             Version %s
->>0x2A string  >\0             : %s
-
-#------------------------------------------------------------------------------
-# citrus locale declaration
-#
-
-0      string          RuneCT          Citrus locale declaration for LC_CTYPE
-
-
-#------------------------------------------------------------------------------
-# compress:  file(1) magic for pure-compression formats (no archives)
-#
-# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
-#
-# Formats for various forms of compressed data
-# Formats for "compress" proper have been moved into "compress.c",
-# because it tries to uncompress it to figure out what's inside.
-
-# standard unix compress
-0      string          \037\235        compress'd data
->2     byte&0x80       >0              block compressed
->2     byte&0x1f       x               %d bits
-
-# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
-#   Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002
-#      * Original filename is only at offset 10 if "extra field" absent
-#      * Produce shorter output - notably, only report compression methods
-#        other than 8 ("deflate", the only method defined in RFC 1952).
-0       string          \037\213        gzip compressed data
->2     byte            <8              \b, reserved method
->2     byte            >8              \b, unknown method
->3     byte            &0x01           \b, ASCII
->3     byte            &0x02           \b, continuation
->3     byte            &0x04           \b, extra field
->3     byte&0xC        =0x08
->>10   string          x               \b, was "%s"
->9     byte            =0x00           \b, from MS-DOS
->9     byte            =0x01           \b, from Amiga
->9     byte            =0x02           \b, from VMS
->9     byte            =0x03           \b, from Unix
->9     byte            =0x05           \b, from Atari
->9     byte            =0x06           \b, from OS/2
->9     byte            =0x07           \b, from MacOS
->9     byte            =0x0A           \b, from Tops/20
->9     byte            =0x0B           \b, from Win/32
->3     byte            &0x10           \b, comment
->3     byte            &0x20           \b, encrypted
-### >4 ledate          x               last modified: %s,
->8     byte            2               \b, max compression
->8     byte            4               \b, max speed
-
-# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis
-0      string          \037\036        packed data
->2     belong          >1              \b, %d characters originally
->2     belong          =1              \b, %d character originally
-#
-# This magic number is byte-order-independent.
-0      short           0x1f1f          old packed data
-
-# XXX - why *two* entries for "compacted data", one of which is
-# byte-order independent, and one of which is byte-order dependent?
-#
-0      short           0x1fff          compacted data
-# This string is valid for SunOS (BE) and a matching "short" is listed
-# in the Ultrix (LE) magic file.
-0      string          \377\037        compacted data
-0      short           0145405         huf output
-
-# bzip2
-0      string          BZh             bzip2 compressed data
->3     byte            >47             \b, block size = %c00k
-
-# squeeze and crunch
-# Michael Haardt <michael@cantor.informatik.rwth-aachen.de>
-0      beshort         0x76FF          squeezed data,
->4     string          x               original name %s
-0      beshort         0x76FE          crunched data,
->2     string          x               original name %s
-0      beshort         0x76FD          LZH compressed data,
->2     string          x               original name %s
-
-# Freeze
-0      string          \037\237        frozen file 2.1
-0      string          \037\236        frozen file 1.0 (or gzip 0.5)
-
-# SCO compress -H (LZH)
-0      string          \037\240        SCO compress -H (LZH) data
-
-# European GSM 06.10 is a provisional standard for full-rate speech
-# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
-# excitation/long term prediction) coding at 13 kbit/s.
-#
-# There's only a magic nibble (4 bits); that nibble repeats every 33
-# bytes.  This isn't suited for use, but maybe we can use it someday.
-#
-# This will cause very short GSM files to be declared as data and
-# mismatches to be declared as data too!
-#0     byte&0xF0       0xd0            data
-#>33   byte&0xF0       0xd0
-#>66   byte&0xF0       0xd0
-#>99   byte&0xF0       0xd0
-#>132  byte&0xF0       0xd0            GSM 06.10 compressed audio
-
-# bzip a block-sorting file compressor
-#      by Julian Seward <sewardj@cs.man.ac.uk> and others
-#
-0      string          BZ              bzip compressed data
->2     byte            x               \b, version: %c
->3     string          =1              \b, compression block size 100k
->3     string          =2              \b, compression block size 200k
->3     string          =3              \b, compression block size 300k
->3     string          =4              \b, compression block size 400k
->3     string          =5              \b, compression block size 500k
->3     string          =6              \b, compression block size 600k
->3     string          =7              \b, compression block size 700k
->3     string          =8              \b, compression block size 800k
->3     string          =9              \b, compression block size 900k
-
-# lzop from <markus.oberhumer@jk.uni-linz.ac.at>
-0      string          \x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a    lzop compressed data
->9     beshort         <0x0940
->>9    byte&0xf0       =0x00           - version 0.
->>9    beshort&0x0fff  x               \b%03x,
->>13   byte            1               LZO1X-1,
->>13   byte            2               LZO1X-1(15),
->>13   byte            3               LZO1X-999,
-## >>22        bedate          >0              last modified: %s,
->>14   byte            =0x00           os: MS-DOS
->>14   byte            =0x01           os: Amiga
->>14   byte            =0x02           os: VMS
->>14   byte            =0x03           os: Unix
->>14   byte            =0x05           os: Atari
->>14   byte            =0x06           os: OS/2
->>14   byte            =0x07           os: MacOS
->>14   byte            =0x0A           os: Tops/20
->>14   byte            =0x0B           os: WinNT
->>14   byte            =0x0E           os: Win32
->9     beshort         >0x0939
->>9    byte&0xf0       =0x00           - version 0.
->>9    byte&0xf0       =0x10           - version 1.
->>9    byte&0xf0       =0x20           - version 2.
->>9    beshort&0x0fff  x               \b%03x,
->>15   byte            1               LZO1X-1,
->>15   byte            2               LZO1X-1(15),
->>15   byte            3               LZO1X-999,
-## >>25        bedate          >0              last modified: %s,
->>17   byte            =0x00           os: MS-DOS
->>17   byte            =0x01           os: Amiga
->>17   byte            =0x02           os: VMS
->>17   byte            =0x03           os: Unix
->>17   byte            =0x05           os: Atari
->>17   byte            =0x06           os: OS/2
->>17   byte            =0x07           os: MacOS
->>17   byte            =0x0A           os: Tops/20
->>17   byte            =0x0B           os: WinNT
->>17   byte            =0x0E           os: Win32
-
-# 4.3BSD-Quasijarus Strong Compression
-# http://minnie.tuhs.org/Quasijarus/compress.html
-0      string          \037\241        Quasijarus strong compressed data
-
-# From: Cory Dikkers <cdikkers@swbell.net>
-0      string          XPKF            Amiga xpkf.library compressed data
-0      string          PP11            Power Packer 1.1 compressed data
-0      string          PP20            Power Packer 2.0 compressed data,
->4     belong          0x09090909      fast compression
->4     belong          0x090A0A0A      mediocre compression
->4     belong          0x090A0B0B      good compression
->4     belong          0x090A0C0C      very good compression
->4     belong          0x090A0C0D      best compression
-
-# 7z archiver, from Thomas Klausner (wiz@danbala.tuwien.ac.at)
-# http://www.7-zip.org or DOC/7zFormat.txt 
-#
-0      string          7z\274\257\047\034      7z archive data,
->6     byte            x                       version %d
->7     byte            x                       \b.%d
-
-# AFX compressed files (Wolfram Kleff)
-2      string          -afx-           AFX compressed file data
-
-#------------------------------------------------------------------------------
-# fsav:  file(1) magic for datafellows fsav virus definition files
-# Anthon van der Neut (anthon@mnt.org)
-0      beshort         0x1575          fsav (linux) macro virus
->8     leshort         >0              (%d-
->11    byte            >0              \b%02d-
->10    byte            >0              \b%02d)
-
-# comment this out for now because it regognizes every file where
-# the eighth character is \n
-#8     byte            0x0a
-#>12   byte            0x07
-#>11   leshort         >0              fsav (linux) virus (%d-
-#>10   byte            0               \b01-
-#>10   byte            1               \b02-
-#>10   byte            2               \b03-
-#>10   byte            3               \b04-
-#>10   byte            4               \b05-
-#>10   byte            5               \b06-
-#>10   byte            6               \b07-
-#>10   byte            7               \b08-
-#>10   byte            8               \b08-
-#>10   byte            9               \b10-
-#>10   byte            10              \b11-
-#>10   byte            11              \b12-
-#>9    byte            >0              \b%02d)
-
-#------------------------------------------------------------------------------
-# GEOS files (Vidar Madsen, vidar@gimp.org)
-# semi-commonly used in embedded and handheld systems.
-0      belong  0xc745c153      GEOS
->40    byte    1       executable
->40    byte    2       VMFile
->40    byte    3       binary
->40    byte    4       directory label
->40    byte    <1      unknown
->40    byte    >4      unknown
->4     string  >\0     \b, name "%s"
-#>44   short   x       \b, version %d
-#>46   short   x       \b.%d
-#>48   short   x       \b, rev %d
-#>50   short   x       \b.%d
-#>52   short   x       \b, proto %d
-#>54   short   x       \br%d
-#>168  string  >\0     \b, copyright "%s"
-#------------------------------------------------------------
-# Java ByteCode
-# From Larry Schwimmer (schwim@cs.stanford.edu)
-0      belong          0xcafebabe      compiled Java class data,
->6     beshort x       version %d.
->4     beshort x       \b%d
-#------------------------------------------------------------
-# Java serialization
-# From Martin Pool (m.pool@pharos.com.au)
-0      beshort         0xaced          Java serialization data
->2     beshort         >0x0004         \b, version %d
-
-#------------------------------------------------------------------------------
-# mlssa: file(1) magic for MLSSA datafiles
-#
-0              lelong          0xffffabcd      MLSSA datafile,
->4             leshort         x               algorithm %d,
->10            lelong          x               %d samples
-
-#------------------------------------------------------------------------------
-# mmdf:  file(1) magic for MMDF mail files
-#
-0      string  \001\001\001\001        MMDF mailbox
-
-#------------------------------------------------------------------------------
-# msdos:  file(1) magic for MS-DOS files
-#
-
-# .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)
-0      string/c        @echo\ off      MS-DOS batch file text
-
-# XXX - according to Microsoft's spec, at an offset of 0x3c in a
-# PE-format executable is the offset in the file of the PE header;
-# unfortunately, that's a little-endian offset, and there's no way
-# to specify an indirect offset with a specified byte order.
-# So, for now, we assume the standard MS-DOS stub, which puts the
-# PE header at 0x80 = 128.
-#
-# Required OS version and subsystem version were 4.0 on some NT 3.51
-# executables built with Visual C++ 4.0, so it's not clear that
-# they're interesting.  The user version was 0.0, but there's
-# probably some linker directive to set it.  The linker version was
-# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
-#
-128    string          PE\0\0  MS Windows PE
->150   leshort&0x0100  >0      32-bit
->132   leshort         0x0     unknown processor
->132   leshort         0x14c   Intel 80386
->132   leshort         0x166   MIPS R4000
->132   leshort         0x184   Alpha
->132   leshort         0x268   Motorola 68000
->132   leshort         0x1f0   PowerPC
->132   leshort         0x290   PA-RISC
->148   leshort         >27
->>220  leshort         0       unknown subsystem
->>220  leshort         1       native
->>220  leshort         2       GUI
->>220  leshort         3       console
->>220  leshort         7       POSIX
->150   leshort&0x2000  =0      executable
-#>>136 ledate          x       stamp %s,
->>150  leshort&0x0001  >0      not relocatable
-#>>150 leshort&0x0004  =0      with line numbers,
-#>>150 leshort&0x0008  =0      with local symbols,
-#>>150 leshort&0x0200  =0      with debug symbols,
->>150  leshort&0x1000  >0      system file
-#>>148 leshort         >0
-#>>>154        byte            x       linker %d
-#>>>155        byte            x       \b.%d,
-#>>148 leshort         >27
-#>>>192        leshort         x       requires OS %d
-#>>>194        leshort         x       \b.%d,
-#>>>196        leshort         x       user version %d
-#>>>198        leshort         x       \b.%d,
-#>>>200        leshort         x       subsystem version %d
-#>>>202        leshort         x       \b.%d,
->150   leshort&0x2000  >0      DLL
-#>>136 ledate          x       stamp %s,
->>150  leshort&0x0001  >0      not relocatable
-#>>150 leshort&0x0004  =0      with line numbers,
-#>>150 leshort&0x0008  =0      with local symbols,
-#>>150 leshort&0x0200  =0      with debug symbols,
->>150  leshort&0x1000  >0      system file
-#>>148 leshort         >0
-#>>>154        byte            x       linker %d
-#>>>155        byte            x       \b.%d,
-#>>148 leshort         >27
-#>>>192        leshort         x       requires OS %d
-#>>>194        leshort         x       \b.%d,
-#>>>196        leshort         x       user version %d
-#>>>198        leshort         x       \b.%d,
-#>>>200        leshort         x       subsystem version %d
-#>>>202        leshort         x       \b.%d,
-0      leshort         0x14c   MS Windows COFF Intel 80386 object file
-#>4    ledate          x       stamp %s
-0      leshort         0x166   MS Windows COFF MIPS R4000 object file
-#>4    ledate          x       stamp %s
-0      leshort         0x184   MS Windows COFF Alpha object file
-#>4    ledate          x       stamp %s
-0      leshort         0x268   MS Windows COFF Motorola 68000 object file
-#>4    ledate          x       stamp %s
-0      leshort         0x1f0   MS Windows COFF PowerPC object file
-#>4    ledate          x       stamp %s
-0      leshort         0x290   MS Windows COFF PA-RISC object file
-#>4    ledate          x       stamp %s
-
-# .EXE formats (Greg Roelofs, newt@uchicago.edu)
-#
-0      string  MZ              MS-DOS executable (EXE)
->24    string  @               \b, OS/2 or MS Windows
->>0xe7 string  LH/2\ Self-Extract      \b, %s
->>0xe9 string  PKSFX2          \b, %s
->>122  string  Windows\ self-extracting\ ZIP   \b, %s
->0x1c  string  RJSX\xff\xff    \b, ARJ SFX
->0x1c  string  diet\xf9\x9c    \b, diet compressed
->0x1c  string  LZ09            \b, LZEXE v0.90 compressed
->0x1c  string  LZ91            \b, LZEXE v0.91 compressed
->0x1e  string  Copyright\ 1989-1990\ PKWARE\ Inc.      \b, PKSFX
-# JM: 0x1e "PKLITE Copr. 1990-92 PKWARE Inc. All Rights Reserved\7\0\0\0"
->0x1e  string  PKLITE\ Copr.   \b, %.6s compressed
->0x24  string  LHa's\ SFX      \b, %.15s
->0x24  string  LHA's\ SFX      \b, %.15s
->1638  string  -lh5-           \b, LHa SFX archive v2.13S
->7195  string  Rar!            \b, RAR self-extracting archive
-#
-# [GRR 950118:  file 3.15 has a buffer-size limitation; offsets bigger than
-#   8161 bytes are ignored.  To make the following entries work, increase
-#   HOWMANY in file.h to 32K at least, and maybe to 70K or more for OS/2,
-#   NT/Win32 and VMS.]
-# [GRR:  some company sells a self-extractor/displayer for image data(!)]
-#
->11696 string  PK\003\004      \b, PKZIP SFX archive v1.1
->13297 string  PK\003\004      \b, PKZIP SFX archive v1.93a
->15588 string  PK\003\004      \b, PKZIP2 SFX archive v1.09
->15770 string  PK\003\004      \b, PKZIP SFX archive v2.04g
->28374 string  PK\003\004      \b, PKZIP2 SFX archive v1.02
-#
-# Info-ZIP self-extractors
-#    these are the DOS versions:
->25115 string  PK\003\004      \b, Info-ZIP SFX archive v5.12
->26331 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
-#    these are the OS/2 versions (OS/2 is flagged above):
->47031 string  PK\003\004      \b, Info-ZIP SFX archive v5.12
->49845 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
-#    this is the NT/Win32 version:
->69120 string  PK\003\004      \b, Info-ZIP NT SFX archive v5.12 w/decryption
-#
-# TELVOX Teleinformatica CODEC self-extractor for OS/2:
->49801 string  \x79\xff\x80\xff\x76\xff        \b, CODEC archive v3.21
->>49824        leshort         =1                      \b, 1 file
->>49824        leshort         >1                      \b, %u files
-
-# .COM formats (Daniel Quinlan, quinlan@yggdrasil.com)
-# Uncommenting only the first two lines will cover about 2/3 of COM files,
-# but it isn't feasible to match all COM files since there must be at least
-# two dozen different one-byte "magics".
-#0     byte            0xe9            MS-DOS executable (COM)
-#>6    string  SFX\ of\ LHarc  (%s)
-#0     byte            0x8c            MS-DOS executable (COM)
-# 0xeb conflicts with "sequent" magic
-#0     byte            0xeb            MS-DOS executable (COM)
-#0     byte            0xb8            MS-DOS executable (COM)
-
-# miscellaneous formats
-0      string          LZ              MS-DOS executable (built-in)
-#0     byte            0xf0            MS-DOS program library data
-#
-
-#
-# Windows Registry files.
-#
-0      string          regf            Windows NT registry file
-0      string          CREG            Windows 95 registry file
-
-
-# AAF files:
-# <stuartc@rd.bbc.co.uk> Stuart Cunningham
-0      string  \320\317\021\340\241\261\032\341AAFB\015\000OM\006\016\053\064\001\001\001\377                  AAF legacy file using MS Structured Storage
->30    byte    9               (512B sectors)
->30    byte    12              (4kB sectors)
-0      string  \320\317\021\340\241\261\032\341\001\002\001\015\000\002\000\000\006\016\053\064\003\002\001\001                        AAF file using MS Structured Storage
->30    byte    9               (512B sectors)
->30    byte    12              (4kB sectors)
-
-# Popular applications
-2080   string  Microsoft\ Word\ 6.0\ Document  %s
-2080   string  Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
-# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Word)
-2112   string  MSWordDoc                       Microsoft Word document data
-#
-0      belong  0x31be0000                      Microsoft Word Document
-#
-0       string  PO^Q`                          Microsoft Word 6.0 Document
-#
-0      string  \376\067\0\043                  Microsoft Office Document
-0      string  \320\317\021\340\241\261\032\341        Microsoft Office Document
-0      string  \333\245-\0\0\0                 Microsoft Office Document
-#
-2080   string  Microsoft\ Excel\ 5.0\ Worksheet        %s
-2080   string  Foglio\ di\ lavoro\ Microsoft\ Exce     %s
-#
-# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
-2114   string  Biff5           Microsoft Excel 5.0 Worksheet
-# Italian MS-Excel
-2121   string  Biff5           Microsoft Excel 5.0 Worksheet
-0      string  \x09\x04\x06\x00\x00\x00\x10\x00        Microsoft Excel Worksheet
-#
-0      belong  0x00001a00      Lotus 1-2-3
->4     belong  0x00100400      wk3 document data
->4     belong  0x02100400      wk4 document data
->4     belong  0x07800100      fm3 or fmb document data
->4     belong  0x07800000      fm3 or fmb document data
-#
-0      belong  0x00000200      Lotus 1-2-3
->4     belong  0x06040600      wk1 document data
->4     belong  0x06800200      fmt document data
-
-# Help files
-0      string  ?_\3\0          MS Windows Help Data
-
-#  DeIsL1.isu what this is I don't know
-0      string  \161\250\000\000\001\002        DeIsL1.isu whatever that is
-
-# Winamp .avs
-#0     string  Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player
-0      string  Nullsoft\ AVS\ Preset\  Winamp plug in
-
-# Hyper terminal:
-0      string  HyperTerminal\  hyperterm
->15    string  1.0\ --\ HyperTerminal\ data\ file      MS-windows Hyperterminal
-
-# Windows Metafont .WMF
-0      string  \327\315\306\232\000\000\000\000\000\000        ms-windows metafont .wmf
-
-#tz3 files whatever that is (MS Works files)
-0      string  \003\001\001\004\070\001\000\000        tz3 ms-works file
-0      string  \003\002\001\004\070\001\000\000        tz3 ms-works file
-0      string  \003\003\001\004\070\001\000\000        tz3 ms-works file
-
-# PGP sig files .sig
-#0 string \211\000\077\003\005\000\063\237\127 065 to  \027\266\151\064\005\045\101\233\021\002 PGP sig
-0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
-0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
-0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
-0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
-0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
-0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
-
-# windows zips files .dmf
-0      string  MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 Ms-windows special zipped file
-
-
-# Windows help file FTG FTS
-0      string  \164\146\115\122\012\000\000\000\001\000\000\000        ms-windows help cache
-
-# grp old windows 3.1 group files
-0 string  \120\115\103\103     Ms-windows 3.1 group files
-
-
-# lnk files windows symlinks
-0      string  \114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106        ms-Windows shortcut
-
-#ico files
-0      string  \102\101\050\000\000\000\056\000\000\000\000\000\000\000        Icon for ms-windows
-
-# Windows icons (Ian Springer <ips@fpk.hp.com>)
-0      string  \000\000\001\000        ms-windows icon resource
->4     byte    1                       - 1 icon
->4     byte    >1                      - %d icons
->>6    byte    >0                      \b, %dx
->>>7   byte    >0                      \b%d
->>8    byte    0                       \b, 256-colors
->>8    byte    >0                      \b, %d-colors
-
-
-# .chr files
-0      string  PK\010\010BGI   Borland font 
->4     string  >\0     %s
-# then there is a copyright notice
-
-
-# .bgi files
-0      string  pk\010\010BGI   Borland device 
->4     string  >\0     %s
-# then there is a copyright notice
-
-
-# recycled/info the windows trash bin index
-9      string  \000\000\000\030\001\000\000\000 ms-windows recycled bin info
-
-
-##### put in Either Magic/font or Magic/news
-# Acroread or something  files wrongly identified as G3  .pfm
-# these have the form \000 \001 any? \002 \000 \000
-# or \000 \001 any? \022 \000 \000
-#0     string  \000\001 pfm?
-#>3    string  \022\000\000Copyright\  yes
-#>3    string  \002\000\000Copyright\  yes
-#>3    string  >\0     oops, not a font file. Cancel that.
-#it clashes with ttf files so put it lower down.
-
-# From Doug Lee via a FreeBSD pr
-9      string          GERBILDOC       First Choice document
-9      string          GERBILDB        First Choice database
-9      string          GERBILCLIP      First Choice database
-0      string          GERBIL          First Choice device file
-9      string          RABBITGRAPH     RabbitGraph file
-0      string          DCU1            Borland Delphi .DCU file
-0      string          !<spell>        MKS Spell hash list (old format)
-0      string          !<spell2>       MKS Spell hash list
-# Too simple - MPi
-#0     string          AH              Halo(TM) bitmapped font file
-0      lelong          0x08086b70      TurboC BGI file
-0      lelong          0x08084b50      TurboC Font file
-
-# WARNING: below line conflicts with Infocom game data Z-machine 3
-0      byte            0x03            DBase 3 data file
->0x04  lelong          0               (no records)
->0x04  lelong          >0              (%ld records)
-0      byte            0x83            DBase 3 data file with memo(s)
->0x04  lelong          0               (no records)
->0x04  lelong          >0              (%ld records)
-0      leshort         0x0006          DBase 3 index file
-0      string          PMCC            Windows 3.x .GRP file
-1      string          RDC-meg         MegaDots 
->8     byte            >0x2F           version %c
->9     byte            >0x2F           \b.%c file
-0      lelong          0x4C
->4     lelong          0x00021401      Windows shortcut file
-
-# DOS EPS Binary File Header
-# From: Ed Sznyter <ews@Black.Market.NET>
-0      belong          0xC5D0D3C6      DOS EPS Binary File
->4     long            >0              Postscript starts at byte %d
->>8    long            >0              length %d
->>>12  long            >0              Metafile starts at byte %d
->>>>16 long            >0              length %d
->>>20  long            >0              TIFF starts at byte %d
->>>>24 long            >0              length %d
-
-# TNEF magic From "Joomy" <joomy@se-ed.net> 
-0      leshort         0x223e9f78      TNEF
-
-# HtmlHelp files (.chm)
-0      string  ITSF\003\000\000\000\x60\000\000\000\001\000\000\000    MS Windows HtmlHelp Data
-
-# GFA-BASIC (Wolfram Kleff)
-2      string          GFA-BASIC3      GFA-BASIC 3 data
-
-# DJGPP compiled files
-# v >2, uses DPMI & small(2k) stub (Robert vd Boon, rjvdboon@europe.com)
-0x200  string          go32stub        DOS-executable compiled w/DJGPP
->0x20c string          >0              (stub v%.4s)
->>0x8b2        string          djp             [compressed w/%s
->>>&1  string          >\0             %.4s]
->>0x8ad        string          UPX             [compressed w/%s
->>>&1  string          >\0             %.4s]
->>0x1c string          pmodedj         stubbed with %s
-
-# QDOS
-4      belong          0x4AFB          QDOS executable
->9     pstring         x               '%s'
-0      beshort         0xFB01          QDOS object
->2     pstring         x               '%s'
-
-#------------------------------------------------------------------------------
-# From Stuart Caie <kyzer@4u.net> (developer of cabextract)
-# Microsoft Cabinet files
-0      string          MSCF\0\0\0\0    Microsoft Cabinet file
->8     lelong          x               \b, %u bytes
->28    leshort         1               \b, 1 file
->28    leshort         >1              \b, %u files
-
-# InstallShield Cabinet files
-0      string          ISc(            InstallShield Cabinet file
->5     byte&0xf0       =0x60           version 6,
->5     byte&0xf0       !0x60           version 4/5,
->(12.l+40)     lelong  x               %u files
-
-# Windows CE package files
-0      string          MSCE\0\0\0\0    Microsoft WinCE install header
->20    lelong          0               \b, architecture-independent
->20    lelong          103             \b, Hitachi SH3
->20    lelong          104             \b, Hitachi SH4
->20    lelong          0xA11           \b, StrongARM
->20    lelong          4000            \b, MIPS R4000
->20    lelong          10003           \b, Hitachi SH3
->20    lelong          10004           \b, Hitachi SH3E
->20    lelong          10005           \b, Hitachi SH4
->20    lelong          70001           \b, ARM 7TDMI
->52    leshort         1               \b, 1 file
->52    leshort         >1              \b, %u files
->56    leshort         1               \b, 1 registry entry
->56    leshort         >1              \b, %u registry entries
-
-# Outlook Personal Folders
-0      lelong  0x4E444221      Microsoft Outlook binary email folder
-
-# From: Dirk Jagdmann <doj@cubic.org>
-0      lelong  0x00035f3f      Windows 3.x help file
-
-# Christophe Monniez
-0      string  Client\ UrlCache\ MMF   Microsoft Internet Explorer Cache File
->20    string  >\0                     Version %s
-0      string  \xCF\xAD\x12\xFE        Microsoft Outlook Express DBX File
->4     byte    =0xC5                   Message database
->4     byte    =0xC6                   Folder database
->4     byte    =0xC7                   Accounts informations
->4     byte    =0x30                   Offline database
-
-
-# Windows Enhanced Metafile (EMF)
-# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp 
-# for further information. Note that "0 lelong 1" should be true i.e.
-# the first double word in the file should be 1. With the extended
-# syntax available by some file commands you could write:
-# 0 lelong 1
-# &40 ulelong 0x464D4520 Windows Enhanced Metafile (EMF) image data
-40     ulelong 0x464D4520      Windows Enhanced Metafile (EMF) image data
->44    ulelong x               version 0x%x.
-# If the description has a length greater than zero, it exists and is 
-# found at offset (*64).
->64    ulelong >0              Description available at offset 0x%x
->>60   ulelong >0              (length 0x%x)
-# Note it would be better to print out the description, which is found 
-# as below. Unfortunately the following only prints out the first couple
-# of characters instead of all the "description length"
-# number of characters -- indicated by the ulelong at offset 60.
->>(64.l)  lestring16 >0 Description: %15.15s
-#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
-0      string  \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable text
->15    byte    0       Optimized for Intel
->15    byte    1       Optimized for Non-Intel
-1      string  WPC     (Corel/WP)
->8     short   257     WordPerfect macro
->8     short   258     WordPerfect help file
->8     short   259     WordPerfect keyboard file
->8     short   266     WordPerfect document
->8     short   267     WordPerfect dictionary
->8     short   268     WordPerfect thesaurus
->8     short   269     WordPerfect block
->8     short   270     WordPerfect rectangular block
->8     short   271     WordPerfect column block
->8     short   272     WordPerfect printer data
->8     short   275     WordPerfect printer data
->8     short   276     WordPerfect driver resource data
->8     short   279     WordPerfect hyphenation code
->8     short   280     WordPerfect hyphenation data
->8     short   281     WordPerfect macro resource data
->8     short   283     WordPerfect hyphenation lex
->8     short   285     WordPerfect wordlist
->8     short   286     WordPerfect equation resource data
->8     short   289     WordPerfect spell rules
->8     short   290     WordPerfect dictionary rules
->8     short   295     WordPerfect spell rules (Microlytics)
->8     short   299     WordPerfect settings file
->8     short   301     WordPerfect 4.2 document
->8     short   325     WordPerfect dialog file
->8     short   332     WordPerfect button bar
->8     short   513     Shell macro
->8     short   522     Shell definition
->8     short   769     Notebook macro
->8     short   770     Notebook help file
->8     short   771     Notebook keyboard file
->8     short   778     Notebook definition
->8     short   1026    Calculator help file
->8     short   1538    Calendar help file
->8     short   1546    Calendar data file
->8     short   1793    Editor macro
->8     short   1794    Editor help file
->8     short   1795    Editor keyboard file
->8     short   1817    Editor macro resource file
->8     short   2049    Macro editor macro
->8     short   2050    Macro editor help file
->8     short   2051    Macro editor keyboard file
->8     short   2305    PlanPerfect macro
->8     short   2306    PlanPerfect help file
->8     short   2307    PlanPerfect keyboard file
->8     short   2314    PlanPerfect worksheet
->8     short   2319    PlanPerfect printer definition
->8     short   2322    PlanPerfect graphic definition
->8     short   2323    PlanPerfect data
->8     short   2324    PlanPerfect temporary printer
->8     short   2329    PlanPerfect macro resource data
->8     byte    11      Mail
->8     short   2818    help file
->8     short   2821    distribution list
->8     short   2826    out box
->8     short   2827    in box
->8     short   2836    users archived mailbox
->8     short   2837    archived message database
->8     short   2838    archived attachments
->8     short   3083    Printer temporary file
->8     short   3330    Scheduler help file
->8     short   3338    Scheduler in file
->8     short   3339    Scheduler out file
->8     short   3594    GroupWise settings file
->8     short   3601    GroupWise directory services
->8     short   3627    GroupWise settings file
->8     short   4362    Terminal resource data
->8     short   4363    Terminal resource data
->8     short   4395    Terminal resource data
->8     short   4619    GUI loadable text
->8     short   4620    graphics resource data
->8     short   4621    printer settings file
->8     short   4622    port definition file
->8     short   4623    print queue parameters
->8     short   4624    compressed file
->8     short   5130    Network service msg file
->8     short   5131    Network service msg file
->8     short   5132    Async gateway login msg
->8     short   5134    GroupWise message file
->8     short   7956    GroupWise admin domain database
->8     short   7957    GroupWise admin host database
->8     short   7959    GroupWise admin remote host database
->8     short   7960    GroupWise admin ADS deferment data file
->8     short   8458    IntelliTAG (SGML) compiled DTD
->8     long    18219264        WordPerfect graphic image (1.0)
->8     long    18219520        WordPerfect graphic image (2.0)
-#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
-
-#------------------------------------------------------------------------------
-# rtf: file(1) magic for Rich Text Format (RTF)
-#
-# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk
-#
-0      string          {\\rtf          Rich Text Format data,
->5     byte            x               version %c,
->6     string          \\ansi          ANSI
->6     string          \\mac           Apple Macintosh
->6     string          \\pc            IBM PC, code page 437
->6     string          \\pca           IBM PS/2, code page 850
-
-#------------------------------------------------------------------------------
-# animation:  file(1) magic for animation/movie formats
-#
-# animation formats
-# MPEG, FLI, DL originally from vax@ccwf.cc.utexas.edu (VaX#n8)
-# FLC, SGI, Apple originally from Daniel Quinlan (quinlan@yggdrasil.com)
-
-# MPEG sequences
-# Scans for all common MPEG header start codes
-0        belong&0xFFFFFF00  0x00000100     MPEG sequence
->3       byte               0xBA
->>4      byte               &0x40          \b, v2, program multiplex
->>4      byte               ^0x40          \b, v1, system multiplex
->3       byte               0xBB           \b, v1/2, multiplex (missing pack header)
->3       byte               0xB0           \b, v4
->>5      belong             0x000001B5
->>>9     byte               &0x80
->>>>10   byte&0xF0          16             \b, video
->>>>10   byte&0xF0          32             \b, still texture
->>>>10   byte&0xF0          48             \b, mesh
->>>>10   byte&0xF0          64             \b, face
->>>9     byte               ^0x80
->>>>9    byte&0xF8          8              \b, video
->>>>9    byte&0xF8          16             \b, still texture
->>>>9    byte&0xF8          24             \b, mesh
->>>>9    byte&0xF8          32             \b, face
->>4      byte               1              \b, simple @ L1
->>4      byte               2              \b, simple @ L2
->>4      byte               3              \b, simple @ L3
->>4      byte               4              \b, simple @ L0
->>4      byte               17             \b, simple scalable @ L1
->>4      byte               18             \b, simple scalable @ L2
->>4      byte               33             \b, core @ L1
->>4      byte               34             \b, core @ L2
->>4      byte               50             \b, main @ L2
->>4      byte               51             \b, main @ L3
->>4      byte               53             \b, main @ L4
->>4      byte               66             \b, n-bit @ L2
->>4      byte               81             \b, scalable texture @ L1
->>4      byte               97             \b, simple face animation @ L1
->>4      byte               98             \b, simple face animation @ L2
->>4      byte               99             \b, simple face basic animation @ L1
->>4      byte               100            \b, simple face basic animation @ L2
->>4      byte               113            \b, basic animation text @ L1
->>4      byte               114            \b, basic animation text @ L2
->>4      byte               129            \b, hybrid @ L1
->>4      byte               130            \b, hybrid @ L2
->>4      byte               145            \b, advanced RT simple @ L!
->>4      byte               146            \b, advanced RT simple @ L2
->>4      byte               147            \b, advanced RT simple @ L3
->>4      byte               148            \b, advanced RT simple @ L4
->>4      byte               161            \b, core scalable @ L1
->>4      byte               162            \b, core scalable @ L2
->>4      byte               163            \b, core scalable @ L3
->>4      byte               177            \b, advanced coding efficiency @ L1
->>4      byte               178            \b, advanced coding efficiency @ L2
->>4      byte               179            \b, advanced coding efficiency @ L3
->>4      byte               180            \b, advanced coding efficiency @ L4
->>4      byte               193            \b, advanced core @ L1
->>4      byte               194            \b, advanced core @ L2
->>4      byte               209            \b, advanced scalable texture @ L1
->>4      byte               210            \b, advanced scalable texture @ L2
->>4      byte               211            \b, advanced scalable texture @ L3
->>4      byte               225            \b, simple studio @ L1
->>4      byte               226            \b, simple studio @ L2
->>4      byte               227            \b, simple studio @ L3
->>4      byte               228            \b, simple studio @ L4
->>4      byte               229            \b, core studio @ L1
->>4      byte               230            \b, core studio @ L2
->>4      byte               231            \b, core studio @ L3
->>4      byte               232            \b, core studio @ L4
->>4      byte               240            \b, advanced simple @ L0
->>4      byte               241            \b, advanced simple @ L1
->>4      byte               242            \b, advanced simple @ L2
->>4      byte               243            \b, advanced simple @ L3
->>4      byte               244            \b, advanced simple @ L4
->>4      byte               245            \b, advanced simple @ L5
->>4      byte               247            \b, advanced simple @ L3b
->>4      byte               248            \b, FGS @ L0
->>4      byte               249            \b, FGS @ L1
->>4      byte               250            \b, FGS @ L2
->>4      byte               251            \b, FGS @ L3
->>4      byte               252            \b, FGS @ L4
->>4      byte               253            \b, FGS @ L5
->3       byte               0xB5           \b, v4
->>4      byte               &0x80
->>>5     byte&0xF0          16             \b, video (missing profile header)
->>>5     byte&0xF0          32             \b, still texture (missing profile header)
->>>5     byte&0xF0          48             \b, mesh (missing profile header)
->>>5     byte&0xF0          64             \b, face (missing profile header)
->>4      byte               ^0x80
->>>4     byte&0xF8          8              \b, video (missing profile header)
->>>4     byte&0xF8          16             \b, still texture (missing profile header)
->>>4     byte&0xF8          24             \b, mesh (missing profile header)
->>>4     byte&0xF8          32             \b, face (missing profile header)
->3       byte               0xB3
->>12     belong             0x000001B8     \b, v1, progressive Y'CbCr 4:2:0 video
->>12     belong             0x000001B2     \b, v1, progressive Y'CbCr 4:2:0 video
->>12     belong             0x000001B5     \b, v2,
->>>16    byte&0x0F          1              \b HP
->>>16    byte&0x0F          2              \b Spt
->>>16    byte&0x0F          3              \b SNR
->>>16    byte&0x0F          4              \b MP
->>>16    byte&0x0F          5              \b SP
->>>17    byte&0xF0          64             \b@HL
->>>17    byte&0xF0          96             \b@H-14
->>>17    byte&0xF0          128            \b@ML
->>>17    byte&0xF0          160            \b@LL
->>>17    byte               &0x08          \b progressive
->>>17    byte               ^0x08          \b interlaced
->>>17    byte&0x06          2              \b Y'CbCr 4:2:0 video
->>>17    byte&0x06          4              \b Y'CbCr 4:2:2 video
->>>17    byte&0x06          6              \b Y'CbCr 4:4:4 video
->>11     byte               &0x02
->>>75    byte               &0x01
->>>>140  belong             0x000001B8     \b, v1, progressive Y'CbCr 4:2:0 video
->>>>140  belong             0x000001B2     \b, v1, progressive Y'CbCr 4:2:0 video
->>>>140  belong             0x000001B5     \b, v2,
->>>>>144 byte&0x0F          1              \b HP
->>>>>144 byte&0x0F          2              \b Spt
->>>>>144 byte&0x0F          3              \b SNR
->>>>>144 byte&0x0F          4              \b MP
->>>>>144 byte&0x0F          5              \b SP
->>>>>145 byte&0xF0          64             \b@HL
->>>>>145 byte&0xF0          96             \b@H-14
->>>>>145 byte&0xF0          128            \b@ML
->>>>>145 byte&0xF0          160            \b@LL
->>>>>145 byte               &0x08          \b progressive
->>>>>145 byte               ^0x08          \b interlaced
->>>>>145 byte&0x06          2              \b Y'CbCr 4:2:0 video
->>>>>145 byte&0x06          4              \b Y'CbCr 4:2:2 video
->>>>>145 byte&0x06          6              \b Y'CbCr 4:4:4 video
->>>76    belong             0x000001B8     \b, v1, progressive Y'CbCr 4:2:0 video
->>>76    belong             0x000001B2     \b, v1, progressive Y'CbCr 4:2:0 video
->>>76    belong             0x000001B5     \b, v2,
->>>80    byte&0x0F          1              \b HP
->>>80    byte&0x0F          2              \b Spt
->>>80    byte&0x0F          3              \b SNR
->>>80    byte&0x0F          4              \b MP
->>>80    byte&0x0F          5              \b SP
->>>81    byte&0xF0          64             \b@HL
->>>81    byte&0xF0          96             \b@H-14
->>>81    byte&0xF0          128            \b@ML
->>>81    byte&0xF0          160            \b@LL
->>>81    byte               &0x08          \b progressive
->>>81    byte               ^0x08          \b interlaced
->>>81    byte&0x06          2              \b Y'CbCr 4:2:0 video
->>>81    byte&0x06          4              \b Y'CbCr 4:2:2 video
->>>81    byte&0x06          6              \b Y'CbCr 4:4:4 video
->>4      belong&0xFFFFFF00  0x78043800     \b, HD-TV 1920P
->>>7     byte&0xF0          0x10           \b, 16:9
->>4      belong&0xFFFFFF00  0x50002D00     \b, SD-TV 1280I
->>>7     byte&0xF0          0x10           \b, 16:9
->>4      belong&0xFFFFFF00  0x30024000     \b, PAL Capture
->>>7     byte&0xF0          0x10           \b, 4:3
->>4      beshort&0xFFF0     0x2C00         \b, 4CIF
->>>5     beshort&0x0FFF     0x01E0         \b NTSC
->>>5     beshort&0x0FFF     0x0240         \b PAL
->>>7     byte&0xF0          0x20           \b, 4:3
->>>7     byte&0xF0          0x30           \b, 16:9
->>>7     byte&0xF0          0x40           \b, 11:5
->>>7     byte&0xF0          0x80           \b, PAL 4:3
->>>7     byte&0xF0          0xC0           \b, NTSC 4:3
->>4      belong&0xFFFFFF00  0x2801E000     \b, LD-TV 640P
->>>7     byte&0xF0          0x10           \b, 4:3
->>4      belong&0xFFFFFF00  0x1400F000     \b, 320x240
->>>7     byte&0xF0          0x10           \b, 4:3
->>4      belong&0xFFFFFF00  0x0F00A000     \b, 240x160
->>>7     byte&0xF0          0x10           \b, 4:3
->>4      belong&0xFFFFFF00  0x0A007800     \b, 160x120
->>>7     byte&0xF0          0x10           \b, 4:3
->>4      beshort&0xFFF0     0x1600         \b, CIF
->>>5     beshort&0x0FFF     0x00F0         \b NTSC
->>>5     beshort&0x0FFF     0x0120         \b PAL
->>>7     byte&0xF0          0x20           \b, 4:3
->>>7     byte&0xF0          0x30           \b, 16:9
->>>7     byte&0xF0          0x40           \b, 11:5
->>>7     byte&0xF0          0x80           \b, PAL 4:3
->>>7     byte&0xF0          0xC0           \b, NTSC 4:3
->>>5     beshort&0x0FFF     0x0240         \b PAL 625
->>>>7    byte&0xF0          0x20           \b, 4:3
->>>>7    byte&0xF0          0x30           \b, 16:9
->>>>7    byte&0xF0          0x40           \b, 11:5
->>4      beshort&0xFFF0     0x2D00         \b, CCIR/ITU
->>>5     beshort&0x0FFF     0x01E0         \b NTSC 525
->>>5     beshort&0x0FFF     0x0240         \b PAL 625
->>>7     byte&0xF0          0x20           \b, 4:3
->>>7     byte&0xF0          0x30           \b, 16:9
->>>7     byte&0xF0          0x40           \b, 11:5
->>4      beshort&0xFFF0     0x1E00         \b, SVCD
->>>5     beshort&0x0FFF     0x01E0         \b NTSC 525
->>>5     beshort&0x0FFF     0x0240         \b PAL 625
->>>7     byte&0xF0          0x20           \b, 4:3
->>>7     byte&0xF0          0x30           \b, 16:9
->>>7     byte&0xF0          0x40           \b, 11:5
->>7      byte&0x0F          1              \b, 23.976 fps
->>7      byte&0x0F          2              \b, 24 fps
->>7      byte&0x0F          3              \b, 25 fps
->>7      byte&0x0F          4              \b, 29.97 fps
->>7      byte&0x0F          5              \b, 30 fps
->>7      byte&0x0F          6              \b, 50 fps
->>7      byte&0x0F          7              \b, 59.94 fps
->>7      byte&0x0F          8              \b, 60 fps
->>11     byte               &0x04          \b, Constrained
-
-# MPEG ADTS Audio (*.mpx/mxa/aac)
-# from dreesen@math.fu-berlin.de
-# modified to fully support MPEG ADTS
-
-# MP3, M1A
-0       beshort&0xFFFE  0xFFFA         MPEG ADTS, layer III, v1
-# rates
->2      byte&0xF0       0x10           \b,  32 kBits
->2      byte&0xF0       0x20           \b,  40 kBits
->2      byte&0xF0       0x30           \b,  48 kBits
->2      byte&0xF0       0x40           \b,  56 kBits
->2      byte&0xF0       0x50           \b,  64 kBits
->2      byte&0xF0       0x60           \b,  80 kBits
->2      byte&0xF0       0x70           \b,  96 kBits
->2      byte&0xF0       0x80           \b, 112 kBits
->2      byte&0xF0       0x90           \b, 128 kBits
->2      byte&0xF0       0xA0           \b, 160 kBits
->2      byte&0xF0       0xB0           \b, 192 kBits
->2      byte&0xF0       0xC0           \b, 224 kBits
->2      byte&0xF0       0xD0           \b, 256 kBits
->2      byte&0xF0       0xE0           \b, 320 kBits
-# timing
->2      byte&0x0C       0x00           \b, 44.1 kHz
->2      byte&0x0C       0x04           \b, 48 kHz
->2      byte&0x0C       0x08           \b, 32 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# MP2, M1A
-0       beshort&0xFFFE  0xFFFC         MPEG ADTS, layer II, v1
-# rates
->2      byte&0xF0       0x10           \b,  32 kBits
->2      byte&0xF0       0x20           \b,  48 kBits
->2      byte&0xF0       0x30           \b,  56 kBits
->2      byte&0xF0       0x40           \b,  64 kBits
->2      byte&0xF0       0x50           \b,  80 kBits
->2      byte&0xF0       0x60           \b,  96 kBits
->2      byte&0xF0       0x70           \b, 112 kBits
->2      byte&0xF0       0x80           \b, 128 kBits
->2      byte&0xF0       0x90           \b, 160 kBits
->2      byte&0xF0       0xA0           \b, 192 kBits
->2      byte&0xF0       0xB0           \b, 224 kBits
->2      byte&0xF0       0xC0           \b, 256 kBits
->2      byte&0xF0       0xD0           \b, 320 kBits
->2      byte&0xF0       0xE0           \b, 384 kBits
-# timing
->2      byte&0x0C       0x00           \b, 44.1 kHz
->2      byte&0x0C       0x04           \b, 48 kHz
->2      byte&0x0C       0x08           \b, 32 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# MPA, M1A
-0       beshort&0xFFFE  0xFFFE         MPEG ADTS, layer I, v1
-# rate
->2      byte&0xF0       0x10           \b,  32 kBits
->2      byte&0xF0       0x20           \b,  64 kBits
->2      byte&0xF0       0x30           \b,  96 kBits
->2      byte&0xF0       0x40           \b, 128 kBits
->2      byte&0xF0       0x50           \b, 160 kBits
->2      byte&0xF0       0x60           \b, 192 kBits
->2      byte&0xF0       0x70           \b, 224 kBits
->2      byte&0xF0       0x80           \b, 256 kBits
->2      byte&0xF0       0x90           \b, 288 kBits
->2      byte&0xF0       0xA0           \b, 320 kBits
->2      byte&0xF0       0xB0           \b, 352 kBits
->2      byte&0xF0       0xC0           \b, 384 kBits
->2      byte&0xF0       0xD0           \b, 416 kBits
->2      byte&0xF0       0xE0           \b, 448 kBits
-# timing
->2      byte&0x0C       0x00           \b, 44.1 kHz
->2      byte&0x0C       0x04           \b, 48 kHz
->2      byte&0x0C       0x08           \b, 32 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# MP3, M2A
-0       beshort&0xFFFE  0xFFF2         MPEG ADTS, layer III, v2
-# rate
->2      byte&0xF0       0x10           \b,   8 kBits
->2      byte&0xF0       0x20           \b,  16 kBits
->2      byte&0xF0       0x30           \b,  24 kBits
->2      byte&0xF0       0x40           \b,  32 kBits
->2      byte&0xF0       0x50           \b,  40 kBits
->2      byte&0xF0       0x60           \b,  48 kBits
->2      byte&0xF0       0x70           \b,  56 kBits
->2      byte&0xF0       0x80           \b,  64 kBits
->2      byte&0xF0       0x90           \b,  80 kBits
->2      byte&0xF0       0xA0           \b,  96 kBits
->2      byte&0xF0       0xB0           \b, 112 kBits
->2      byte&0xF0       0xC0           \b, 128 kBits
->2      byte&0xF0       0xD0           \b, 144 kBits
->2      byte&0xF0       0xE0           \b, 160 kBits
-# timing
->2      byte&0x0C       0x00           \b, 22.05 kHz
->2      byte&0x0C       0x04           \b, 24 kHz
->2      byte&0x0C       0x08           \b, 16 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# MP2, M2A
-0       beshort&0xFFFE  0xFFF4         MPEG ADTS, layer II, v2
-# rate 
->2      byte&0xF0       0x10           \b,   8 kBits
->2      byte&0xF0       0x20           \b,  16 kBits 
->2      byte&0xF0       0x30           \b,  24 kBits
->2      byte&0xF0       0x40           \b,  32 kBits
->2      byte&0xF0       0x50           \b,  40 kBits
->2      byte&0xF0       0x60           \b,  48 kBits
->2      byte&0xF0       0x70           \b,  56 kBits
->2      byte&0xF0       0x80           \b,  64 kBits
->2      byte&0xF0       0x90           \b,  80 kBits
->2      byte&0xF0       0xA0           \b,  96 kBits
->2      byte&0xF0       0xB0           \b, 112 kBits
->2      byte&0xF0       0xC0           \b, 128 kBits
->2      byte&0xF0       0xD0           \b, 144 kBits
->2      byte&0xF0       0xE0           \b, 160 kBits
-# timing
->2      byte&0x0C       0x00           \b, 22.05 kHz
->2      byte&0x0C       0x04           \b, 24 kHz
->2      byte&0x0C       0x08           \b, 16 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# MPA, M2A
-0       beshort&0xFFFE  0xFFF6         MPEG ADTS, layer I, v2
-# rate
->2      byte&0xF0       0x10           \b,  32 kBits
->2      byte&0xF0       0x20           \b,  48 kBits
->2      byte&0xF0       0x30           \b,  56 kBits
->2      byte&0xF0       0x40           \b,  64 kBits
->2      byte&0xF0       0x50           \b,  80 kBits
->2      byte&0xF0       0x60           \b,  96 kBits
->2      byte&0xF0       0x70           \b, 112 kBits
->2      byte&0xF0       0x80           \b, 128 kBits
->2      byte&0xF0       0x90           \b, 144 kBits
->2      byte&0xF0       0xA0           \b, 160 kBits
->2      byte&0xF0       0xB0           \b, 176 kBits
->2      byte&0xF0       0xC0           \b, 192 kBits
->2      byte&0xF0       0xD0           \b, 224 kBits
->2      byte&0xF0       0xE0           \b, 256 kBits
-# timing
->2      byte&0x0C       0x00           \b, 22.05 kHz
->2      byte&0x0C       0x04           \b, 24 kHz
->2      byte&0x0C       0x08           \b, 16 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# MP3, M25A
-0       beshort&0xFFFE  0xFFE2         MPEG ADTS, layer III,  v2.5
-# rate  
->2      byte&0xF0       0x10           \b,   8 kBits
->2      byte&0xF0       0x20           \b,  16 kBits
->2      byte&0xF0       0x30           \b,  24 kBits
->2      byte&0xF0       0x40           \b,  32 kBits
->2      byte&0xF0       0x50           \b,  40 kBits
->2      byte&0xF0       0x60           \b,  48 kBits
->2      byte&0xF0       0x70           \b,  56 kBits
->2      byte&0xF0       0x80           \b,  64 kBits
->2      byte&0xF0       0x90           \b,  80 kBits
->2      byte&0xF0       0xA0           \b,  96 kBits
->2      byte&0xF0       0xB0           \b, 112 kBits
->2      byte&0xF0       0xC0           \b, 128 kBits
->2      byte&0xF0       0xD0           \b, 144 kBits
->2      byte&0xF0       0xE0           \b, 160 kBits
-# timing
->2      byte&0x0C       0x00           \b, 11.025 kHz
->2      byte&0x0C       0x04           \b, 12 kHz
->2      byte&0x0C       0x08           \b, 8 kHz
-# channels/options
->3      byte&0xC0       0x00           \b, Stereo
->3      byte&0xC0       0x40           \b, JntStereo
->3      byte&0xC0       0x80           \b, 2x Monaural
->3      byte&0xC0       0xC0           \b, Monaural
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Packet Pad
-#>2     byte            &0x01           \b, Custom Flag
-#>3     byte            &0x08           \b, Copyrighted
-#>3     byte            &0x04           \b, Original Source
-#>3     byte&0x03       1               \b, NR: 50/15 ms
-#>3     byte&0x03       3               \b, NR: CCIT J.17
-
-# AAC (aka MPEG-2 NBC audio) and MPEG-4 audio
-
-# Stored AAC streams (instead of the MP4 format)
-0       string          ADIF           MPEG ADIF, AAC
->4      byte            &0x80
->>13    byte            &0x10          \b, VBR
->>13    byte            ^0x10          \b, CBR
->>16    byte&0x1E       0x02           \b, single stream
->>16    byte&0x1E       0x04           \b, 2 streams
->>16    byte&0x1E       0x06           \b, 3 streams
->>16    byte            &0x08          \b, 4 or more streams
->>16    byte            &0x10          \b, 8 or more streams
->>4    byte            &0x80          \b, Copyrighted
->>13   byte            &0x40          \b, Original Source
->>13   byte            &0x20          \b, Home Flag
->4      byte            ^0x80
->>4     byte            &0x10          \b, VBR
->>4     byte            ^0x10          \b, CBR
->>7     byte&0x1E       0x02           \b, single stream
->>7     byte&0x1E       0x04           \b, 2 streams
->>7     byte&0x1E       0x06           \b, 3 streams
->>7     byte            &0x08          \b, 4 or more streams
->>7     byte            &0x10          \b, 8 or more streams
->>4    byte            &0x40          \b, Original Stream(s)
->>4    byte            &0x20          \b, Home Source
-
-# Live or stored single AAC stream (used with MPEG-2 systems)
-0       beshort&0xFFF6  0xFFF0         MPEG ADTS, AAC
->1      byte            ^0x08          \b, v2
->1      byte            &0x08          \b, v4
-# profile
->>2     byte            &0xC0          \b LTP
->2      byte&0xc0       0x00           \b, Main
->2      byte&0xc0       0x40           \b, LC
->2      byte&0xc0       0x80           \b, SSR
-# timing
->2      byte&0x3c       0x00           \b, 96 kHz
->2      byte&0x3c       0x04           \b, 88.2 kHz
->2      byte&0x3c       0x08           \b, 64 kHz
->2      byte&0x3c       0x0c           \b, 48 kHz
->2      byte&0x3c       0x10           \b, 44.1 kHz
->2      byte&0x3c       0x14           \b, 32 kHz
->2      byte&0x3c       0x18           \b, 24 kHz
->2      byte&0x3c       0x1c           \b, 22.05 kHz
->2      byte&0x3c       0x20           \b, 16 kHz
->2      byte&0x3c       0x24           \b, 12 kHz
->2      byte&0x3c       0x28           \b, 11.025 kHz
->2      byte&0x3c       0x2c           \b, 8 kHz
-# channels/options
->2      beshort&0x01c0  0x0040         \b, monaural
->2      beshort&0x01c0  0x0080         \b, stereo
->2      beshort&0x01c0  0x00c0         \b, stereo + center
->2      beshort&0x01c0  0x0100         \b, stereo+center+LFE
->2      beshort&0x01c0  0x0140         \b, surround
->2      beshort&0x01c0  0x0180         \b, surround + LFE
->2      beshort         &0x01C0        \b, surround + side
-#>1     byte            ^0x01           \b, Data Verify
-#>2     byte            &0x02           \b, Custom Flag
-#>3     byte            &0x20           \b, Original Stream
-#>3     byte            &0x10           \b, Home Source
-#>3     byte            &0x08           \b, Copyrighted
-
-# Live MPEG-4 audio streams (instead of RTP FlexMux)
-0       beshort&0xFFE0  0x56E0         MPEG-4 LOAS
-#>1     beshort&0x1FFF  x              \b, %u byte packet
->3      byte&0xE0       0x40
->>4     byte&0x3C       0x04           \b, single stream
->>4     byte&0x3C       0x08           \b, 2 streams
->>4     byte&0x3C       0x0C           \b, 3 streams
->>4     byte            &0x08          \b, 4 or more streams
->>4     byte            &0x20          \b, 8 or more streams
->3      byte&0xC0       0
->>4     byte&0x78       0x08           \b, single stream
->>4     byte&0x78       0x10           \b, 2 streams
->>4     byte&0x78       0x18           \b, 3 streams
->>4     byte            &0x20          \b, 4 or more streams
->>4     byte            &0x40          \b, 8 or more streams
-0       beshort         0x4DE1         MPEG-4 LO-EP audio stream
-
-# FLI animation format
-4      leshort         0xAF11                  FLI file
->6     leshort         x                       - %d frames,
->8     leshort         x                       width=%d pixels,
->10    leshort         x                       height=%d pixels,
->12    leshort         x                       depth=%d,
->16    leshort         x                       ticks/frame=%d
-# FLC animation format
-4      leshort         0xAF12                  FLC file
->6     leshort         x                       - %d frames
->8     leshort         x                       width=%d pixels,
->10    leshort         x                       height=%d pixels,
->12    leshort         x                       depth=%d,
->16    leshort         x                       ticks/frame=%d
-
-# DL animation format
-# XXX - collision with most `mips' magic
-#
-# I couldn't find a real magic number for these, however, this
-# -appears- to work.  Note that it might catch other files, too, so be
-# careful!
-#
-# Note that title and author appear in the two 20-byte chunks
-# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
-# 255 (hex FF)!  The DL format is really bad.
-#
-#0     byte    1       DL version 1, medium format (160x100, 4 images/screen)
-#>42   byte    x       - %d screens,
-#>43   byte    x       %d commands
-#0     byte    2       DL version 2
-#>1    byte    1       - large format (320x200,1 image/screen),
-#>1    byte    2       - medium format (160x100,4 images/screen),
-#>1    byte    >2      - unknown format,
-#>42   byte    x       %d screens,
-#>43   byte    x       %d commands
-# Based on empirical evidence, DL version 3 have several nulls following the
-# \003.  Most of them start with non-null values at hex offset 0x34 or so.
-#0     string  \3\0\0\0\0\0\0\0\0\0\0\0        DL version 3
-
-# SGI formats
-0      string          MOVI            Silicon Graphics movie file
-
-# Apple Quicktime and ISO types
-4       string          moov            Apple QuickTime
->12     string          mvhd            \b movie (fast start)
->12     string          mdra            \b URL
->12     string          cmov            \b movie (fast start, compressed header)
->12     string          rmra            \b multiple URLs
-4       string          mdat            Apple QuickTime movie (unoptimized)
-4       string          wide            Apple QuickTime movie (unoptimized)
-4       string          skip            Apple QuickTime movie (modified)
-4       string          free            Apple QuickTime movie (modified)
-4       string          idsc            Apple QuickTime image (fast start)
-4       string          idat            Apple QuickTime image (unoptimized)
-4       string          pckg            Apple QuickTime compressed archive
-4       string/B        jP              JPEG 2000 image
-4       string          ftyp            ISO Media
->8      string          isom            \b, MPEG v4 system
->8      string          mp41            \b, MPEG v4 system, version 1
->8      string          mp42            \b, MPEG v4 system, version 2
->8      string/B        jp2             \b, JPEG 2000 image
->8      string          3gp             \b, MPEG v4 system, 3GPP (H.263/AMR)
->8      string          mmp4            \b, MPEG v4 system, Mobile
->8      string/B        M4A             \b, MPEG v4 system, iTunes AAC-LC
->8      string/B        M4P             \b, MPEG v4 system, ISMA encrypted AAC-LC
->8      string/B        M4B             \b, MPEG v4 system, iTunes AAC-LC/AMR
->8      string/B        qt              \b, Apple QuickTime movie
-
-# iso 13818 transport stream
-#
-# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001 (ISO 13818.1)
-# (the following is a little bit restrictive and works fine for a stream
-#  that starts with PAT properly. it won't work for stream data, that is
-#  cut from an input device data right in the middle, but this shouldn't
-#  disturb)
-# syncbyte      8 bit  0x47
-# error_ind     1 bit  -
-# payload_start 1 bit  1
-# priority      1 bit  -
-# PID          13 bit  0x0000
-# scrambling    2 bit  -
-# adaptfld_ctrl 2 bit  1 or 3
-# conti_count   4 bit  0
-0      belong&0xFF5FFF1F       0x47400010      MPEG transport stream data
->188   byte                    !0x47           CORRUPTED
-
-# DIF digital video file format <mpruett@sgi.com>
-0      belong&0xffffff00       0x1f070000      DIF
->4     byte                    &0x01           (DVCPRO) movie file
->4     byte                    ^0x01           (DV) movie file
->3     byte                    &0x80           (PAL)
->3     byte                    ^0x80           (NTSC)
-
-# Microsoft Advanced Streaming Format (ASF) <mpruett@sgi.com>
-0      belong                  0x3026b275      Microsoft ASF
-
-# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
-0      string                  \x8aMNG         MNG video data,
->4     belong                  !0x0d0a1a0a     CORRUPTED,
->4     belong                  0x0d0a1a0a
->>16    belong x                               %ld x
->>20    belong x                               %ld
-
-# JNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
-0      string                  \x8bJNG         JNG video data,
->4     belong                  !0x0d0a1a0a     CORRUPTED,
->4     belong                  0x0d0a1a0a
->>16    belong x                               %ld x
->>20    belong x                               %ld
-
-# Vivo video (Wolfram Kleff)
-3      string          \x0D\x0AVersion:Vivo    Vivo video data
-
-# VRML (Virtual Reality Modelling Language)
-0       string/b        #VRML\ V1.0\ ascii     VRML 1 file
-0      string/b        #VRML\ V2.0\ utf8       ISO/IEC 14772 VRML 97 file
-
-#---------------------------------------------------------------------------
-# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube
-# From Mark Sheppard <msheppard@climax.co.uk>, 2002-10-03
-#
-0      string          HVQM4           %s
->6     string          >\0             v%s
->0     byte            x               GameCube movie,
->0x34  ubeshort        x               %d x
->0x36  ubeshort        x               %d,
->0x26  ubeshort        x               %dµs,
->0x42  ubeshort        0               no audio
->0x42  ubeshort        >0              %dHz audio
-
-#------------------------------------------------------------------------------
-# chi:  file(1) magic for ChiWriter files
-#
-0       string          \\1cw\          ChiWriter file
->5      string          >\0             version %s
-0       string          \\1cw           ChiWriter file
-
-#------------------------------------------------------------------------------
-# claris:  file(1) magic for claris
-# "H. Nanosecond" <aldomel@ix.netcom.com>
-# Claris Works a word processor, etc.
-# Version 3.0
-
-# .pct claris works clip art files
-#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
-#*
-#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000
-#null to byte 1000 octal
-514    string  \377\377\377\377\000    Claris clip art?
->0     string  \0\0\0\0\0\0\0\0\0\0\0\0\0      yes.
-514    string  \377\377\377\377\001    Claris clip art?
->0     string  \0\0\0\0\0\0\0\0\0\0\0\0\0      yes.
-
-# Claris works files
-# .cwk
-0      string  \002\000\210\003\102\117\102\117\000\001\206 Claris works document
-# .plt
-0      string  \020\341\000\000\010\010        Claris Works pallete files .plt
-
-# .msp a dictionary file I am not sure about this I have only one .msp file
-0      string  \002\271\262\000\040\002\000\164        Claris works dictionary
-
-# .usp are user dictionary bits
-# I am not sure about a magic header:
-#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151
-#        soh   S   p   f   8   U   D  sp   ^   S  cr  nl   p   o   d   i
-#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043
-#          a   t   r   i   s   t  sp   ^   S  cr  nl   d   i   v  sp   #
-
-# .mth Thesaurus
-# starts with \0 but no magic header
-
-# .chy Hyphenation file
-# I am not sure: 000 210 034 000 000
-
-# other claris files
-#./windows/claris/useng.ndx: data
-#./windows/claris/xtndtran.l32: data
-#./windows/claris/xtndtran.lst: data
-#./windows/claris/clworks.lbl: data
-#./windows/claris/clworks.prf: data
-#./windows/claris/userd.spl: data
-
-#------------------------------------------------------------------------------
-# fonts:  file(1) magic for font data
-#
-0      string          FONT            ASCII vfont text
-0      short           0436            Berkeley vfont data
-0      short           017001          byte-swapped Berkeley vfont data
-
-# PostScript fonts (must precede "printer" entries), quinlan@yggdrasil.com
-0      string          %!PS-AdobeFont-1.       PostScript Type 1 font text
->20    string          >\0                     (%s)
-6      string          %!PS-AdobeFont-1.       PostScript Type 1 font program data
-
-# X11 font files in SNF (Server Natural Format) format
-0      belong          00000004                X11 SNF font data, MSB first
-0      lelong          00000004                X11 SNF font data, LSB first
-
-# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan@yggdrasil.com)
-0      string          STARTFONT\040           X11 BDF font text
-
-# X11 fonts, from Daniel Quinlan (quinlan@yggdrasil.com)
-# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides)
-0      string          \001fcp                 X11 Portable Compiled Font data
->12    byte            0x02                    \b, LSB first
->12    byte            0x0a                    \b, MSB first
-0      string          D1.0\015                X11 Speedo font data
-
-#------------------------------------------------------------------------------
-# FIGlet fonts and controlfiles
-# From figmagic supplied with Figlet version 2.2
-# "David E. O'Brien" <obrien@FreeBSD.ORG>
-0      string          flf             FIGlet font
->3     string          >2a             version %-2.2s
-0      string          flc             FIGlet controlfile
->3     string          >2a             version %-2.2s
-
-# libGrx graphics lib fonts, from Albert Cahalan (acahalan@cs.uml.edu)
-# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++
-0      belong          0x14025919      libGrx font data,
->8     leshort         x               %dx
->10    leshort         x               \b%d
->40    string          x               %s
-# Misc. DOS VGA fonts, from Albert Cahalan (acahalan@cs.uml.edu)
-0      belong          0xff464f4e      DOS code page font data collection
-7      belong          0x00454741      DOS code page font data
-7      belong          0x00564944      DOS code page font data (from Linux?)
-4098   string          DOSFONT         DOSFONT2 encrypted font data
-
-# downloadable fonts for browser (prints type) anthon@mnt.org
-0      string          PFR1            PFR1 font
->102   string          >0              \b: %s
-
-# True Type fonts
-0      string  \000\001\000\000\000    TrueType font data
-
-0      string          \007\001\001\000Copyright\ (c)\ 199     Adobe Multiple Master font
-0      string          \012\001\001\000Copyright\ (c)\ 199     Adobe Multiple Master font
-
-# Opentype font data from Avi Bercovich
-0      string          OTTO            OpenType font data 
-
-
-#------------------------------------------------------------------------------
-# macintosh description
-#
-# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
-# Daniel Quinlan, quinlan@yggdrasil.com
-11     string  must\ be\ converted\ with\ BinHex       BinHex binary text
->41    string  x                                       \b, version %.3s
-
-# Stuffit archives are the de facto standard of compression for Macintosh
-# files obtained from most archives. (franklsm@tuns.ca)
-0      string          SIT!                    StuffIt Archive (data)
->2     string          x                       : %s
-0      string          SITD                    StuffIt Deluxe (data)
->2     string          x                       : %s
-0      string          Seg                     StuffIt Deluxe Segment (data)
->2     string          x                       : %s
-
-# Newer StuffIt archives (grant@netbsd.org)
-0      string          StuffIt                 StuffIt Archive
->162   string          >0                      : %s
-
-# Macintosh Applications and Installation binaries (franklsm@tuns.ca)
-0      string          APPL                    Macintosh Application (data)
->2     string          x                       \b: %s
-
-# Macintosh System files (franklsm@tuns.ca)
-0      string          zsys                    Macintosh System File (data)
-0      string          FNDR                    Macintosh Finder (data)
-0      string          libr                    Macintosh Library (data)
->2     string          x                       : %s
-0      string          shlb                    Macintosh Shared Library (data)
->2     string          x                       : %s
-0      string          cdev                    Macintosh Control Panel (data)
->2     string          x                       : %s
-0      string          INIT                    Macintosh Extension (data)
->2     string          x                       : %s
-0      string          FFIL                    Macintosh Truetype Font (data)
->2     string          x                       : %s
-0      string          LWFN                    Macintosh Postscript Font (data)
->2     string          x                       : %s
-
-# Additional Macintosh Files (franklsm@tuns.ca)
-0      string          PACT                    Macintosh Compact Pro Archive (data)
->2     string          x                       : %s
-0      string          ttro                    Macintosh TeachText File (data)
->2     string          x                       : %s
-0      string          TEXT                    Macintosh TeachText File (data)
->2     string          x                       : %s
-0      string          PDF                     Macintosh PDF File (data)
->2     string          x                       : %s
-
-# MacBinary format (Eric Fischer, enf@pobox.com)
-#
-# Unfortunately MacBinary doesn't really have a magic number prior
-# to the MacBinary III format.  The checksum is really the way to
-# do it, but the magic file format isn't up to the challenge.
-#
-# 0    byte            0
-# 1    byte                            # filename length
-# 2    string                          # filename
-# 65    string                         # file type
-# 69   string                          # file creator
-# 73   byte                            # Finder flags
-# 74   byte            0
-# 75   beshort                         # vertical posn in window
-# 77   beshort                         # horiz posn in window
-# 79   beshort                         # window or folder ID
-# 81    byte                           # protected?
-# 82   byte            0
-# 83   belong                          # length of data segment
-# 87   belong                          # length of resource segment
-# 91   belong                          # file creation date
-# 95   belong                          # file modification date
-# 99   beshort                         # length of comment after resource
-# 101  byte                            # new Finder flags
-# 102  string          mBIN            # (only in MacBinary III)
-# 106  byte                            # char. code of file name
-# 107  byte                            # still more Finder flags
-# 116  belong                          # total file length
-# 120  beshort                         # length of add'l header
-# 122  byte            129             # for MacBinary II
-# 122  byte            130             # for MacBinary III
-# 123  byte            129             # minimum version that can read fmt
-# 124  beshort                         # checksum
-#
-# This attempts to use the version numbers as a magic number, requiring
-# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second
-# be 0x81.  This works for the files I have, but maybe not for everyone's.
-
-# Unfortunately, this magic is quite weak - MPi
-#122   beshort&0xFCFF  0x8081          Macintosh MacBinary data
-
-# MacBinary I doesn't have the version number field at all, but MacBinary II
-# has been in use since 1987 so I hope there aren't many really old files
-# floating around that this will miss.  The original spec calls for using
-# the nulls in 0, 74, and 82 as the magic number.
-#
-# Another possibility, that would also work for MacBinary I, is to use
-# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will
-# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,
-# and that 74 will be 0.  So something like
-# 
-# 71   belong&0x80804EFF 0x00000000    Macintosh MacBinary data
-# 
-# >73  byte&0x01       0x01            \b, inited
-# >73  byte&0x02       0x02            \b, changed
-# >73  byte&0x04       0x04            \b, busy
-# >73  byte&0x08       0x08            \b, bozo
-# >73  byte&0x10       0x10            \b, system
-# >73  byte&0x10       0x20            \b, bundle
-# >73  byte&0x10       0x40            \b, invisible
-# >73  byte&0x10       0x80            \b, locked
-
-#>65   string          x               \b, type "%4.4s"
-
-#>65   string          8BIM            (PhotoShop)
-#>65   string          ALB3            (PageMaker 3)
-#>65   string          ALB4            (PageMaker 4)
-#>65   string          ALT3            (PageMaker 3)
-#>65   string          APPL            (application)
-#>65   string          AWWP            (AppleWorks word processor)
-#>65   string          CIRC            (simulated circuit)
-#>65   string          DRWG            (MacDraw)
-#>65   string          EPSF            (Encapsulated PostScript)
-#>65   string          FFIL            (font suitcase)
-#>65   string          FKEY            (function key)
-#>65   string          FNDR            (Macintosh Finder)
-#>65   string          GIFf            (GIF image)
-#>65   string          Gzip            (GNU gzip)
-#>65   string          INIT            (system extension)
-#>65   string          LIB\            (library)
-#>65   string          LWFN            (PostScript font)
-#>65   string          MSBC            (Microsoft BASIC)
-#>65   string          PACT            (Compact Pro archive)
-#>65   string          PDF\            (Portable Document Format)
-#>65   string          PICT            (picture)
-#>65   string          PNTG            (MacPaint picture)
-#>65   string          PREF            (preferences)
-#>65   string          PROJ            (Think C project)
-#>65   string          QPRJ            (Think Pascal project)
-#>65   string          SCFL            (Defender scores)
-#>65   string          SCRN            (startup screen)
-#>65   string          SITD            (StuffIt Deluxe)
-#>65   string          SPn3            (SuperPaint)
-#>65   string          STAK            (HyperCard stack)
-#>65   string          Seg\            (StuffIt segment)
-#>65   string          TARF            (Unix tar archive)
-#>65   string          TEXT            (ASCII)
-#>65   string          TIFF            (TIFF image)
-#>65   string          TOVF            (Eudora table of contents)
-#>65   string          WDBN            (Microsoft Word word processor)
-#>65   string          WORD            (MacWrite word processor)
-#>65   string          XLS\            (Microsoft Excel)
-#>65   string          ZIVM            (compress (.Z))
-#>65   string          ZSYS            (Pre-System 7 system file)
-#>65   string          acf3            (Aldus FreeHand)
-#>65   string          cdev            (control panel)
-#>65   string          dfil            (Desk Acessory suitcase)
-#>65   string          libr            (library)
-#>65   string          nX^d            (WriteNow word processor)
-#>65   string          nX^w            (WriteNow dictionary)
-#>65   string          rsrc            (resource)
-#>65   string          scbk            (Scrapbook)
-#>65   string          shlb            (shared library)
-#>65   string          ttro            (SimpleText read-only)
-#>65   string          zsys            (system file)
-
-#>69   string          x               \b, creator "%4.4s"
-
-# Somewhere, Apple has a repository of registered Creator IDs.  These are
-# just the ones that I happened to have files from and was able to identify.
-
-#>69   string          8BIM            (Adobe Photoshop)
-#>69   string          ALD3            (PageMaker 3)
-#>69   string          ALD4            (PageMaker 4)
-#>69   string          ALFA            (Alpha editor)
-#>69   string          APLS            (Apple Scanner)
-#>69   string          APSC            (Apple Scanner)
-#>69   string          BRKL            (Brickles)
-#>69   string          BTFT            (BitFont)
-#>69   string          CCL2            (Common Lisp 2)
-#>69   string          CCL\            (Common Lisp)
-#>69   string          CDmo            (The Talking Moose)
-#>69   string          CPCT            (Compact Pro)
-#>69   string          CSOm            (Eudora)
-#>69   string          DMOV            (Font/DA Mover)
-#>69   string          DSIM            (DigSim)
-#>69   string          EDIT            (Macintosh Edit)
-#>69   string          ERIK            (Macintosh Finder)
-#>69   string          EXTR            (self-extracting archive)
-#>69   string          Gzip            (GNU gzip)
-#>69   string          KAHL            (Think C)
-#>69   string          LWFU            (LaserWriter Utility)
-#>69   string          LZIV            (compress)
-#>69   string          MACA            (MacWrite)
-#>69   string          MACS            (Macintosh operating system)
-#>69   string          MAcK            (MacKnowledge terminal emulator)
-#>69   string          MLND            (Defender)
-#>69   string          MPNT            (MacPaint)
-#>69   string          MSBB            (Microsoft BASIC (binary))
-#>69   string          MSWD            (Microsoft Word)
-#>69   string          NCSA            (NCSA Telnet)
-#>69   string          PJMM            (Think Pascal)
-#>69   string          PSAL            (Hunt the Wumpus)
-#>69   string          PSI2            (Apple File Exchange)
-#>69   string          R*ch            (BBEdit)
-#>69   string          RMKR            (Resource Maker)
-#>69   string          RSED            (Resource Editor)
-#>69   string          Rich            (BBEdit)
-#>69   string          SIT!            (StuffIt)
-#>69   string          SPNT            (SuperPaint)
-#>69   string          Unix            (NeXT Mac filesystem)
-#>69   string          VIM!            (Vim editor)
-#>69   string          WILD            (HyperCard)
-#>69   string          XCEL            (Microsoft Excel)
-#>69   string          aCa2            (Fontographer)
-#>69   string          aca3            (Aldus FreeHand)
-#>69   string          dosa            (Macintosh MS-DOS file system)
-#>69   string          movr            (Font/DA Mover)
-#>69   string          nX^n            (WriteNow)
-#>69   string          pdos            (Apple ProDOS file system)
-#>69   string          scbk            (Scrapbook)
-#>69   string          ttxt            (SimpleText)
-#>69   string          ufox            (Foreign File Access)
-
-# Just in case...
-
-102    string          mBIN            MacBinary III data with surprising version number
-
-# sas magic from Bruce Foster (bef@nwu.edu)
-#
-#0     string          SAS             SAS
-#>8    string          x               %s
-0      string          SAS             SAS
->24    string          DATA            data file
->24    string          CATALOG         catalog
->24    string          INDEX           data file index
->24    string          VIEW            data view
-# sas 7+ magic from Reinhold Koch (reinhold.koch@roche.com)
-#
-0x54    string          SAS             SAS 7+
->0x9C   string          DATA            data file
->0x9C   string          CATALOG         catalog
->0x9C   string          INDEX           data file index
->0x9C   string          VIEW            data view
-
-# spss magic for SPSS system and portable files, 
-#       from Bruce Foster (bef@nwu.edu).
-
-0      long            0xc1e2c3c9      SPSS Portable File
->40    string          x               %s
-
-0      string          $FL2            SPSS System File
->24    string          x               %s
-
-# Macintosh filesystem data
-# From "Tom N Harris" <telliamed@mac.com>
-# Fixed HFS+ and Partition map magic: Ethan Benson <erbenson@alaska.net>
-# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these
-# entries depend on the data arithmetic added after v.35
-# There's also some Pascal strings in here, ditto...
-
-# The boot block signature, according to IM:Files, is 
-# "for HFS volumes, this field always contains the value 0x4C4B."
-# But if this is true for MFS or HFS+ volumes, I don't know.
-# Alternatively, the boot block is supposed to be zeroed if it's
-# unused, so a simply >0 should suffice.
-
-0x400  beshort                 0xD2D7          Macintosh MFS data
->0     beshort                 0x4C4B          (bootable)
->0x40a beshort                 &0x8000         (locked)
->0x402 beldate-0x7C25B080      x               created: %s,
->0x406 beldate-0x7C25B080      >0              last backup: %s,
->0x414 belong                  x               block size: %d,
->0x412 beshort                 x               number of blocks: %d,
->0x424 pstring                 x               volume name: %s
-
-# "BD" is has many false positives
-#0x400 beshort                 0x4244          Macintosh HFS data
-#>0    beshort                 0x4C4B          (bootable)
-#>0x40a        beshort                 &0x8000         (locked)
-#>0x40a        beshort                 ^0x0100         (mounted)
-#>0x40a        beshort                 &0x0200         (spared blocks)
-#>0x40a        beshort                 &0x0800         (unclean)
-#>0x47C        beshort                 0x482B          (Embedded HFS+ Volume)
-#>0x402        beldate-0x7C25B080      x               created: %s,
-#>0x406        beldate-0x7C25B080      x               last modified: %s,
-#>0x440        beldate-0x7C25B080      >0              last backup: %s,
-#>0x414        belong                  x               block size: %d,
-#>0x412        beshort                 x               number of blocks: %d,
-#>0x424        pstring                 x               volume name: %s
-
-0x400  beshort                 0x482B          Macintosh HFS Extended
->&0    beshort                 x               version %d data
->0     beshort                 0x4C4B          (bootable)
->0x404 belong                  ^0x00000100     (mounted)
->&2    belong                  &0x00000200     (spared blocks)
->&2    belong                  &0x00000800     (unclean)
->&2    belong                  &0x00008000     (locked)
->&6    string                  x               last mounted by: '%.4s',
-# really, that should be treated as a belong and we print a string
-# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1"
->&14   beldate-0x7C25B080      x               created: %s,
-# only the creation date is local time, all other timestamps in HFS+ are UTC.
->&18   bedate-0x7C25B080       x               last modified: %s,
->&22   bedate-0x7C25B080       >0              last backup: %s,
->&26   bedate-0x7C25B080       >0              last checked: %s,
->&38   belong                  x               block size: %d,
->&42   belong                  x               number of blocks: %d,
->&46   belong                  x               free blocks: %d
-
-# I don't think this is really necessary since it doesn't do much and 
-# anything with a valid driver descriptor will also have a valid
-# partition map
-#0             beshort         0x4552          Apple Device Driver data
-#>&24          beshort         =1              \b, MacOS
-
-# Is that the partition type a cstring or a pstring? Well, IM says "strings 
-# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a 
-# cstring. Of course, partitions can contain more than four entries, but 
-# what're you gonna do?
-0x200          beshort         0x504D          Apple Partition data
->0x2           beshort         x               block size: %d,
->0x230         string          x               first type: %s,
->0x210         string          x               name: %s,
->0x254         belong          x               number of blocks: %d,
->0x400         beshort         0x504D          
->>0x430                string          x               second type: %s,
->>0x410                string          x               name: %s,
->>0x454                belong          x               number of blocks: %d,
->>0x800                beshort         0x504D          
->>>0x830       string          x               third type: %s,
->>>0x810       string          x               name: %s,
->>>0x854       belong          x               number of blocks: %d,
->>>0xa00       beshort         0x504D          
->>>>0xa30      string          x               fourth type: %s,
->>>>0xa10      string          x               name: %s,
->>>>0xa54      belong          x               number of blocks: %d
-# AFAIK, only the signature is different
-0x200          beshort         0x5453          Apple Old Partition data
->0x2           beshort         x               block size: %d,
->0x230         string          x               first type: %s,
->0x210         string          x               name: %s,
->0x254         belong          x               number of blocks: %d,
->0x400         beshort         0x504D          
->>0x430                string          x               second type: %s,
->>0x410                string          x               name: %s,
->>0x454                belong          x               number of blocks: %d,
->>0x800                beshort         0x504D          
->>>0x830       string          x               third type: %s,
->>>0x810       string          x               name: %s,
->>>0x854       belong          x               number of blocks: %d,
->>>0xa00       beshort         0x504D          
->>>>0xa30      string          x               fourth type: %s,
->>>>0xa10      string          x               name: %s,
->>>>0xa54      belong          x               number of blocks: %d
-
-# From: Remi Mommsen <mommsen@slac.stanford.edu>
-0              string          BOMStore        Mac OS X bill of materials (BOM) fil
-
-#------------------------------------------------------------------------------
-# mathematica:  file(1) magic for mathematica files
-# "H. Nanosecond" <aldomel@ix.netcom.com>
-# Mathematica a multi-purpose math program
-# versions 2.2 and 3.0
-
-#mathematica .mb
-0      string  \064\024\012\000\035\000\000\000        Mathematica version 2 notebook
-0      string  \064\024\011\000\035\000\000\000        Mathematica version 2 notebook
-
-# .ma
-# multiple possibilites:
-
-0      string  (*^\n\n::[\011frontEndVersion\ =\       Mathematica notebook
-#>41   string  >\0     %s
-
-#0     string  (*^\n\n::[\011palette   Mathematica notebook version 2.x
-
-#0     string  (*^\n\n::[\011Information       Mathematica notebook version 2.x
-#>675  string  >\0     %s #doesn't work well
-
-# there may be 'cr' instread of 'nl' in some does this matter?
-
-# generic:
-0      string  (*^\r\r::[\011  Mathematica notebook version 2.x
-0      string  \(\*\^\r\n\r\n\:\:\[\011        Mathematica notebook version 2.x
-0      string  (*^\015                 Mathematica notebook version 2.x
-0      string  (*^\n\r\n\r::[\011      Mathematica notebook version 2.x
-0      string  (*^\r::[\011    Mathematica notebook version 2.x
-0      string  (*^\r\n::[\011  Mathematica notebook version 2.x
-0      string  (*^\n\n::[\011  Mathematica notebook version 2.x
-0      string  (*^\n::[\011    Mathematica notebook version 2.x
-
-
-# Mathematica .mx files
-
-#0     string  (*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*)      Mathematica binary file
-0      string  (*This\ is\ a\ Mathematica\ binary\     Mathematica binary file
-#>71   string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000     
-# >71... is optional
->88    string  >\0     from %s
-
-
-# Mathematica files PBF:
-# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000
-0      string  MMAPBF\000\001\000\000\000\203\000\001\000      Mathematica PBF (fonts I think)
-
-# .ml files  These are menu resources I think
-# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ 
-# how to put that into a magic rule?
-4      string  \ A~    MAthematica .ml file
-
-# .nb files
-#too long 0    string  (***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook     Mathematica 3.0 notebook
-0      string  (***********************        Mathematica 3.0 notebook
-
-# other (* matches it is a comment start in these langs
-0      string  (*      Mathematica, or Pascal,  Modula-2 or 3 code text
-
-#########################
-# MatLab v5
-0       string  MATLAB  Matlab v5 mat-file
->126    short   0x494d  (big endian)
->>124   beshort x       version 0x%04x
->126    short   0x4d49  (little endian)
->>124   leshort x       version 0x%04x
-
-#------------------------------------------------------------------------------
-# teapot:  file(1) magic for "teapot" spreadsheet
-#
-0       string          #!teapot\012xdr      teapot work sheet (XDR format)
-
-#------------------------------------------------------------------------------
-# psion:  file(1) magic for Psion handhelds data
-# from: Peter Breitenlohner <peb@mppmu.mpg.de>
-#
-0      lelong          0x10000037      Psion Series 5
->4     lelong          0x10000039      font file
->4     lelong          0x1000003A      printer driver
->4     lelong          0x1000003B      clipboard
->4     lelong          0x10000042      multi-bitmap image
->4     lelong          0x1000006A      application infomation file
->4     lelong          0x1000006D
->>8    lelong          0x1000007D      sketch image
->>8    lelong          0x1000007E      voice note
->>8    lelong          0x1000007F      word file
->>8    lelong          0x10000085      OPL program
->>8    lelong          0x10000088      sheet file
->>8    lelong          0x100001C4      EasyFax initialisation file
->4     lelong          0x10000073      OPO module
->4     lelong          0x10000074      OPL application
->4     lelong          0x1000008A      exported multi-bitmap image
-
-0      lelong          0x10000041      Psion Series 5 ROM multi-bitmap image
-
-0      lelong          0x10000050      Psion Series 5
->4     lelong          0x1000006D      database
->4     lelong          0x100000E4      ini file
-
-0      lelong          0x10000079      Psion Series 5 binary:
->4     lelong          0x00000000      DLL
->4     lelong          0x10000049      comms hardware library
->4     lelong          0x1000004A      comms protocol library
->4     lelong          0x1000005D      OPX
->4     lelong          0x1000006C      application
->4     lelong          0x1000008D      DLL
->4     lelong          0x100000AC      logical device driver
->4     lelong          0x100000AD      physical device driver
->4     lelong          0x100000E5      file transfer protocol
->4     lelong          0x100000E5      file transfer protocol
->4     lelong          0x10000140      printer defintion
->4     lelong          0x10000141      printer defintion
-
-0      lelong          0x1000007A      Psion Series 5 executable
-
-#------------------------------------------------------------------------------
-# diff:  file(1) magic for diff(1) output
-#
-0      string          diff\   'diff' output text
-0      string          ***\            'diff' output text
-0      string          Only\ in\       'diff' output text
-0      string          Common\ subdirectories:\        'diff' output text
-
-#------------------------------------------------------------------------------
-# ESRI Shapefile format (.shp .shx .dbf=DBaseIII)
-# Based on info from
-# <URL:http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf>
-0      belong  9994    ESRI Shapefile
->4     belong  =0
->8     belong  =0
->12    belong  =0
->16    belong  =0
->20    belong  =0
->28    lelong  x       version %d
->24    belong  x       length %d
->32    lelong  =0      type Null Shape
->32    lelong  =1      type Point
->32    lelong  =3      type PolyLine
->32    lelong  =5      type Polygon
->32    lelong  =8      type MultiPoint
->32    lelong  =11     type PointZ
->32    lelong  =13     type PolyLineZ
->32    lelong  =15     type PolygonZ
->32    lelong  =18     type MultiPointZ
->32    lelong  =21     type PointM
->32    lelong  =23     type PolyLineM
->32    lelong  =25     type PolygonM
->32    lelong  =28     type MultiPointM
->32    lelong  =31     type MultiPatch
-#------------------------------------------------------------------------------
-# GIMP Gradient: file(1) magic for the GIMP's gradient data files
-# by Federico Mena <federico@nuclecu.unam.mx>
-
-0       string          GIMP\ Gradient  GIMP gradient data
-
-#------------------------------------------------------------------------------
-# XCF:  file(1) magic for the XCF image format used in the GIMP developed
-#       by Spencer Kimball and Peter Mattis
-#       ('Bucky' LaDieu, nega@vt.edu)
-
-0      string          gimp\ xcf       GIMP XCF image data,
->9     string          file            version 0,
->9     string          v               version
->>10   string          >\0             %s,
->14    belong          x               %lu x
->18    belong          x               %lu,
->22     belong          0               RGB Color
->22     belong          1               Greyscale
->22     belong          2               Indexed Color
->22    belong          >2              Unknown Image Type.
-
-#------------------------------------------------------------------------------
-# XCF:  file(1) magic for the patterns used in the GIMP, developed
-#       by Spencer Kimball and Peter Mattis
-#       ('Bucky' LaDieu, nega@vt.edu)
-
-20      string          GPAT            GIMP pattern data,
->24     string          x               %s
-
-#------------------------------------------------------------------------------
-# XCF:  file(1) magic for the brushes used in the GIMP, developed
-#       by Spencer Kimball and Peter Mattis
-#       ('Bucky' LaDieu, nega@vt.edu)
-
-20      string          GIMP            GIMP brush data
-
-#------------------------------------------------------------------------------
-# adi: file(1) magic for ADi's objects
-# From Gregory McGarry <g.mcgarry@ieee.org>
-#
-0      leshort         0x521c          COFF DSP21k
->18    lelong          &02             executable,
->18    lelong          ^02
->>18   lelong          &01             static object,
->>18   lelong          ^01             relocatable object,
->18    lelong          &010            stripped
->18    lelong          ^010            not stripped
-
-#------------------------------------------------------------------------------
-# autocad:  file(1) magic for cad files
-#
-
-# AutoCAD DWG versions R13/R14 (www.autodesk.com)
-# Written December 01, 2003 by Lester Hightower
-# Based on the DWG File Format Specifications at http://www.opendwg.org/
-0      string         \101\103\061\060\061                AutoCAD
->5     string         \062\000\000\000\000                DWG ver. R13
->5     string         \064\000\000\000\000                DWG ver. R14
-
-# Microstation DGN/CIT Files (www.bentley.com)
-# Written October 30, 2003 by Lester Hightower
-# DGN is the default file extension of Microstation/Intergraph CAD files.
-# CIT is the proprietary raster format (similar to TIFF) used to attach
-# raster underlays to Microstation DGN (vector) drawings.
-# 
-# http://www.wotsit.org/search.asp
-# http://filext.com/detaillist.php?extdetail=DGN
-# http://filext.com/detaillist.php?extdetail=CIT
-#
-# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2
-# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928
-# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682
-# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F
-0      string         \010\011\376                        Microstation
->3     string         \002
->>30   string         \372\104                            DGN File
->>30   string         \172\104                            DGN File
->>30   string         \026\105                            DGN File
->4     string         \030\000\000                        CIT File
-
-# AutoCad, from Nahuel Greco
-0      string AC1012   AutoCad (release 12)
-0      string AC1014   AutoCad (release 14)
-
-#------------------------------------------------------------------------------
-# T602 editor documents 
-# by David Necas <yeti@physics.muni.cz>
-0      string  @CT\    T602 document data,
->4     string  0       Kamenicky
->4     string  1       CP 852
->4     string  2       KOI8-CS
->4     string  >2      unknown encoding
-
-# Vi IMproved Encrypted file 
-# by David Necas <yeti@physics.muni.cz>
-0      string  VimCrypt~       Vim encrypted file data
-
-#------------------------------------------------------------------------------
-# tex:  file(1) magic for TeX files
-#
-# From <conklin@talisman.kaleida.com>
-
-# Although we may know the offset of certain text fields in TeX DVI
-# and font files, we can't use them reliably because they are not
-# zero terminated. [but we do anyway, christos]
-0      string          \367\002        TeX DVI file
->16    string          >\0             (%s)
-0      string          \367\203        TeX generic font data
-0      string          \367\131        TeX packed font data
->3     string          >\0             (%s)
-0      string          \367\312        TeX virtual font data
-0      string          This\ is\ TeX,  TeX transcript text
-0      string          This\ is\ METAFONT,     METAFONT transcript text
-
-# There is no way to detect TeX Font Metric (*.tfm) files without
-# breaking them apart and reading the data.  The following patterns
-# match most *.tfm files generated by METAFONT or afm2tfm.
-2      string          \000\021        TeX font metric data
->33    string          >\0             (%s)
-2      string          \000\022        TeX font metric data
->33    string          >\0             (%s)
-
-# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com)
-0      string          \\input\ texinfo        Texinfo source text
-0      string          This\ is\ Info\ file    GNU Info text
-
-# TeX documents, from Daniel Quinlan (quinlan@yggdrasil.com)
-0      string          \\input         TeX document text
-0      string          \\section       LaTeX document text
-0      string          \\setlength     LaTeX document text
-0      string          \\documentstyle LaTeX document text
-0      string          \\chapter       LaTeX document text
-0      string          \\documentclass LaTeX 2e document text
-0      string          \\relax         LaTeX auxiliary file
-0      string          \\contentsline  LaTeX  table of contents
-0      string          %\ -*-latex-*-  LaTeX document text
-
-# Tex document, from Hendrik Scholz <hendrik@scholz.net>
-0   string      \\ifx       TeX document text
-
-# Index and glossary files
-0      string          \\indexentry    LaTeX raw index file
-0      string          \\begin{theindex}       LaTeX sorted index
-0      string          \\glossaryentry LaTeX raw glossary
-0      string          \\begin{theglossary}    LaTeX sorted glossary
-0      string          This\ is\ makeindex     Makeindex log file
-
-# End of TeX
-
-#------------------------------------------------------------------------------
-# file(1) magic for BibTex text files
-# From Hendrik Scholz <hendrik@scholz.net>
-
-0   string/c @article{        BibTeX text file
-0   string/c @book{           BibTeX text file
-0   string/c @inbook{         BibTeX text file
-0   string/c @incollection{   BibTeX text file
-0   string/c @inproceedings{  BibTeX text file
-0   string/c @manual{         BibTeX text file
-0   string/c @misc{           BibTeX text file
-0   string/c @preamble{       BibTeX text file
-0   string/c @phdthesis{      BibTeX text file
-0   string/c @techreport{     BibTeX text file
-0   string/c @unpublished{    BibTeX text file
-
-73  string %%%\ \ BibTeX-file{ BibTex text file (with full header)
-
-73  string %%%\ \ @BibTeX-style-file{   BibTeX style text file (with full header)
-
-0   string %\ BibTeX\ standard\ bibliography\      BibTeX standard bibliography style text file
-
-0   string %\ BibTeX\ `     BibTeX custom bibliography style text file
-
-0   string  @c\ @mapfile{   TeX font aliases text file
-
-
-#------------------------------------------------------------------------------
-# psdbms:  file(1) magic for psdatabase
-#
-0      belong&0xff00ffff       0x56000000      ps database
->1     string  >\0     version %s
->4     string  >\0     from kernel %s
-#------------------------------------------------------------------------------
-# convex:  file(1) magic for Convex boxes
-#
-# Convexes are big-endian.
-#
-# /*\
-#  * Below are the magic numbers and tests added for Convex.
-#  * Added at beginning, because they are expected to be used most.
-# \*/
-0      belong  0507    Convex old-style object
->16    belong  >0      not stripped
-0      belong  0513    Convex old-style demand paged executable
->16    belong  >0      not stripped
-0      belong  0515    Convex old-style pre-paged executable
->16    belong  >0      not stripped
-0      belong  0517    Convex old-style pre-paged, non-swapped executable
->16    belong  >0      not stripped
-0      belong  0x011257        Core file
-#
-# The following are a series of dump format magic numbers.  Each one
-# corresponds to a drastically different dump format.  The first on is
-# the original dump format on a 4.1 BSD or earlier file system.  The
-# second marks the change between the 4.1 file system and the 4.2 file
-# system.  The Third marks the changing of the block size from 1K
-# to 2K to be compatible with an IDC file system.  The fourth indicates
-# a dump that is dependent on Convex Storage Manager, because data in
-# secondary storage is not physically contained within the dump.
-# The restore program uses these number to determine how the data is
-# to be extracted.
-#
-24     belong  =60011  dump format, 4.1 BSD or earlier
-24     belong  =60012  dump format, 4.2 or 4.3 BSD without IDC
-24     belong  =60013  dump format, 4.2 or 4.3 BSD (IDC compatible)
-24     belong  =60014  dump format, Convex Storage Manager by-reference dump
-#
-# what follows is a bunch of bit-mask checks on the flags field of the opthdr.
-# If there is no `=' sign, assume just checking for whether the bit is set?
-#
-0      belong  0601            Convex SOFF
->88    belong&0x000f0000       =0x00000000     c1
->88    belong                  &0x00010000     c2
->88    belong                  &0x00020000     c2mp
->88    belong                  &0x00040000     parallel
->88    belong                  &0x00080000     intrinsic
->88    belong                  &0x00000001     demand paged
->88    belong                  &0x00000002     pre-paged
->88    belong                  &0x00000004     non-swapped
->88    belong                  &0x00000008     POSIX
-#
->84    belong                  &0x80000000     executable
->84    belong                  &0x40000000     object
->84    belong&0x20000000       =0              not stripped
->84    belong&0x18000000       =0x00000000     native fpmode
->84    belong&0x18000000       =0x10000000     ieee fpmode
->84    belong&0x18000000       =0x18000000     undefined fpmode
-#
-0      belong                  0605            Convex SOFF core
-#
-0      belong                  0607            Convex SOFF checkpoint
->88    belong&0x000f0000       =0x00000000     c1
->88    belong                  &0x00010000     c2
->88    belong                  &0x00020000     c2mp
->88    belong                  &0x00040000     parallel
->88    belong                  &0x00080000     intrinsic
->88    belong                  &0x00000008     POSIX
-#
->84    belong&0x18000000       =0x00000000     native fpmode
->84    belong&0x18000000       =0x10000000     ieee fpmode
->84    belong&0x18000000       =0x18000000     undefined fpmode
-
-#------------------------------------------------------------------------------
-# freebsd:  file(1) magic for FreeBSD objects
-#
-# All new-style FreeBSD magic numbers are in host byte order (i.e.,
-# little-endian on x86).
-#
-# XXX - this comes from the file "freebsd" in a recent FreeBSD version of
-# "file"; it, and the NetBSD stuff in "netbsd", appear to use different
-# schemes for distinguishing between executable images, shared libraries,
-# and object files.
-#
-# FreeBSD says:
-#
-#    Regardless of whether it's pure, demand-paged, or none of the
-#    above:
-#
-#      if the entry point is < 4096, then it's a shared library if
-#      the "has run-time loader information" bit is set, and is
-#      position-independent if the "is position-independent" bit
-#      is set;
-#
-#      if the entry point is >= 4096 (or >4095, same thing), then it's
-#      an executable, and is dynamically-linked if the "has run-time
-#      loader information" bit is set.
-#
-# On x86, NetBSD says:
-#
-#    If it's neither pure nor demand-paged:
-#
-#      if it has the "has run-time loader information" bit set, it's
-#      a dynamically-linked executable;
-#
-#      if it doesn't have that bit set, then:
-#
-#          if it has the "is position-independent" bit set, it's
-#          position-independent;
-#
-#          if the entry point is non-zero, it's an executable, otherwise
-#          it's an object file.
-#
-#    If it's pure:
-#
-#      if it has the "has run-time loader information" bit set, it's
-#      a dynamically-linked executable, otherwise it's just an
-#      executable.
-#
-#    If it's demand-paged:
-#
-#      if it has the "has run-time loader information" bit set,
-#      then:
-#
-#          if the entry point is < 4096, it's a shared library;
-#
-#          if the entry point is = 4096 or > 4096 (i.e., >= 4096),
-#          it's a dynamically-linked executable);
-#
-#      if it doesn't have the "has run-time loader information" bit
-#      set, then it's just an executable.
-#
-# (On non-x86, NetBSD does much the same thing, except that it uses
-# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K
-# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's
-# had 8K pages; dunno about MIPS.)
-#
-# I suspect the two will differ only in perverse and uninteresting cases
-# ("shared" libraries that aren't demand-paged and whose pages probably
-# won't actually be shared, executables with entry points <4096).
-#
-# I leave it to those more familiar with FreeBSD and NetBSD to figure out
-# what the right answer is (although using ">4095", FreeBSD-style, is
-# probably better than separately checking for "=4096" and ">4096",
-# NetBSD-style).  (The old "netbsd" file analyzed FreeBSD demand paged
-# executables using the NetBSD technique.)
-#
-0      lelong&0377777777       041400407       FreeBSD/i386
->20    lelong                  <4096
->>3    byte&0xC0               &0x80           shared library
->>3    byte&0xC0               0x40            PIC object
->>3    byte&0xC0               0x00            object
->20    lelong                  >4095
->>3    byte&0x80               0x80            dynamically linked executable
->>3    byte&0x80               0x00            executable
->16    lelong                  >0              not stripped
-
-0      lelong&0377777777       041400410       FreeBSD/i386 pure
->20    lelong                  <4096
->>3    byte&0xC0               &0x80           shared library
->>3    byte&0xC0               0x40            PIC object
->>3    byte&0xC0               0x00            object
->20    lelong                  >4095
->>3    byte&0x80               0x80            dynamically linked executable
->>3    byte&0x80               0x00            executable
->16    lelong                  >0              not stripped
-
-0      lelong&0377777777       041400413       FreeBSD/i386 demand paged
->20    lelong                  <4096
->>3    byte&0xC0               &0x80           shared library
->>3    byte&0xC0               0x40            PIC object
->>3    byte&0xC0               0x00            object
->20    lelong                  >4095
->>3    byte&0x80               0x80            dynamically linked executable
->>3    byte&0x80               0x00            executable
->16    lelong                  >0              not stripped
-
-0      lelong&0377777777       041400314       FreeBSD/i386 compact demand paged
->20    lelong                  <4096
->>3    byte&0xC0               &0x80           shared library
->>3    byte&0xC0               0x40            PIC object
->>3    byte&0xC0               0x00            object
->20    lelong                  >4095
->>3    byte&0x80               0x80            dynamically linked executable
->>3    byte&0x80               0x00            executable
->16    lelong                  >0              not stripped
-
-# XXX gross hack to identify core files
-# cores start with a struct tss; we take advantage of the following:
-# byte 7:     highest byte of the kernel stack pointer, always 0xfe
-#      8/9:   kernel (ring 0) ss value, always 0x0010
-#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0
-#      28:    low order byte of the current PTD entry, always 0 since the
-#             PTD is page-aligned
-#
-7      string  \357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0        FreeBSD/i386 a.out core file
->1039  string  >\0     from '%s'
-
-# /var/run/ld.so.hints
-# What are you laughing about?
-0      lelong                  011421044151    ld.so hints file (Little Endian
->4     lelong                  >0              \b, version %d)
->4     belong                  <=0             \b)
-0      belong                  011421044151    ld.so hints file (Big Endian
->4     belong                  >0              \b, version %d)
->4     belong                  <=0             \b)
-
-#
-# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities
-#
-0      string  SCRSHOT_        scrshot(1) screenshot,
->8     byte    x               version %d,
->9     byte    2               %d bytes in header,
->>10   byte    x               %d chars wide by
->>11   byte    x               %d chars high
-
-#------------------------------------------------------------------------------
-# gcc:  file(1) magic for GCC special files
-#
-0      string          gpch            GCC precompiled header
-
-# The version field is annoying.  It's 3 characters, not zero-terminated.
->5     byte            x                       (version %c
->6     byte            x                       \b%c
->7     byte            x                       \b%c)
-
-# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
->4     byte            67                      for C
->4     byte            111                     for Objective C
->4     byte            43                      for C++
->4     byte            79                      for Objective C++
-
-#-----------------------------------------------------------------------------
-# natinst:  file(1) magic for National Instruments Code Files
-
-#
-# From <egamez@fcfm.buap.mx> Enrique Gámez-Flores
-# version 1
-# Many formats still missing, we use, for the moment LabVIEW
-# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing
-#
-0       string          RSRC            National Instruments,
-# Check if it's a LabVIEW File
->8      string          LV              LabVIEW File,
-# Check wich kind of file is
->>10    string          SB              Code Resource File, data
->>10    string          IN              Virtual Instrument Program, data
->>10    string          AR              VI Library, data
-# This is for Menu Libraries
->8      string          LMNULBVW        Portable File Names, data
-# This is for General Resources
->8      string          rsc             Resources File, data
-# This is for VXI Package
-0       string          VMAP            National Instruments, VXI File, data
-#------------------------------------------------------------------------------
-# nitpicker:  file(1) magic for Flowfiles.
-# From: Christian Jachmann <C.Jachmann@gmx.net> http://www.nitpicker.de
-0      string  NPFF    NItpicker Flow File 
->4     byte    x       V%d.
->5     byte    x       %d
->6     bedate  x       started: %s
->10    bedate  x       stopped: %s
->14    belong  x       Bytes: %u
->18    belong  x       Bytes1: %u
->22    belong  x       Flows: %u
->26    belong  x       Pkts: %u
-
-#------------------------------------------------------------------------------
-# typeset:  file(1) magic for other typesetting
-#
-0      string          Interpress/Xerox        Xerox InterPress data
->16    string          /                       (version
->>17   string          >\0                     %s)
-
-#------------------------------------------------------------------------------
-# commands:  file(1) magic for various shells and interpreters
-#
-0      string          :                       shell archive or script for antique kernel text
-0      string/b        #!\ /bin/sh             Bourne shell script text executable
-0      string/b        #!\ /bin/csh            C shell script text executable
-# korn shell magic, sent by George Wu, gwu@clyde.att.com
-0      string/b        #!\ /bin/ksh            Korn shell script text executable
-0      string/b        #!\ /bin/tcsh           Tenex C shell script text executable
-0      string/b        #!\ /usr/local/tcsh     Tenex C shell script text executable
-0      string/b        #!\ /usr/local/bin/tcsh Tenex C shell script text executable
-
-#
-# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson)
-0      string/b        #!\ /bin/zsh            Paul Falstad's zsh script text executable
-0      string/b        #!\ /usr/bin/zsh        Paul Falstad's zsh script text executable
-0      string/b        #!\ /usr/local/bin/zsh  Paul Falstad's zsh script text executable
-0      string/b        #!\ /usr/local/bin/ash  Neil Brown's ash script text executable
-0      string/b        #!\ /usr/local/bin/ae   Neil Brown's ae script text executable
-0      string/b        #!\ /bin/nawk           new awk script text executable
-0      string/b        #!\ /usr/bin/nawk       new awk script text executable
-0      string/b        #!\ /usr/local/bin/nawk new awk script text executable
-0      string/b        #!\ /bin/gawk           GNU awk script text executable
-0      string/b        #!\ /usr/bin/gawk       GNU awk script text executable
-0      string/b        #!\ /usr/local/bin/gawk GNU awk script text executable
-#
-0      string/b        #!\ /bin/awk            awk script text executable
-0      string/b        #!\ /usr/bin/awk        awk script text executable
-0      string          BEGIN                   awk script text
-
-# AT&T Bell Labs' Plan 9 shell
-0      string/b        #!\ /bin/rc     Plan 9 rc shell script text executable
-
-# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de)
-0      string/b        #!\ /bin/bash   Bourne-Again shell script text executable
-0      string/b        #!\ /usr/local/bin/bash Bourne-Again shell script text executable
-
-# using env
-0      string          #!/usr/bin/env          a
->15    string          >\0                     %s script text executable
-0      string          #!\ /usr/bin/env        a
->16    string          >\0                     %s script text executable
-
-# PHP scripts
-# Ulf Harnhammar <ulfh@update.uu.se>
-0      string/c        =<?php                  PHP script text
-0      string          =<?\n                   PHP script text
-0      string          =<?\r                   PHP script text
-0      string/b        #!\ /usr/local/bin/php  PHP script text executable
-0      string/b        #!\ /usr/bin/php        PHP script text executable
-
-0      string          Zend\x00                PHP script Zend Optimizer data
-
-#------------------------------------------------------------------------------
-# encore:  file(1) magic for Encore machines
-#
-# XXX - needs to have the byte order specified (NS32K was little-endian,
-# dunno whether they run the 88K in little-endian mode or not).
-#
-0      short           0x154           Encore
->20    short           0x107           executable
->20    short           0x108           pure executable
->20    short           0x10b           demand-paged executable
->20    short           0x10f           unsupported executable
->12    long            >0              not stripped
->22    short           >0              - version %ld
->22    short           0               -
-#>4    date            x               stamp %s
-0      short           0x155           Encore unsupported executable
->12    long            >0              not stripped
->22    short           >0              - version %ld
->22    short           0               -
-#>4    date            x               stamp %s
-
-#------------------------------------------------------------------------------
-# filesystems:  file(1) magic for different filesystems
-#
-0      string  \366\366\366\366        PC formatted floppy with no filesystem
-# Sun disk labels
-# From /usr/include/sun/dklabel.h:
-0774   beshort         0xdabe          Sun disk label
->0     string          x               '%s
->>31   string          >\0             \b%s
->>>63          string          >\0             \b%s
->>>>95         string          >\0             \b%s
->0     string          x               \b'
->0734  short           >0              %d rpm,
->0736  short           >0              %d phys cys,
->0740  short           >0              %d alts/cyl,
->0746  short           >0              %d interleave,
->0750  short           >0              %d data cyls,
->0752  short           >0              %d alt cyls,
->0754  short           >0              %d heads/partition,
->0756  short           >0              %d sectors/track,
->0764  long            >0              start cyl %ld,
->0770  long            x               %ld blocks
-# Is there a boot block written 1 sector in?
->512    belong&077777777       0600407 \b, boot block present
-0x1FE  leshort 0xAA55                  x86 boot sector
->2     string  OSBS                    \b, OS/BS MBR
-# J\xf6rg Jenderek <joerg.jenderek@gmx.net>
->0x8C  string  Invalid\ partition\ table       \b, MS-DOS MBR
->0x9D  string  Invalid\ partition\ table       \b, DR-DOS MBR, version 7.01 to 7.03
->0x10F string  Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
->0x8B  string  Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 5.00 to 4.00.950
->0x145 string  Default:\ F                     \b, FREE-DOS MBR
->0     string  \0\0\0\0                \b, extended partition table
-# JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
-# older drives may use E9 xx xx
->0             lelong&0x009000EB       0x009000EB 
->0             lelong&0x000000E9       0x000000E9 
->>1            ubyte                   >37     \b, code offset 0x%x
-# mtools-3.9.8/msdos.h
-# usual values are marked with comments to get only informations of strange FAT systems
-# valid sectorsize are from 32 to 2048
->>>11          uleshort        <2049   
->>>>11         uleshort        >31     
->>>>>3         string          >\0             \b, OEM-ID "%8.8s"
->>>>>11                uleshort        >512            \b, Bytes/sector %u
-#>>>>>11       uleshort        =512            \b, Bytes/sector %u=512 (usual)
->>>>>11                uleshort        <512            \b, Bytes/sector %u
->>>>>13                ubyte           >1              \b, sectors/cluster %u
-#>>>>>13       ubyte           =1              \b, sectors/cluster %u (usual on Floppies)
->>>>>14                uleshort        >32             \b, reserved sectors %u
-#>>>>>14       uleshort        =32             \b, reserved sectors %u (usual Fat32)
-#>>>>>14       uleshort        >1              \b, reserved sectors %u
-#>>>>>14       uleshort        =1              \b, reserved sectors %u (usual FAT12,FAT16)
->>>>>14                uleshort        <1              \b, reserved sectors %u
->>>>>16                ubyte           >2              \b, FATs %u
-#>>>>>16       ubyte           =2              \b, FATs %u (usual)
->>>>>16                ubyte           =1              \b, FAT  %u
->>>>>16                ubyte           >0
->>>>>17                uleshort        >0              \b, root entries %u
-#>>>>>17       uleshort        =0              \b, root entries %u=0 (usual Fat32)
->>>>>19                uleshort        >0              \b, sectors %u (volumes <=32 MB) 
-#>>>>>19       uleshort        =0              \b, sectors %u=0 (usual Fat32)
->>>>>21                ubyte           >0xF0           \b, Media descriptor 0x%x
-#>>>>>21       ubyte           =0xF0           \b, Media descriptor 0x%x (usual floppy)
->>>>>21                ubyte           <0xF0           \b, Media descriptor 0x%x
->>>>>22                uleshort        >0              \b, sectors/FAT %u
-#>>>>>22       uleshort        =0              \b, sectors/FAT %u=0 (usual Fat32)
->>>>>26                ubyte           >2              \b, heads %u
-#>>>>>26       ubyte           =2              \b, heads %u (usual floppy)
->>>>>26                ubyte           =1              \b, heads %u
->>>>>28                ulelong         >0              \b, hidden sectors %u
-#>>>>>28       ulelong         =0              \b, hidden sectors %u (usual floppy)
->>>>>32                ulelong         >0              \b, sectors %u (volumes > 32 MB) 
-#>>>>>32       ulelong         =0              \b, sectors %u (volumes > 32 MB) 
-# FAT<32 specific 
-# NOT le FAT3=NOT 3TAF=0xCCABBEB9
->>>>>82                ulelong&0xCCABBEB9      >0
->>>>>>36       ubyte           >0x80           \b, physical drive 0x%x
-#>>>>>>36      ubyte           =0x80           \b, physical drive 0x%x=0x80 (usual harddisk)
->>>>>>36       ubyte&0x7F      >0              \b, physical drive 0x%x
-#>>>>>>36      ubyte           =0              \b, physical drive 0x%x=0 (usual floppy)
->>>>>>37       ubyte           >0              \b, reserved 0x%x
-#>>>>>>37      ubyte           =0              \b, reserved 0x%x
->>>>>>38       ubyte           >0x29           \b, dos < 4.0 BootSector (0x%x)
->>>>>>38       ubyte           <0x29           \b, dos < 4.0 BootSector (0x%x)
->>>>>>38       ubyte           =0x29
->>>>>>>39      ulelong         x               \b, serial number 0x%x
->>>>>>>43      string          <NO\ NAME       \b, label: "%11.11s"
->>>>>>>43      string          >NO\ NAME       \b, label: "%11.11s"
->>>>>>>43      string          =NO\ NAME       \b, unlabeled
->>>>>>54       string          FAT1            \b, FAT
->>>>>>>54      string          FAT12           \b (12 bit)
->>>>>>>54      string          FAT16           \b (16 bit)
-# FAT32 specific
->>>>>82                string          FAT32           \b, FAT (32 bit)
->>>>>>36       ulelong         x               \b, sectors/FAT %u
->>>>>>40       uleshort        >0              \b, extension flags %u
-#>>>>>>40      uleshort        =0              \b, extension flags %u
->>>>>>42       uleshort        >0              \b, fsVersion %u
-#>>>>>>42      uleshort        =0              \b, fsVersion %u (usual)
->>>>>>44       ulelong         >2              \b, rootdir cluster %u
-#>>>>>>44      ulelong         =2              \b, rootdir cluster %u
-#>>>>>>44      ulelong         =1              \b, rootdir cluster %u
->>>>>>48       uleshort        >1              \b, infoSector %u
-#>>>>>>48      uleshort        =1              \b, infoSector %u (usual)
->>>>>>48       uleshort        <1              \b, infoSector %u
->>>>>>50       uleshort        >6              \b, Backup boot sector %u
-#>>>>>>50      uleshort        =6              \b, Backup boot sector %u (usual) 
->>>>>>50       uleshort        <6              \b, Backup boot sector %u
->>>>>>54       ulelong         >0              \b, reserved1 0x%x
->>>>>>58       ulelong         >0              \b, reserved2 0x%x
->>>>>>62       ulelong         >0              \b, reserved3 0x%x
-# same structure as FAT1X 
->>>>>>64       ubyte           >0x80           \b, physical drive 0x%x
-#>>>>>>64      ubyte           =0x80           \b, physical drive 0x%x=80 (usual harddisk)
->>>>>>64       ubyte&0x7F      >0              \b, physical drive 0x%x
-#>>>>>>64      ubyte           =0              \b, physical drive 0x%x=0 (usual floppy)
->>>>>>65       ubyte           >0              \b, reserved 0x%x
->>>>>>66       ubyte           >0x29           \b, dos < 4.0 BootSector (0x%x)
->>>>>>66       ubyte           <0x29           \b, dos < 4.0 BootSector (0x%x)
->>>>>>66       ubyte           =0x29
->>>>>>>67      ulelong         x               \b, serial number 0x%x
->>>>>>>71      string          <NO\ NAME       \b, label: "%11.11s"
->>>>>>71       string          >NO\ NAME       \b, label: "%11.11s"
->>>>>>71       string          =NO\ NAME       \b, unlabeled
-### FATs end
->0x200 lelong  0x82564557              \b, BSD disklabel
-# FATX 
-0              string          FATX            FATX filesystem data
-
-
-# Minix filesystems - Juan Cespedes <cespedes@debian.org>
-0x410  leshort         0x137f          Minix filesystem
-0x410  beshort         0x137f          Minix filesystem (big endian),
->0x402 beshort         !0              \b, %d zones
->0x1e  string          minix           \b, bootable
-0x410  leshort         0x138f          Minix filesystem, 30 char names
-0x410  leshort         0x2468          Minix filesystem, version 2
-0x410  leshort         0x2478          Minix filesystem, version 2, 30 char names
-
-# romfs filesystems - Juan Cespedes <cespedes@debian.org>
-0      string          -rom1fs-\0      romfs filesystem, version 1
->8     belong  x                       %d bytes,
->16    string  x                       named %s.
-
-# netboot image - Juan Cespedes <cespedes@debian.org>
-0      lelong          0x1b031336L     Netboot image,
->4     lelong&0xFFFFFF00       0
->>4    lelong&0x100    0x000           mode 2
->>4    lelong&0x100    0x100           mode 3
->4     lelong&0xFFFFFF00       !0      unknown mode
-
-0x18b  string  OS/2    OS/2 Boot Manager
-
-9564   lelong          0x00011954      Unix Fast File system (little-endian),
->8404  string          x               last mounted on %s,
-#>9504 ledate          x               last checked at %s,
->8224  ledate          x               last written at %s,
->8401  byte            x               clean flag %d,
->8228  lelong          x               number of blocks %d,
->8232  lelong          x               number of data blocks %d,
->8236  lelong          x               number of cylinder groups %d,
->8240  lelong          x               block size %d,
->8244  lelong          x               fragment size %d,
->8252  lelong          x               minimum percentage of free blocks %d,
->8256  lelong          x               rotational delay %dms,
->8260  lelong          x               disk rotational speed %drps,
->8320  lelong          0               TIME optimization
->8320  lelong          1               SPACE optimization
-
-9564   belong          0x00011954      Unix Fast File system (big-endian),
->7168   long           0x4c41424c      Apple UFS Volume
->>7186  string         x               named %s,
->>7176  belong         x               volume label version %d,
->>7180  bedate         x               created on %s,
->8404  string          x               last mounted on %s,
-#>9504 bedate          x               last checked at %s,
->8224  bedate          x               last written at %s,
->8401  byte            x               clean flag %d,
->8228  belong          x               number of blocks %d,
->8232  belong          x               number of data blocks %d,
->8236  belong          x               number of cylinder groups %d,
->8240  belong          x               block size %d,
->8244  belong          x               fragment size %d,
->8252  belong          x               minimum percentage of free blocks %d,
->8256  belong          x               rotational delay %dms,
->8260  belong          x               disk rotational speed %drps,
->8320  belong          0               TIME optimization
->8320  belong          1               SPACE optimization
-
-# ext2/ext3 filesystems - Andreas Dilger <adilger@turbolabs.com>
-0x438  leshort         0xEF53          Linux
->0x44c lelong          x               rev %d
->0x43e leshort         x               \b.%d
->0x45c lelong          ^0x0000004      ext2 filesystem data
->>0x43a        leshort         ^0x0000001      (mounted or unclean)
->0x45c lelong          &0x0000004      ext3 filesystem data
->>0x460        lelong          &0x0000004      (needs journal recovery)
->0x43a leshort         &0x0000002      (errors)
->0x460 lelong          &0x0000001      (compressed)
-#>0x460        lelong          &0x0000002      (filetype)
-#>0x464        lelong          &0x0000001      (sparse_super)
->0x464 lelong          &0x0000002      (large files)
-
-# SGI disk labels - Nathan Scott <nathans@debian.org>
-0      belong          0x0BE5A941      SGI disk label (volume header)
-
-# SGI XFS filesystem - Nathan Scott <nathans@debian.org>
-0      belong          0x58465342      SGI XFS filesystem data
->0x4   belong          x               (blksz %d,
->0x68  beshort         x               inosz %d,
->0x64  beshort         ^0x2004         v1 dirs)
->0x64  beshort         &0x2004         v2 dirs)
-
-############################################################################
-# Minix-ST kernel floppy
-0x800  belong          0x46fc2700      Atari-ST Minix kernel image
->19    string          \240\5\371\5\0\011\0\2\0        \b, 720k floppy
->19    string          \320\2\370\5\0\011\0\1\0        \b, 360k floppy
-
-############################################################################
-# Hmmm, is this a better way of detecting _standard_ floppy images ?
-19     string          \320\2\360\3\0\011\0\1\0        DOS floppy 360k
->0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
-19     string          \240\5\371\3\0\011\0\2\0        DOS floppy 720k
->0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
-19     string          \100\013\360\011\0\022\0\2\0    DOS floppy 1440k
->0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
-
-19     string          \240\5\371\5\0\011\0\2\0        DOS floppy 720k, IBM
->0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
-19     string          \100\013\371\5\0\011\0\2\0      DOS floppy 1440k, mkdosfs
->0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
-
-19     string          \320\2\370\5\0\011\0\1\0        Atari-ST floppy 360k
-19     string          \240\5\371\5\0\011\0\2\0        Atari-ST floppy 720k
-
-#  Valid media descriptor bytes for MS-DOS:
-#
-#     Byte   Capacity   Media Size and Type
-#     -------------------------------------------------
-#
-#     F0     2.88 MB    3.5-inch, 2-sided, 36-sector
-#     F0     1.44 MB    3.5-inch, 2-sided, 18-sector
-#     F9     720K       3.5-inch, 2-sided, 9-sector
-#     F9     1.2 MB     5.25-inch, 2-sided, 15-sector
-#     FD     360K       5.25-inch, 2-sided, 9-sector
-#     FF     320K       5.25-inch, 2-sided, 8-sector
-#     FC     180K       5.25-inch, 1-sided, 9-sector
-#     FE     160K       5.25-inch, 1-sided, 8-sector
-#     FE     250K       8-inch, 1-sided, single-density
-#     FD     500K       8-inch, 2-sided, single-density
-#     FE     1.2 MB     8-inch, 2-sided, double-density
-#     F8     -----      Fixed disk 
-#
-#     FC     xxxK       Apricot 70x1x9 boot disk.
-#
-# Originally a bitmap:
-#  xxxxxxx0    Not two sided
-#  xxxxxxx1    Double sided
-#  xxxxxx0x    Not 8 SPT
-#  xxxxxx1x    8 SPT
-#  xxxxx0xx    Not Removable drive
-#  xxxxx1xx    Removable drive
-#  11111xxx    Must be one.
-#
-# But now it's rather random:
-#  111111xx    Low density disk
-#        00    SS, Not 8 SPT
-#        01    DS, Not 8 SPT
-#        10    SS, 8 SPT
-#        11    DS, 8 SPT
-#
-#  11111001    Double density 3½ floppy disk, high density 5¼
-#  11110000    High density 3½ floppy disk
-#  11111000    Hard disk any format
-#
-
-# CDROM Filesystems
-32769    string    CD001     ISO 9660 CD-ROM filesystem data
-# "application id" which appears to be used as a volume label
->32808  string    >\0       '%s'
->34816  string    \000CD001\001EL\ TORITO\ SPECIFICATION    (bootable)
-37633    string    CD001     ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
-32776    string    CDROM     High Sierra CD-ROM filesystem data
-
-# cramfs filesystem - russell@coker.com.au
-0       lelong    0x28cd3d45      Linux Compressed ROM File System data, little endian
->4      lelong  x size %d
->8      lelong  &1 version #2
->8      lelong  &2 sorted_dirs
->8      lelong  &4 hole_support
->32     lelong  x CRC 0x%x,
->36     lelong  x edition %d,
->40     lelong  x %d blocks,
->44     lelong  x %d files
-
-0       belong    0x28cd3d45      Linux Compressed ROM File System data, big endian
->4      belong  x size %d
->8      belong  &1 version #2
->8      belong  &2 sorted_dirs
->8      belong  &4 hole_support
->32     belong  x CRC 0x%x,
->36     belong  x edition %d,
->40     belong  x %d blocks,
->44     belong  x %d files
-
-# reiserfs - russell@coker.com.au
-0x10034                string  ReIsErFs        ReiserFS V3.5
-0x10034                string  ReIsEr2Fs       ReiserFS V3.6
->0x1002c       leshort x               block size %d
->0x10032       leshort &2              (mounted or unclean)
->0x10000       lelong  x               num blocks %d
->0x10040       lelong  1               tea hash
->0x10040       lelong  2               yura hash
->0x10040       lelong  3               r5 hash
-
-# JFFS - russell@coker.com.au
-0      lelong  0x34383931      Linux Journalled Flash File system, little endian
-0      belong  0x34383931      Linux Journalled Flash File system, big endian
-
-# EST flat binary format (which isn't, but anyway)
-# From: Mark Brown <broonie@sirena.org.uk>
-0      string  ESTFBINR        EST flat binary
-
-# Aculab VoIP firmware
-# From: Mark Brown <broonie@sirena.org.uk>
-0      string  VoIP\ Startup\ and      Aculab VoIP firmware
->35    string  x       format %s
-
-# PPCBoot image file
-# From: Mark Brown <broonie@sirena.org.uk>
-0      belong  0x27051956      PPCBoot image
->4     string  PPCBoot
->>12   string  x               version %s
-
-# JFFS2 file system
-0       leshort         0x1984                  Linux old jffs2 filesystem data little endian
-0       lelong          0xe0011985              Linux jffs2 filesystem data little endian
-
-#------------------------------------------------------------------------------
-# hp:  file(1) magic for Hewlett Packard machines (see also "printer")
-#
-# XXX - somebody should figure out whether any byte order needs to be
-# applied to the "TML" stuff; I'm assuming the Apollo stuff is
-# big-endian as it was mostly 68K-based.
-#
-# I think the 500 series was the old stack-based machines, running a
-# UNIX environment atop the "SUN kernel"; dunno whether it was
-# big-endian or little-endian.
-#
-# Daniel Quinlan (quinlan@yggdrasil.com): hp200 machines are 68010 based;
-# hp300 are 68020+68881 based; hp400 are also 68k.  The following basic
-# HP magic is useful for reference, but using "long" magic is a better
-# practice in order to avoid collisions.
-#
-# Guy Harris (guy@netapp.com): some additions to this list came from
-# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1,
-# 1.2, and 2.0).  The 1.2 and 2.0 stuff isn't in the HP-UX 10.0
-# "/etc/magic", though, except for the "archive file relocatable library"
-# stuff, and the 68030 and 68040 stuff isn't there at all - are they not
-# used in executables, or have they just not yet updated "/etc/magic"
-# completely?
-#
-# 0    beshort         200             hp200 (68010) BSD binary
-# 0    beshort         300             hp300 (68020+68881) BSD binary
-# 0    beshort         0x20c           hp200/300 HP-UX binary
-# 0    beshort         0x20d           hp400 (68030) HP-UX binary
-# 0    beshort         0x20e           hp400 (68040?) HP-UX binary
-# 0    beshort         0x20b           PA-RISC1.0 HP-UX binary
-# 0    beshort         0x210           PA-RISC1.1 HP-UX binary
-# 0    beshort         0x211           PA-RISC1.2 HP-UX binary
-# 0    beshort         0x214           PA-RISC2.0 HP-UX binary
-
-#
-# The "misc" stuff needs a byte order; the archives look suspiciously
-# like the old 177545 archives (0xff65 = 0177545).
-#
-#### Old Apollo stuff
-0      beshort         0627            Apollo m68k COFF executable
->18    beshort         ^040000         not stripped
->22    beshort         >0              - version %ld
-0      beshort         0624            apollo a88k COFF executable
->18    beshort         ^040000         not stripped
->22    beshort         >0              - version %ld
-0       long            01203604016     TML 0123 byte-order format
-0       long            01702407010     TML 1032 byte-order format
-0       long            01003405017     TML 2301 byte-order format
-0       long            01602007412     TML 3210 byte-order format
-#### PA-RISC 1.1
-0      belong          0x02100106      PA-RISC1.1 relocatable object
-0      belong          0x02100107      PA-RISC1.1 executable
->168   belong          &0x00000004     dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0      belong          0x02100108      PA-RISC1.1 shared executable
->168   belong&0x4      0x4             dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0      belong          0x0210010b      PA-RISC1.1 demand-load executable
->168   belong&0x4      0x4             dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0      belong          0x0210010e      PA-RISC1.1 shared library
->96    belong          >0              - not stripped
-
-0      belong          0x0210010d      PA-RISC1.1 dynamic load library
->96    belong          >0              - not stripped
-
-#### PA-RISC 2.0
-0      belong          0x02140106      PA-RISC2.0 relocatable object
-
-0       belong         0x02140107      PA-RISC2.0 executable
->168   belong          &0x00000004     dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0       belong         0x02140108      PA-RISC2.0 shared executable
->168   belong          &0x00000004     dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0       belong         0x0214010b      PA-RISC2.0 demand-load executable
->168   belong          &0x00000004     dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0       belong         0x0214010e      PA-RISC2.0 shared library
->96    belong          >0              - not stripped
-
-0       belong         0x0214010d      PA-RISC2.0 dynamic load library
->96    belong          >0              - not stripped
-
-#### 800
-0      belong          0x020b0106      PA-RISC1.0 relocatable object
-
-0      belong          0x020b0107      PA-RISC1.0 executable
->168   belong&0x4      0x4             dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0      belong          0x020b0108      PA-RISC1.0 shared executable
->168   belong&0x4      0x4             dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0      belong          0x020b010b      PA-RISC1.0 demand-load executable
->168   belong&0x4      0x4             dynamically linked
->(144) belong          0x054ef630      dynamically linked
->96    belong          >0              - not stripped
-
-0      belong          0x020b010e      PA-RISC1.0 shared library
->96    belong          >0              - not stripped
-
-0      belong          0x020b010d      PA-RISC1.0 dynamic load library
->96    belong          >0              - not stripped
-
-0      belong          0x213c6172      archive file
->68    belong          0x020b0619      - PA-RISC1.0 relocatable library
->68    belong          0x02100619      - PA-RISC1.1 relocatable library
->68    belong          0x02110619      - PA-RISC1.2 relocatable library
->68    belong          0x02140619      - PA-RISC2.0 relocatable library
-
-#### 500
-0      long            0x02080106      HP s500 relocatable executable
->16    long            >0              - version %ld
-
-0      long            0x02080107      HP s500 executable
->16    long            >0              - version %ld
-
-0      long            0x02080108      HP s500 pure executable
->16    long            >0              - version %ld
-
-#### 200
-0      belong          0x020c0108      HP s200 pure executable
->4     beshort         >0              - version %ld
->8     belong          &0x80000000     save fp regs
->8     belong          &0x40000000     dynamically linked
->8     belong          &0x20000000     debuggable
->36    belong          >0              not stripped
-
-0      belong          0x020c0107      HP s200 executable
->4     beshort         >0              - version %ld
->8     belong          &0x80000000     save fp regs
->8     belong          &0x40000000     dynamically linked
->8     belong          &0x20000000     debuggable
->36    belong          >0              not stripped
-
-0      belong          0x020c010b      HP s200 demand-load executable
->4     beshort         >0              - version %ld
->8     belong          &0x80000000     save fp regs
->8     belong          &0x40000000     dynamically linked
->8     belong          &0x20000000     debuggable
->36    belong          >0              not stripped
-
-0      belong          0x020c0106      HP s200 relocatable executable
->4     beshort         >0              - version %ld
->6     beshort         >0              - highwater %d
->8     belong          &0x80000000     save fp regs
->8     belong          &0x20000000     debuggable
->8     belong          &0x10000000     PIC
-
-0      belong          0x020a0108      HP s200 (2.x release) pure executable
->4     beshort         >0              - version %ld
->36    belong          >0              not stripped
-
-0      belong          0x020a0107      HP s200 (2.x release) executable
->4     beshort         >0              - version %ld
->36    belong          >0              not stripped
-
-0      belong          0x020c010e      HP s200 shared library
->4     beshort         >0              - version %ld
->6     beshort         >0              - highwater %d
->36    belong          >0              not stripped
-
-0      belong          0x020c010d      HP s200 dynamic load library
->4     beshort         >0              - version %ld
->6     beshort         >0              - highwater %d
->36    belong          >0              not stripped
-
-#### MISC
-0      long            0x0000ff65      HP old archive
-0      long            0x020aff65      HP s200 old archive
-0      long            0x020cff65      HP s200 old archive
-0      long            0x0208ff65      HP s500 old archive
-
-0      long            0x015821a6      HP core file
-
-0      long            0x4da7eee8      HP-WINDOWS font
->8     byte            >0              - version %ld
-0      string          Bitmapfile      HP Bitmapfile
-
-0      string          IMGfile CIS     compimg HP Bitmapfile
-# XXX - see "lif"
-#0     short           0x8000          lif file
-0      long            0x020c010c      compiled Lisp
-
-0      string          msgcat01        HP NLS message catalog,
->8     long            >0              %d messages
-
-# addendum to /etc/magic with HP-48sx file-types by phk@data.fls.dk 1jan92
-0      string          HPHP48-         HP48 binary
->7     byte            >0              - Rev %c
->8     beshort         0x1129          (ADR)
->8     beshort         0x3329          (REAL)
->8     beshort         0x5529          (LREAL)
->8     beshort         0x7729          (COMPLX)
->8     beshort         0x9d29          (LCOMPLX)
->8     beshort         0xbf29          (CHAR)
->8     beshort         0xe829          (ARRAY)
->8     beshort         0x0a2a          (LNKARRAY)
->8     beshort         0x2c2a          (STRING)
->8     beshort         0x4e2a          (HXS)
->8     beshort         0x742a          (LIST)
->8     beshort         0x962a          (DIR)
->8     beshort         0xb82a          (ALG)
->8     beshort         0xda2a          (UNIT)
->8     beshort         0xfc2a          (TAGGED)
->8     beshort         0x1e2b          (GROB)
->8     beshort         0x402b          (LIB)
->8     beshort         0x622b          (BACKUP)
->8     beshort         0x882b          (LIBDATA)
->8     beshort         0x9d2d          (PROG)
->8     beshort         0xcc2d          (CODE)
->8     beshort         0x482e          (GNAME)
->8     beshort         0x6d2e          (LNAME)
->8     beshort         0x922e          (XLIB)
-0      string          %%HP:           HP48 text
->6     string          T(0)            - T(0)
->6     string          T(1)            - T(1)
->6     string          T(2)            - T(2)
->6     string          T(3)            - T(3)
->10    string          A(D)            A(D)
->10    string          A(R)            A(R)
->10    string          A(G)            A(G)
->14    string          F(.)            F(.);
->14    string          F(,)            F(,);
-
-# hpBSD magic numbers
-0      beshort         200             hp200 (68010) BSD
->2     beshort         0407            impure binary
->2     beshort         0410            read-only binary
->2     beshort         0413            demand paged binary
-0      beshort         300             hp300 (68020+68881) BSD
->2     beshort         0407            impure binary
->2     beshort         0410            read-only binary
->2     beshort         0413            demand paged binary
-#
-# From David Gero <dgero@nortelnetworks.com>
-# HP-UX 10.20 core file format from /usr/include/sys/core.h
-# Unfortunately, HP-UX uses corehead blocks without specifying the order
-# There are four we care about:
-#     CORE_KERNEL, which starts with the string "HP-UX"
-#     CORE_EXEC, which contains the name of the command
-#     CORE_PROC, which contains the signal number that caused the core dump
-#     CORE_FORMAT, which contains the version of the core file format (== 1)
-# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
-# but we include all 6 variations of the order of the first 3, and
-# assume that PROC will always be last
-# Order 1: KERNEL, EXEC, FORMAT, PROC
-0x10           string  HP-UX
->0             belong  2
->>0xC          belong  0x3C
->>>0x4C                belong  0x100
->>>>0x58       belong  0x44
->>>>>0xA0      belong  1
->>>>>>0xAC     belong  4
->>>>>>>0xB0    belong  1
->>>>>>>>0xB4   belong  4               core file
->>>>>>>>>0x90  string  >\0             from '%s'
->>>>>>>>>0xC4  belong  3               - received SIGQUIT
->>>>>>>>>0xC4  belong  4               - received SIGILL
->>>>>>>>>0xC4  belong  5               - received SIGTRAP
->>>>>>>>>0xC4  belong  6               - received SIGABRT
->>>>>>>>>0xC4  belong  7               - received SIGEMT
->>>>>>>>>0xC4  belong  8               - received SIGFPE
->>>>>>>>>0xC4  belong  10              - received SIGBUS
->>>>>>>>>0xC4  belong  11              - received SIGSEGV
->>>>>>>>>0xC4  belong  12              - received SIGSYS
->>>>>>>>>0xC4  belong  33              - received SIGXCPU
->>>>>>>>>0xC4  belong  34              - received SIGXFSZ
-# Order 2: KERNEL, FORMAT, EXEC, PROC
->>>0x4C                belong  1
->>>>0x58       belong  4
->>>>>0x5C      belong  1
->>>>>>0x60     belong  0x100
->>>>>>>0x6C    belong  0x44
->>>>>>>>0xB4   belong  4               core file
->>>>>>>>>0xA4  string  >\0             from '%s'
->>>>>>>>>0xC4  belong  3               - received SIGQUIT
->>>>>>>>>0xC4  belong  4               - received SIGILL
->>>>>>>>>0xC4  belong  5               - received SIGTRAP
->>>>>>>>>0xC4  belong  6               - received SIGABRT
->>>>>>>>>0xC4  belong  7               - received SIGEMT
->>>>>>>>>0xC4  belong  8               - received SIGFPE
->>>>>>>>>0xC4  belong  10              - received SIGBUS
->>>>>>>>>0xC4  belong  11              - received SIGSEGV
->>>>>>>>>0xC4  belong  12              - received SIGSYS
->>>>>>>>>0xC4  belong  33              - received SIGXCPU
->>>>>>>>>0xC4  belong  34              - received SIGXFSZ
-# Order 3: FORMAT, KERNEL, EXEC, PROC
-0x24           string  HP-UX
->0             belong  1
->>0xC          belong  4
->>>0x10                belong  1
->>>>0x14       belong  2
->>>>>0x20      belong  0x3C
->>>>>>0x60     belong  0x100
->>>>>>>0x6C    belong  0x44
->>>>>>>>0xB4   belong  4               core file
->>>>>>>>>0xA4  string  >\0             from '%s'
->>>>>>>>>0xC4  belong  3               - received SIGQUIT
->>>>>>>>>0xC4  belong  4               - received SIGILL
->>>>>>>>>0xC4  belong  5               - received SIGTRAP
->>>>>>>>>0xC4  belong  6               - received SIGABRT
->>>>>>>>>0xC4  belong  7               - received SIGEMT
->>>>>>>>>0xC4  belong  8               - received SIGFPE
->>>>>>>>>0xC4  belong  10              - received SIGBUS
->>>>>>>>>0xC4  belong  11              - received SIGSEGV
->>>>>>>>>0xC4  belong  12              - received SIGSYS
->>>>>>>>>0xC4  belong  33              - received SIGXCPU
->>>>>>>>>0xC4  belong  34              - received SIGXFSZ
-# Order 4: EXEC, KERNEL, FORMAT, PROC
-0x64           string  HP-UX
->0             belong  0x100
->>0xC          belong  0x44
->>>0x54                belong  2
->>>>0x60       belong  0x3C
->>>>>0xA0      belong  1
->>>>>>0xAC     belong  4
->>>>>>>0xB0    belong  1
->>>>>>>>0xB4   belong  4               core file
->>>>>>>>>0x44  string  >\0             from '%s'
->>>>>>>>>0xC4  belong  3               - received SIGQUIT
->>>>>>>>>0xC4  belong  4               - received SIGILL
->>>>>>>>>0xC4  belong  5               - received SIGTRAP
->>>>>>>>>0xC4  belong  6               - received SIGABRT
->>>>>>>>>0xC4  belong  7               - received SIGEMT
->>>>>>>>>0xC4  belong  8               - received SIGFPE
->>>>>>>>>0xC4  belong  10              - received SIGBUS
->>>>>>>>>0xC4  belong  11              - received SIGSEGV
->>>>>>>>>0xC4  belong  12              - received SIGSYS
->>>>>>>>>0xC4  belong  33              - received SIGXCPU
->>>>>>>>>0xC4  belong  34              - received SIGXFSZ
-# Order 5: FORMAT, EXEC, KERNEL, PROC
-0x78           string  HP-UX
->0             belong  1
->>0xC          belong  4
->>>0x10                belong  1
->>>>0x14       belong  0x100
->>>>>0x20      belong  0x44
->>>>>>0x68     belong  2
->>>>>>>0x74    belong  0x3C
->>>>>>>>0xB4   belong  4               core file
->>>>>>>>>0x58  string  >\0             from '%s'
->>>>>>>>>0xC4  belong  3               - received SIGQUIT
->>>>>>>>>0xC4  belong  4               - received SIGILL
->>>>>>>>>0xC4  belong  5               - received SIGTRAP
->>>>>>>>>0xC4  belong  6               - received SIGABRT
->>>>>>>>>0xC4  belong  7               - received SIGEMT
->>>>>>>>>0xC4  belong  8               - received SIGFPE
->>>>>>>>>0xC4  belong  10              - received SIGBUS
->>>>>>>>>0xC4  belong  11              - received SIGSEGV
->>>>>>>>>0xC4  belong  12              - received SIGSYS
->>>>>>>>>0xC4  belong  33              - received SIGXCPU
->>>>>>>>>0xC4  belong  34              - received SIGXFSZ
-# Order 6: EXEC, FORMAT, KERNEL, PROC
->0             belong  0x100
->>0xC          belong  0x44
->>>0x54                belong  1
->>>>0x60       belong  4
->>>>>0x64      belong  1
->>>>>>0x68     belong  2
->>>>>>>0x74    belong  0x2C
->>>>>>>>0xB4   belong  4               core file
->>>>>>>>>0x44  string  >\0             from '%s'
->>>>>>>>>0xC4  belong  3               - received SIGQUIT
->>>>>>>>>0xC4  belong  4               - received SIGILL
->>>>>>>>>0xC4  belong  5               - received SIGTRAP
->>>>>>>>>0xC4  belong  6               - received SIGABRT
->>>>>>>>>0xC4  belong  7               - received SIGEMT
->>>>>>>>>0xC4  belong  8               - received SIGFPE
->>>>>>>>>0xC4  belong  10              - received SIGBUS
->>>>>>>>>0xC4  belong  11              - received SIGSEGV
->>>>>>>>>0xC4  belong  12              - received SIGSYS
->>>>>>>>>0xC4  belong  33              - received SIGXCPU
->>>>>>>>>0xC4  belong  34              - received SIGXFSZ
-
-# From: AMAKAWA Shuhei <sa264@cam.ac.uk>
-0      string  HPHP49-                 HP49 binary
-
-
-#------------------------------------------------------------------------------
-# JPEG images
-# SunOS 5.5.1 had
-#
-#      0       string          \377\330\377\340        JPEG file
-#      0       string          \377\330\377\356        JPG file
-#
-# both of which turn into "JPEG image data" here.
-#
-0      beshort         0xffd8          JPEG image data
->6     string          JFIF            \b, JFIF standard
-# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
-# in a vain attempt to add image size reporting for JFIF.  Note that these
-# tests are not fool-proof since some perfectly valid JPEGs are currently
-# impossible to specify in magic(4) format.
-# First, a little JFIF version info:
->>11   byte            x               \b %d.
->>12   byte            x               \b%02d
-# Next, the resolution or aspect ratio of the image:
-#>>13  byte            0               \b, aspect ratio
-#>>13  byte            1               \b, resolution (DPI)
-#>>13  byte            2               \b, resolution (DPCM)
-#>>4   beshort         x               \b, segment length %d
-# Next, show thumbnail info, if it exists:
->>18   byte            !0              \b, thumbnail %dx
->>>19  byte            x               \b%d
-
-# EXIF moved down here to avoid reporting a bogus version number,
-# and EXIF version number printing added.
-#   - Patrik R=E5dman <patrik+file-magic@iki.fi>
->6     string          Exif            \b, EXIF standard
-# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.
-# All possible combinations of entries have to be enumerated, since no looping
-# is possible. And both endians are possible...
-# The combinations included below are from real-world JPEGs.
-# Little-endian
->>12   string          II              
-# IFD 0 Entry #5:
->>>70  leshort         0x8769          
-# EXIF IFD Entry #1:
->>>>(78.l+14)  leshort 0x9000          
->>>>>(78.l+23) byte    x               %c
->>>>>(78.l+24) byte    x               \b.%c
->>>>>(78.l+25) byte    !0x30           \b%c
-# IFD 0 Entry #9:
->>>118 leshort         0x8769          
-# EXIF IFD Entry #3:
->>>>(126.l+38) leshort 0x9000          
->>>>>(126.l+47)        byte    x               %c
->>>>>(126.l+48)        byte    x               \b.%c
->>>>>(126.l+49)        byte    !0x30           \b%c
-# IFD 0 Entry #10
->>>130 leshort         0x8769          
-# EXIF IFD Entry #3:
->>>>(138.l+38) leshort 0x9000          
->>>>>(138.l+47)        byte    x               %c
->>>>>(138.l+48)        byte    x               \b.%c
->>>>>(138.l+49)        byte    !0x30           \b%c
-# EXIF IFD Entry #4:
->>>>(138.l+50) leshort 0x9000          
->>>>>(138.l+59)        byte    x               %c
->>>>>(138.l+60)        byte    x               \b.%c
->>>>>(138.l+61)        byte    !0x30           \b%c
-# EXIF IFD Entry #5:
->>>>(138.l+62) leshort 0x9000          
->>>>>(138.l+71)        byte    x               %c
->>>>>(138.l+72)        byte    x               \b.%c
->>>>>(138.l+73)        byte    !0x30           \b%c
-# IFD 0 Entry #11
->>>142 leshort         0x8769          
-# EXIF IFD Entry #3:
->>>>(150.l+38) leshort 0x9000          
->>>>>(150.l+47)        byte    x               %c
->>>>>(150.l+48)        byte    x               \b.%c
->>>>>(150.l+49)        byte    !0x30           \b%c
-# EXIF IFD Entry #4:
->>>>(150.l+50) leshort 0x9000          
->>>>>(150.l+59)        byte    x               %c
->>>>>(150.l+60)        byte    x               \b.%c
->>>>>(150.l+61)        byte    !0x30           \b%c
-# EXIF IFD Entry #5:
->>>>(150.l+62) leshort 0x9000          
->>>>>(150.l+71)        byte    x               %c
->>>>>(150.l+72)        byte    x               \b.%c
->>>>>(150.l+73)        byte    !0x30           \b%c
-# Big-endian
->>12   string          MM              
-# IFD 0 Entry #9:
->>>118 beshort         0x8769          
-# EXIF IFD Entry #1:
->>>>(126.L+14) beshort 0x9000          
->>>>>(126.L+23)        byte    x               %c
->>>>>(126.L+24)        byte    x               \b.%c
->>>>>(126.L+25)        byte    !0x30           \b%c
-# EXIF IFD Entry #3:
->>>>(126.L+38) beshort 0x9000          
->>>>>(126.L+47)        byte    x               %c
->>>>>(126.L+48)        byte    x               \b.%c
->>>>>(126.L+49)        byte    !0x30           \b%c
-# IFD 0 Entry #10
->>>130 beshort         0x8769          
-# EXIF IFD Entry #3:
->>>>(138.L+38) beshort 0x9000          
->>>>>(138.L+47)        byte    x               %c
->>>>>(138.L+48)        byte    x               \b.%c
->>>>>(138.L+49)        byte    !0x30           \b%c
-# EXIF IFD Entry #5:
->>>>(138.L+62) beshort 0x9000          
->>>>>(138.L+71)        byte    x               %c
->>>>>(138.L+72)        byte    x               \b.%c
->>>>>(138.L+73)        byte    !0x30           \b%c
-# IFD 0 Entry #11
->>>142 beshort         0x8769          
-# EXIF IFD Entry #4:
->>>>(150.L+50) beshort 0x9000          
->>>>>(150.L+59)        byte    x               %c
->>>>>(150.L+60)        byte    x               \b.%c
->>>>>(150.L+61)        byte    !0x30           \b%c
-# Here things get sticky.  We can do ONE MORE marker segment with
-# indirect addressing, and that's all.  It would be great if we could
-# do pointer arithemetic like in an assembler language.  Christos?
-# And if there was some sort of looping construct to do searches, plus a few
-# named accumulators, it would be even more effective...
-# At least we can show a comment if no other segments got inserted before:
->(4.S+5)       byte            0xFE
->>(4.S+8)      string          >\0             \b, comment: "%s"
-#>(4.S+5)      byte            0xFE            \b, comment
-#>>(4.S+6)     beshort         x               \b length=%d
-#>>(4.S+8)     string          >\0             \b, "%s"
-# Or, we can show the encoding type (I've included only the three most common)
-# and image dimensions if we are lucky and the SOFn (image segment) is here:
->(4.S+5)       byte            0xC0            \b, baseline
->>(4.S+6)      byte            x               \b, precision %d
->>(4.S+7)      beshort         x               \b, %dx
->>(4.S+9)      beshort         x               \b%d
->(4.S+5)       byte            0xC1            \b, extended sequential
->>(4.S+6)      byte            x               \b, precision %d
->>(4.S+7)      beshort         x               \b, %dx
->>(4.S+9)      beshort         x               \b%d
->(4.S+5)       byte            0xC2            \b, progressive
->>(4.S+6)      byte            x               \b, precision %d
->>(4.S+7)      beshort         x               \b, %dx
->>(4.S+9)      beshort         x               \b%d
-# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
-#>(4.S+5)      byte            0xDB            \b, quantisation table
-#>>(4.S+6)     beshort         x               \b length=%d
-#>14   beshort         x               \b, %d x
-#>16   beshort         x               \b %d
-
-# HSI is Handmade Software's proprietary JPEG encoding scheme
-0      string          hsi1            JPEG image data, HSI proprietary
-
-# From: David Santinoli <david@santinoli.com>
-0      string          \x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A        JPEG 2000 image data
-
-#------------------------------------------------------------------------------
-# sinclair:  file(1) sinclair QL
-
-# additions to /etc/magic by Thomas M. Ott (ThMO)
-
-# Sinclair QL floppy disk formats (ThMO)
-0      string  =QL5            QL disk dump data,
->3     string  =A              720 KB,
->3     string  =B              1.44 MB,
->3     string  =C              3.2 MB,
->4     string  >\0             label:%.10s
-
-# Sinclair QL OS dump (ThMO)
-# (NOTE: if `file' would be able to use indirect references in a endian format
-#       differing from the natural host format, this could be written more
-#       reliably and faster...)
-#
-# we *can't* lookup QL OS code dumps, because `file' is UNABLE to read more
-# than the first 8K of a file... #-(
-#
-#0             belong  =0x30000
-#>49124                belong  <47104
-#>>49128               belong  <47104
-#>>>49132      belong  <47104
-#>>>>49136     belong  <47104  QL OS dump data,
-#>>>>>49148    string  >\0     type %.3s,
-#>>>>>49142    string  >\0     version %.4s
-
-# Sinclair QL firmware executables (ThMO)
-0      string  NqNqNq`\004     QL firmware executable (BCPL)
-
-# Sinclair QL libraries (was ThMO)
-0      beshort 0xFB01          QDOS object
->2     pstring x               '%s'
-
-# Sinclair QL executables (was ThMO)
-4      belong  0x4AFB          QDOS executable
->9     pstring x               '%s'
-
-# Sinclair QL ROM (ThMO)
-0      belong  =0x4AFB0001     QL plugin-ROM data,
->9     pstring =\0             un-named
->9     pstring >\0             named: %s
-#------------------------------------------------------------------------------
-# acorn:  file(1) magic for files found on Acorn systems
-#
-
-# RISC OS Chunk File Format
-# From RISC OS Programmer's Reference Manual, Appendix D
-# We guess the file type from the type of the first chunk.
-0      lelong          0xc3cbc6c5      RISC OS Chunk data
->12    string          OBJ_            \b, AOF object
->12    string          LIB_            \b, ALF library
-
-# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
-16     lelong          0xef000011      RISC OS AIF executable
-
-# RISC OS Draw files
-# From RISC OS Programmer's Reference Manual, Appendix E
-0      string          Draw            RISC OS Draw file data
-
-# RISC OS new format font files
-# From RISC OS Programmer's Reference Manual, Appendix E
-0      string          FONT\0          RISC OS outline font data,
->5     byte            x               version %d
-0      string          FONT\1          RISC OS 1bpp font data,
->5     byte            x               version %d
-0      string          FONT\4          RISC OS 4bpp font data
->5     byte            x               version %d
-
-# RISC OS Music files
-# From RISC OS Programmer's Reference Manual, Appendix E
-0      string          Maestro\r       RISC OS music file
->8     byte            x               version %d
-
-
-#------------------------------------------------------------------------------
-# iff: file(1) magic for Interchange File Format (see also "audio" & "images")
-#
-# Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic
-# Arts for file interchange.  It has also been used by Apple, SGI, and
-# especially Commodore-Amiga.
-#
-# IFF files begin with an 8 byte FORM header, followed by a 4 character
-# FORM type, which is followed by the first chunk in the FORM.
-
-0      string          FORM            IFF data
-#>4    belong          x               \b, FORM is %d bytes long
-# audio formats
->8     string          AIFF            \b, AIFF audio
->8     string          AIFC            \b, AIFF-C compressed audio
->8     string          8SVX            \b, 8SVX 8-bit sampled sound voice
->8     string          SAMP            \b, SAMP sampled audio
->8     string          DTYP            \b, DTYP datatype description
->8     string          PTCH            \b, PTCH binary patch
-# image formats
->8     string          ILBMBMHD        \b, ILBM interleaved image
->>20   beshort         x               \b, %d x
->>22   beshort         x               %d
->8     string          RGBN            \b, RGBN 12-bit RGB image
->8     string          RGB8            \b, RGB8 24-bit RGB image
->8     string          DR2D            \b, DR2D 2-D object
->8     string          TDDD            \b, TDDD 3-D rendering
-# other formats
->8     string          FTXT            \b, FTXT formatted text
->8     string          CTLG            \b, CTLG message catalog
->8     string          PREF            \b, PREF preferences
-
-#------------------------------------------------------------------------------
-# lif:  file(1) magic for lif
-#
-# (Daniel Quinlan <quinlan@yggdrasil.com>)
-#
-0      beshort         0x8000          lif file
-
-#------------------------------------------------------------------------------
-# mirage:  file(1) magic for Mirage executables
-#
-# XXX - byte order?
-#
-0      long    31415           Mirage Assembler m.out executable
-
-#------------------------------------------------------------------------------
-# netscape:  file(1) magic for Netscape files
-# "H. Nanosecond" <aldomel@ix.netcom.com>
-# version 3 and 4 I think
-#
-
-# Netscape Address book  .nab
-0      string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book
-
-# Netscape Communicator address book
-0   string   \000\017\102\111 Netscape Communicator address book
-
-# .snm Caches
-0      string          #\ Netscape\ folder\ cache      Netscape folder cache
-0      string  \000\036\204\220\000    Netscape folder cache
-# .n2p 
-# Net 2 Phone 
-#0     string  123\130\071\066\061\071\071\071\060\070\061\060\061\063\060
-0      string  SX961999        Net2phone
-
-#
-#This is files ending in .art, FIXME add more rules
-0       string          JG\004\016\0\0\0\0      ART
-
-#------------------------------------------------------------------------------
-# olf:  file(1) magic for OLF executables
-#
-# We have to check the byte order flag to see what byte order all the
-# other stuff in the header is in.
-#
-# MIPS R3000 may also be for MIPS R2000.
-# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
-#
-# Created by Erik Theisen <etheisen@openbsd.org>
-# Based on elf from Daniel Quinlan <quinlan@yggdrasil.com>
-0      string          \177OLF         OLF
->4     byte            0               invalid class
->4     byte            1               32-bit
->4     byte            2               64-bit
->7     byte            0               invalid os
->7     byte            1               OpenBSD
->7     byte            2               NetBSD
->7     byte            3               FreeBSD
->7     byte            4               4.4BSD
->7     byte            5               Linux
->7     byte            6               SVR4
->7     byte            7               esix
->7     byte            8               Solaris
->7     byte            9               Irix
->7     byte            10              SCO
->7     byte            11              Dell
->7     byte            12              NCR
->5     byte            0               invalid byte order
->5     byte            1               LSB
->>16   leshort         0               no file type,
->>16   leshort         1               relocatable,
->>16   leshort         2               executable,
->>16   leshort         3               shared object,
-# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
-# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
->>16   leshort         4               core file
->>>(0x38+0xcc) string  >\0             of '%s'
->>>(0x38+0x10) lelong  >0              (signal %d),
->>16   leshort         &0xff00         processor-specific,
->>18   leshort         0               no machine,
->>18   leshort         1               AT&T WE32100 - invalid byte order,
->>18   leshort         2               SPARC - invalid byte order,
->>18   leshort         3               Intel 80386,
->>18   leshort         4               Motorola 68000 - invalid byte order,
->>18   leshort         5               Motorola 88000 - invalid byte order,
->>18   leshort         6               Intel 80486,
->>18   leshort         7               Intel 80860,
->>18   leshort         8               MIPS R3000_BE - invalid byte order,
->>18   leshort         9               Amdahl - invalid byte order,
->>18   leshort         10              MIPS R3000_LE,
->>18   leshort         11              RS6000 - invalid byte order,
->>18   leshort         15              PA-RISC - invalid byte order,
->>18   leshort         16              nCUBE,
->>18   leshort         17              VPP500,
->>18   leshort         18              SPARC32PLUS,
->>18   leshort         20              PowerPC,
->>18   leshort         0x9026          Alpha,
->>20   lelong          0               invalid version
->>20   lelong          1               version 1
->>36   lelong          1               MathCoPro/FPU/MAU Required
->8     string          >\0             (%s)
->5     byte            2               MSB
->>16   beshort         0               no file type,
->>16   beshort         1               relocatable,
->>16   beshort         2               executable,
->>16   beshort         3               shared object,
->>16   beshort         4               core file,
->>>(0x38+0xcc) string  >\0             of '%s'
->>>(0x38+0x10) belong  >0              (signal %d),
->>16   beshort         &0xff00         processor-specific,
->>18   beshort         0               no machine,
->>18   beshort         1               AT&T WE32100,
->>18   beshort         2               SPARC,
->>18   beshort         3               Intel 80386 - invalid byte order,
->>18   beshort         4               Motorola 68000,
->>18   beshort         5               Motorola 88000,
->>18   beshort         6               Intel 80486 - invalid byte order,
->>18   beshort         7               Intel 80860,
->>18   beshort         8               MIPS R3000_BE,
->>18   beshort         9               Amdahl,
->>18   beshort         10              MIPS R3000_LE - invalid byte order,
->>18   beshort         11              RS6000,
->>18   beshort         15              PA-RISC,
->>18   beshort         16              nCUBE,
->>18   beshort         17              VPP500,
->>18   beshort         18              SPARC32PLUS,
->>18   beshort         20              PowerPC or cisco 4500,
->>18   beshort         21              cisco 7500,
->>18   beshort         24              cisco SVIP,
->>18   beshort         25              cisco 7200,
->>18   beshort         36              cisco 12000,
->>18   beshort         0x9026          Alpha,
->>20   belong          0               invalid version
->>20   belong          1               version 1
->>36   belong          1               MathCoPro/FPU/MAU Required
-
-#------------------------------------------------------------------------------
-# VXL: file(1) magic for VXL binary IO data files
-#
-# from Ian Scott <scottim@sf.net>
-#
-# VXL is a collection of C++ libraries for Computer Vision.
-# See the vsl chapter in the VXL Book for more info
-# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html
-# http:/vxl.sf.net
-
-2      lelong  0x472b2c4e      VXL data file,
->0     leshort >0              schema version no %d
-
-#------------------------------------------------------------------------------
-# unknown:  file(1) magic for unknown machines
-#
-# XXX - this probably should be pruned, as it'll match PDP-11 and
-# VAX image formats.
-#
-# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
-# respectively).
-#
-# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
-# have the "version %ld", which may be a bogus COFFism (I don't think
-# there ever was COFF for the PDP-11).
-#
-# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
-# long, as it would be on a VAX.
-#
-# 0x10C is 0414 and 0x10E is 416; those *are* unknown.
-#
-0      short           0x107           unknown machine executable
->8     short           >0              not stripped
->15    byte            >0              - version %ld
-0      short           0x108           unknown pure executable
->8     short           >0              not stripped
->15    byte            >0              - version %ld
-0      short           0x109           PDP-11 separate I&D
->8     short           >0              not stripped
->15    byte            >0              - version %ld
-0      short           0x10b           unknown pure executable
->8     short           >0              not stripped
->15    byte            >0              - version %ld
-0      long            0x10c           unknown demand paged pure executable
->16    long            >0              not stripped
-0      long            0x10e           unknown readable demand paged pure executable
-
-#------------------------------------------------------------------------------
-# Hierarchical Data Format, used to facilitate scientific data exchange
-# specifications at http://hdf.ncsa.uiuc.edu/
-
-0      belong          0x0e031301      Hierarchical Data Format (version 4) data
-0      string          \211HDF\r\n\032 Hierarchical Data Format (version 5) data
-
-#------------------------------------------------------------------------------
-# mail.news:  file(1) magic for mail and news
-#
-# Unfortunately, saved netnews also has From line added in some news software.
-#0     string          From            mail text
-# There are tests to ascmagic.c to cope with mail and news.
-0      string          Relay-Version:  old news text
-0      string          #!\ rnews       batched news text
-0      string          N#!\ rnews      mailed, batched news text
-0      string          Forward\ to     mail forwarding text
-0      string          Pipe\ to        mail piping text
-0      string          Return-Path:    smtp mail text
-0      string          Path:           news text
-0      string          Xref:           news text
-0      string          From:           news or mail text
-0      string          Article         saved news text
-0      string          BABYL           Emacs RMAIL text
-0      string          Received:       RFC 822 mail text
-0      string          MIME-Version:   MIME entity text
-#0     string          Content-        MIME entity text
-
-# TNEF files...
-0      lelong          0x223E9F78      Transport Neutral Encapsulation Format
-
-# From: Kevin Sullivan <ksulliva@psc.edu>
-0      string          *mbx*           MBX mail folder
-
-# From: Simon Matter <simon.matter@invoca.ch>
-0      string          \241\002\213\015skiplist\ file\0\0\0    Cyrus skiplist DB
-
-# JAM(mbp) Fidonet message area databases
-# JHR file
-0      string  JAM\0                   JAM message area header file
->12    leshort >0                      (%d messages)
-
-# Squish Fidonet message area databases
-# SQD file (requires at least one message in the area)
-256    leshort 0xAFAE4453              Squish message area data file
->4     leshort >0                      (%d messages)
-#------------------------------------------------------------------------------
-# modem:  file(1) magic for modem programs
-#
-# From: Florian La Roche <florian@knorke.saar.de>
-4      string          Research,       Digifax-G3-File
->29    byte            1               , fine resolution
->29    byte            0               , normal resolution
-
-0      short           0x0100          raw G3 data, byte-padded
-0      short           0x1400          raw G3 data
-#
-# Magic data for vgetty voice formats
-# (Martin Seine & Marc Eberhard)
-
-#
-# raw modem data version 1
-#
-0    string    RMD1      raw modem data
->4   string    >\0       (%s /
->20  short     >0        compression type 0x%04x)
-
-#
-# portable voice format 1
-#
-0    string    PVF1\n         portable voice format
->5   string    >\0       (binary %s)
-
-#
-# portable voice format 2
-#
-0    string    PVF2\n         portable voice format
->5   string >\0          (ascii %s)
-
-
-#------------------------------------------------------------------------------
-# xwindows:  file(1) magic for various X/Window system file formats.
-
-# Compiled X Keymap 
-# XKM (compiled X keymap) files (including version and byte ordering)
-1      string  mkx                             Compiled XKB Keymap: lsb,
->0     byte    >0                              version %d
->0     byte    =0                              obsolete
-0      string  xkm                             Compiled XKB Keymap: msb,
->3     byte    >0                              version %d
->0     byte    =0                              obsolete
-
-# xfsdump archive
-0      string  xFSdump0                        xfsdump archive
->8     long    x       (version %d)
-
-# Jaleo XFS files
-0      long    395726                          Jaleo XFS file
->4     long    x                               - version %ld
->8     long    x                               - [%ld -
->20    long    x                               \b%ldx
->24    long    x                               \b%ldx
->28    long    1008                            \bYUV422]
->28    long    1000                            \bRGB24]
-
-#------------------------------------------------------------------------------
-# wordprocessors:  file(1) magic fo word processors.
-#
-####### PWP file format used on Smith Corona Personal Word Processors:
-2      string  \040\040\040\040\040\040\040\040\040\040\040ML4D\040\'92        Smith Corona PWP
->24    byte    2       \b, single spaced
->24    byte    3       \b, 1.5 spaced
->24    byte    4       \b, double spaced
->25    byte    0x42    \b, letter
->25    byte    0x54    \b, legal
->26    byte    0x46    \b, A4
-
-#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
-0      string  \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable text
->15    byte    0       Optimized for Intel
->15    byte    1       Optimized for Non-Intel
-1      string  WPC     (Corel/WP)
->8     short   257     WordPerfect macro
->8     short   258     WordPerfect help file
->8     short   259     WordPerfect keyboard file
->8     short   266     WordPerfect document
->8     short   267     WordPerfect dictionary
->8     short   268     WordPerfect thesaurus
->8     short   269     WordPerfect block
->8     short   270     WordPerfect rectangular block
->8     short   271     WordPerfect column block
->8     short   272     WordPerfect printer data
->8     short   275     WordPerfect printer data
->8     short   276     WordPerfect driver resource data
->8     short   279     WordPerfect hyphenation code
->8     short   280     WordPerfect hyphenation data
->8     short   281     WordPerfect macro resource data
->8     short   283     WordPerfect hyphenation lex
->8     short   285     WordPerfect wordlist
->8     short   286     WordPerfect equation resource data
->8     short   289     WordPerfect spell rules
->8     short   290     WordPerfect dictionary rules
->8     short   295     WordPerfect spell rules (Microlytics)
->8     short   299     WordPerfect settings file
->8     short   301     WordPerfect 4.2 document
->8     short   325     WordPerfect dialog file
->8     short   332     WordPerfect button bar
->8     short   513     Shell macro
->8     short   522     Shell definition
->8     short   769     Notebook macro
->8     short   770     Notebook help file
->8     short   771     Notebook keyboard file
->8     short   778     Notebook definition
->8     short   1026    Calculator help file
->8     short   1538    Calendar help file
->8     short   1546    Calendar data file
->8     short   1793    Editor macro
->8     short   1794    Editor help file
->8     short   1795    Editor keyboard file
->8     short   1817    Editor macro resource file
->8     short   2049    Macro editor macro
->8     short   2050    Macro editor help file
->8     short   2051    Macro editor keyboard file
->8     short   2305    PlanPerfect macro
->8     short   2306    PlanPerfect help file
->8     short   2307    PlanPerfect keyboard file
->8     short   2314    PlanPerfect worksheet
->8     short   2319    PlanPerfect printer definition
->8     short   2322    PlanPerfect graphic definition
->8     short   2323    PlanPerfect data
->8     short   2324    PlanPerfect temporary printer
->8     short   2329    PlanPerfect macro resource data
->8     byte    11      Mail
->8     short   2818    help file
->8     short   2821    distribution list
->8     short   2826    out box
->8     short   2827    in box
->8     short   2836    users archived mailbox
->8     short   2837    archived message database
->8     short   2838    archived attachments
->8     short   3083    Printer temporary file
->8     short   3330    Scheduler help file
->8     short   3338    Scheduler in file
->8     short   3339    Scheduler out file
->8     short   3594    GroupWise settings file
->8     short   3601    GroupWise directory services
->8     short   3627    GroupWise settings file
->8     short   4362    Terminal resource data
->8     short   4363    Terminal resource data
->8     short   4395    Terminal resource data
->8     short   4619    GUI loadable text
->8     short   4620    graphics resource data
->8     short   4621    printer settings file
->8     short   4622    port definition file
->8     short   4623    print queue parameters
->8     short   4624    compressed file
->8     short   5130    Network service msg file
->8     short   5131    Network service msg file
->8     short   5132    Async gateway login msg
->8     short   5134    GroupWise message file
->8     short   7956    GroupWise admin domain database
->8     short   7957    GroupWise admin host database
->8     short   7959    GroupWise admin remote host database
->8     short   7960    GroupWise admin ADS deferment data file
->8     short   8458    IntelliTAG (SGML) compiled DTD
->8     long    18219264        WordPerfect graphic image (1.0)
->8     long    18219520        WordPerfect graphic image (2.0)
-#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
-
-# Hangul (Korean) Word Processor File
-0      string  HWP\ Document\ File     Hangul (Korean) Word Processor File
-
-# CosmicBook, from Benoît Rouits
-0       string  CSBK    Ted Neslson's CosmicBook hypertext file
-
-
-#------------------------------------------------------------------------------
-# sun:  file(1) magic for Sun machines
-#
-# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
-# releases.  (5.x uses ELF.)
-#
-0      belong&077777777        0600413         sparc demand paged
->0     byte            &0x80
->>20   belong          <4096           shared library
->>20   belong          =4096           dynamically linked executable
->>20   belong          >4096           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-0      belong&077777777        0600410         sparc pure
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-0      belong&077777777        0600407         sparc
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-
-0      belong&077777777        0400413         mc68020 demand paged
->0     byte            &0x80
->>20   belong          <4096           shared library
->>20   belong          =4096           dynamically linked executable
->>20   belong          >4096           dynamically linked executable
->16    belong          >0              not stripped
-0      belong&077777777        0400410         mc68020 pure
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-0      belong&077777777        0400407         mc68020
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-
-0      belong&077777777        0200413         mc68010 demand paged
->0     byte            &0x80
->>20   belong          <4096           shared library
->>20   belong          =4096           dynamically linked executable
->>20   belong          >4096           dynamically linked executable
->16    belong          >0              not stripped
-0      belong&077777777        0200410         mc68010 pure
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-0      belong&077777777        0200407         mc68010
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
-
-# reworked these to avoid anything beginning with zero becoming "old sun-2"
-0      belong          0407            old sun-2 executable
->16    belong          >0              not stripped
-0      belong          0410            old sun-2 pure executable
->16    belong          >0              not stripped
-0      belong          0413            old sun-2 demand paged executable
->16    belong          >0              not stripped
-
-#
-# Core files.  "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
-# binary executed in compatibility mode under SunOS 5.x".
-#
-0      belong          0x080456        SunOS core file
->4     belong          432             (SPARC)
->>132  string          >\0             from '%s'
->>116  belong          =3              (quit)
->>116  belong          =4              (illegal instruction)
->>116  belong          =5              (trace trap)
->>116  belong          =6              (abort)
->>116  belong          =7              (emulator trap)
->>116  belong          =8              (arithmetic exception)
->>116  belong          =9              (kill)
->>116  belong          =10             (bus error)
->>116  belong          =11             (segmentation violation)
->>116  belong          =12             (bad argument to system call)
->>116  belong          =29             (resource lost)
->>120  belong          x               (T=%dK,
->>124  belong          x               D=%dK,
->>128  belong          x               S=%dK)
->4     belong          826             (68K)
->>128  string          >\0             from '%s'
->4     belong          456             (SPARC 4.x BCP)
->>152  string          >\0             from '%s'
-# Sun SunPC
-0      long            0xfa33c08e      SunPC 4.0 Hard Disk
-0      string          #SUNPC_CONFIG   SunPC 4.0 Properties Values
-# Sun snoop (see RFC 1761, which describes the capture file format).
-#
-0      string          snoop           Snoop capture file
->8     belong          >0              - version %ld
->12    belong          0               (IEEE 802.3)
->12    belong          1               (IEEE 802.4)
->12    belong          2               (IEEE 802.5)
->12    belong          3               (IEEE 802.6)
->12    belong          4               (Ethernet)
->12    belong          5               (HDLC)
->12    belong          6               (Character synchronous)
->12    belong          7               (IBM channel-to-channel adapter)
->12    belong          8               (FDDI)
->12    belong          9               (Unknown)
-
-# Microsoft ICM color profile
-36     string          acspMSFT        Microsoft ICM Color Profile
-# Sun KCMS
-36     string          acsp            Kodak Color Management System, ICC Profile
-
-#---------------------------------------------------------------------------
-# The following entries have been tested by Duncan Laurie <duncan@sun.com> (a
-# lead Sun/Cobalt developer) who agrees that they are good and worthy of
-# inclusion.
-
-# Boot ROM images for Sun/Cobalt Linux server appliances
-0       string  Cobalt\ Networks\ Inc.\nFirmware\ v     Paged COBALT boot rom
->38     string x        V%.4s
-
-# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code
-# at the very end where file(1) can't get it.
-0       string CRfs     COBALT boot rom data (Flat boot rom or file system)
-
-
-
-#------------------------------------------------------------------------------
-# Sketch Drawings: http://sketch.sourceforge.net/ 
-# From: Edwin Mons <e@ik.nu>
-0      string  ##Sketch        Sketch document text
-#------------------------------------------------------------------------------
-# bFLT: file(1) magic for BFLT uclinux binary files
-#
-# From Philippe De Muyter <phdm@macqel.be>
-#
-0      string          bFLT            BFLT executable
->4     belong          x               - version %ld
->4     belong          4
->>36   belong&0x1      0x1             ram
->>36   belong&0x2      0x2             gotpic
->>36   belong&0x4      0x4             gzip
->>36   belong&0x8      0x8             gzdata
-#
-# i80960 b.out objects and archives
-#
-0      long            0x10d           i960 b.out relocatable object
->16    long            >0              not stripped
-#
-# b.out archive (hp-rt on i960)
-0      string          !<bout>         b.out archive
->8     string          __.SYMDEF       random library
-
-#------------------------------------------------------------------------------
-# hitach-sh: file(1) magic for Hitachi Super-H
-#
-# Super-H COFF
-#
-0      beshort         0x0500          Hitachi SH big-endian COFF
->18    beshort&0x0002  =0x0000         object
->18    beshort&0x0002  =0x0002         executable
->18    beshort&0x0008  =0x0008         \b, stripped
->18    beshort&0x0008  =0x0000         \b, not stripped
-#
-0      leshort         0x0550          Hitachi SH little-endian COFF
->18    leshort&0x0002  =0x0000         object
->18    leshort&0x0002  =0x0002         executable
->18    leshort&0x0008  =0x0008         \b, stripped
->18    leshort&0x0008  =0x0000         \b, not stripped
-
-
-#------------------------------------------------------------------------------
-# matroska:  file(1) magic for Matroska files
-#
-# See http://www.matroska.org/
-#
-
-# EBML id:
-0              belong          0x1a45dfa3
-# DocType id:
->5             beshort         0x4282
-# DocType contents:
->>8            string          matroska        Matroska data
-
-
-#------------------------------------------------------------------------------
-# ocaml: file(1) magic for Objective Caml files.
-0      string  Caml1999        Objective caml
->8     string  X               exec file
->8     string  I               interface file (.cmi)
->8     string  O               object file (.cmo)
->8     string  A               library file (.cma)
->8     string  Y               native object file (.cmx)
->8     string  Z               native library file (.cmxa)
->8     string  M               abstract syntax tree implementation file
->8     string  N               abstract syntax tree interface file
->9     string  >\0             (Version %3.3s).
-
-#------------------------------------------------------------------------------
-# vax:  file(1) magic for VAX executable/object and APL workspace
-#
-0      lelong          0101557         VAX single precision APL workspace
-0      lelong          0101556         VAX double precision APL workspace
-
-#
-# VAX a.out (32V, BSD)
-#
-0      lelong          0407            VAX executable
->16    lelong          >0              not stripped
-
-0      lelong          0410            VAX pure executable
->16    lelong          >0              not stripped
-
-0      lelong          0413            VAX demand paged pure executable
->16    lelong          >0              not stripped
-
-0      lelong          0420            VAX demand paged (first page unmapped) pure executable
->16    lelong          >0              not stripped
-
-#
-# VAX COFF
-#
-# The `versions' should be un-commented if they work for you.
-# (Was the problem just one of endianness?)
-#
-0      leshort         0570            VAX COFF executable
->12    lelong          >0              not stripped
->22    leshort         >0              - version %ld
-0      leshort         0575            VAX COFF pure executable
->12    lelong          >0              not stripped
->22    leshort         >0              - version %ld
-
-#------------------------------------------------------------------------------
-# clipper:  file(1) magic for Intergraph (formerly Fairchild) Clipper.
-#
-# XXX - what byte order does the Clipper use?
-#
-# XXX - what's the "!" stuff:
-#
-# >18  short           !074000,000000  C1 R1 
-# >18  short           !074000,004000  C2 R1
-# >18  short           !074000,010000  C3 R1
-# >18  short           !074000,074000  TEST
-#
-# I shall assume it's ANDing the field with the first value and
-# comparing it with the second, and rewrite it as:
-#
-# >18  short&074000    000000          C1 R1 
-# >18  short&074000    004000          C2 R1
-# >18  short&074000    010000          C3 R1
-# >18  short&074000    074000          TEST
-#
-# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
-# sort, nor does SunOS 4.x, so either it's something Intergraph added
-# in CLIX, or something AT&T added in SVR3.2 or later, or something
-# somebody else thought was a good idea; it's not documented in the
-# man page for this version of "magic", nor does it appear to be
-# implemented (at least not after I blew off the bogus code to turn
-# old-style "&"s into new-style "&"s, which just didn't work at all).
-#
-0      short           0575            CLIPPER COFF executable (VAX #)
->20    short           0407            (impure)
->20    short           0410            (5.2 compatible)
->20    short           0411            (pure)
->20    short           0413            (demand paged)
->20    short           0443            (target shared library)
->12    long            >0              not stripped
->22    short           >0              - version %ld
-0      short           0577            CLIPPER COFF executable
->18    short&074000    000000          C1 R1 
->18    short&074000    004000          C2 R1
->18    short&074000    010000          C3 R1
->18    short&074000    074000          TEST
->20    short           0407            (impure)
->20    short           0410            (pure)
->20    short           0411            (separate I&D)
->20    short           0413            (paged)
->20    short           0443            (target shared library)
->12    long            >0              not stripped
->22    short           >0              - version %ld
->48    long&01         01              alignment trap enabled
->52    byte            1               -Ctnc
->52    byte            2               -Ctsw
->52    byte            3               -Ctpw
->52    byte            4               -Ctcb
->53    byte            1               -Cdnc
->53    byte            2               -Cdsw
->53    byte            3               -Cdpw
->53    byte            4               -Cdcb
->54    byte            1               -Csnc
->54    byte            2               -Cssw
->54    byte            3               -Cspw
->54    byte            4               -Cscb
-4      string          pipe            CLIPPER instruction trace
-4      string          prof            CLIPPER instruction profile
-
-#------------------------------------------------------------------------------
-# frame:  file(1) magic for FrameMaker files
-#
-# This stuff came on a FrameMaker demo tape, most of which is
-# copyright, but this file is "published" as witness the following:
-#
-0      string          \<MakerFile     FrameMaker document
->11    string          5.5              (5.5
->11    string          5.0              (5.0
->11    string          4.0              (4.0
->11    string          3.0              (3.0
->11    string          2.0              (2.0
->11    string          1.0              (1.0
->14    byte            x                 %c)
-0      string          \<MIFFile       FrameMaker MIF (ASCII) file
->9     string          4.0              (4.0)
->9     string          3.0              (3.0)
->9     string          2.0              (2.0)
->9     string          1.0              (1.x)
-0      string          \<MakerDictionary       FrameMaker Dictionary text
->17    string          3.0              (3.0)
->17    string          2.0              (2.0)
->17    string          1.0              (1.x)
-0      string          \<MakerScreenFont       FrameMaker Font file
->17    string          1.01             (%s)
-0      string          \<MML           FrameMaker MML file
-0      string          \<BookFile      FrameMaker Book file
->10    string          3.0              (3.0
->10    string          2.0              (2.0
->10    string          1.0              (1.0
->13    byte            x                 %c)
-# XXX - this book entry should be verified, if you find one, uncomment this
-#0     string          \<Book\         FrameMaker Book (ASCII) file
-#>6    string          3.0              (3.0)
-#>6    string          2.0              (2.0)
-#>6    string          1.0              (1.0)
-0      string          \<Maker Intermediate Print File FrameMaker IPL file
-
-#------------------------------------------------------------------------------
-# magic:  file(1) magic for magic files
-#
-0      string          #\ Magic        magic text file for file(1) cmd
-0      lelong          0xF11E041C      magic binary file for file(1) cmd
->4     lelong          x               (version %d) (little endian)
-0      belong          0xF11E041C      magic binary file for file(1) cmd
->4     belong          x               (version %d) (big endian)
-
-#------------------------------------------------------------------------------
-# sql:  file(1) magic for SQL files
-#
-# From: "Marty Leisner" <mleisner@eng.mc.xerox.com>
-# Recognize some MySQL files.
-#
-0      beshort                 0xfe01          MySQL table definition file
->2     byte                    x               Version %d
-0      belong&0xffffff00       0xfefe0300      MySQL MISAM index file
->3     byte                    x               Version %d
-0      belong&0xffffff00       0xfefe0700      MySQL MISAM compressed data file
->3     byte                    x               Version %d
-0      belong&0xffffff00       0xfefe0500      MySQL ISAM index file
->3     byte                    x               Version %d
-0      belong&0xffffff00       0xfefe0600      MySQL ISAM compressed data file
->3     byte                    x               Version %d
-0      string                  \376bin         MySQL replication log
-
-#------------------------------------------------------------------------------
-# dact:  file(1) magic for DACT compressed files
-#
-0      long            0x444354C3      DACT compressed data
->4     byte            >-1             (version %i.
->5     byte            >-1             $BS%i.
->6     byte            >-1             $BS%i)
->7     long            >0              $BS, original size: %i bytes
->15    long            >30             $BS, block size: %i bytes
-#
-# GNU nlsutils message catalog file format
-#
-0      string          \336\22\4\225   GNU message catalog (little endian),
->4     lelong          x               revision %d,
->8     lelong          x               %d messages
-0      string          \225\4\22\336   GNU message catalog (big endian),
->4     belong          x               revision %d,
->8     belong          x               %d messages
-# message catalogs, from Mitchum DSouza <m.dsouza@mrc-apu.cam.ac.uk>
-0      string          *nazgul*        Nazgul style compiled message catalog
->8     lelong          >0              \b, version %ld
-# GnuPG
-# The format is very similar to pgp
-0      string          \001gpg                 GPG key trust database
->4     byte            x                       version %d
-0       beshort         0x9901                  GPG key public ring
-# This magic is not particularly good, as the keyrings don't have true
-# magic. Nevertheless, it covers many keyrings.
-
-# Gnumeric spreadsheet
-# This entry is only semi-helpful, as Gnumeric compresses its files, so
-# they will ordinarily reported as "compressed", but at least -z helps
-39      string          =<gmr:Workbook           Gnumeric spreadsheet
-
-#------------------------------------------------------------------------------
-# ibm6000:  file(1) magic for RS/6000 and the RT PC.
-#
-0      beshort         0x01df          executable (RISC System/6000 V3.1) or obj module
->12    belong          >0              not stripped
-# Breaks sun4 statically linked execs.
-#0      beshort                0x0103          executable (RT Version 2) or obj module
-#>2    byte            0x50            pure
-#>28   belong          >0              not stripped
-#>6    beshort         >0              - version %ld
-0      beshort         0x0104          shared library
-0      beshort         0x0105          ctab data
-0      beshort         0xfe04          structured file
-0      string          0xabcdef        AIX message catalog
-0      belong          0x000001f9      AIX compiled message catalog
-0      string          \<aiaff>        archive
-0      string          \<bigaf>        archive (big format)
-
-
-#------------------------------------------------------------------------------
-# os2:  file(1) magic for OS/2 files
-#
-
-# Provided 1998/08/22 by
-# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>
-1      string  InternetShortcut        MS Windows 95 Internet shortcut text
->24    string  >\                      (URL=<%s>)
-
-# OS/2 URL objects
-# Provided 1998/08/22 by
-# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>
-#0     string  http:                   OS/2 URL object text
-#>5    string  >\                      (WWW) <http:%s>
-#0     string  mailto:                 OS/2 URL object text
-#>7    string  >\                      (email) <%s>
-#0     string  news:                   OS/2 URL object text
-#>5    string  >\                      (Usenet) <%s>
-#0     string  ftp:                    OS/2 URL object text
-#>4    string  >\                      (FTP) <ftp:%s>
-#0     string  file:                   OS/2 URL object text
-#>5    string  >\                      (Local file) <%s>
-
-# >>>>> OS/2 INF/HLP <<<<<  (source: Daniel Dissett ddissett@netcom.com)
-# Carl Hauser (chauser.parc@xerox.com) and 
-# Marcus Groeber (marcusg@ph-cip.uni-koeln.de)
-# list the following header format in inf02a.doc:
-#
-#  int16 ID;           // ID magic word (5348h = "HS")
-#  int8  unknown1;     // unknown purpose, could be third letter of ID
-#  int8  flags;        // probably a flag word...
-#                      //  bit 0: set if INF style file
-#                      //  bit 4: set if HLP style file
-#                      // patching this byte allows reading HLP files
-#                      // using the VIEW command, while help files 
-#                      // seem to work with INF settings here as well.
-#  int16 hdrsize;      // total size of header
-#  int16 unknown2;     // unknown purpose
-# 
-0   string  HSP\x01\x9b\x00 OS/2 INF
->107 string >0                      (%s)
-0   string  HSP\x10\x9b\x00     OS/2 HLP
->107 string >0                      (%s)
-
-# OS/2 INI (this is a guess)
-0  string   \xff\xff\xff\xff\x14\0\0\0  OS/2 INI
-#------------------------------------------------------------------------------
-#
-# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt@redhat.com)
-#
-0      beshort         0xedab
->2     beshort         0xeedb          RPM
->>4    byte            x               v%d
->>6    beshort         0               bin
->>6    beshort         1               src
->>8    beshort         1               i386
->>8    beshort         2               Alpha
->>8    beshort         3               Sparc
->>8    beshort         4               MIPS
->>8    beshort         5               PowerPC
->>8    beshort         6               68000
->>8    beshort         7       SGI
->>8    beshort         8               RS6000
->>8    beshort         9               IA64
->>8    beshort         10              Sparc64
->>8    beshort         11              MIPSel
->>8    beshort         12              ARM
->>10   string          x               %s
-#-----------------------------------------------------------------------------
-# misctools:  file(1) magic for miscelanous UNIX tools.
-#
-0      string          %%!!            X-Post-It-Note text
-0      string          BEGIN:VCALENDAR         vCalendar calendar file
-
-#------------------------------------------------------------------------------
-# motorola:  file(1) magic for Motorola 68K and 88K binaries
-#
-# 68K
-#
-0      beshort         0520            mc68k COFF
->18    beshort         ^00000020       object
->18    beshort         &00000020       executable
->12    belong          >0              not stripped
->168   string          .lowmem         Apple toolbox
->20    beshort         0407            (impure)
->20    beshort         0410            (pure)
->20    beshort         0413            (demand paged)
->20    beshort         0421            (standalone)
-0      beshort         0521            mc68k executable (shared)
->12    belong          >0              not stripped
-0      beshort         0522            mc68k executable (shared demand paged)
->12    belong          >0              not stripped
-#
-# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
-#
-0      beshort         0554            68K BCS executable
-#
-# 88K
-#
-# Motorola/88Open BCS
-#
-0      beshort         0555            88K BCS executable
-#
-# Motorola S-Records, from Gerd Truschinski <gt@freebsd.first.gmd.de>
-0   string      S0          Motorola S-Record; binary data in text format
-
-# ATARI ST relocatable PRG
-#
-# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001
-# (according to Roland Waldi, Oct 21, 1987)
-# besides the magic 0x601a, the text segment size is checked to be
-# not larger than 1 MB (which is a lot on ST).
-# The additional 0x601b distinction I took from Doug Lee's magic.
-0      belong&0xFFFFFFF0       0x601A0000      Atari ST M68K contiguous executable
->2     belong                  x               (txt=%ld,
->6     belong                  x               dat=%ld,
->10    belong                  x               bss=%ld,
->14    belong                  x               sym=%ld)
-0      belong&0xFFFFFFF0       0x601B0000      Atari ST M68K non-contig executable
->2     belong                  x               (txt=%ld,
->6     belong                  x               dat=%ld,
->10    belong                  x               bss=%ld,
->14    belong                  x               sym=%ld)
-
-# Atari ST/TT... program format (sent by Wolfram Kleff <kleff@cs.uni-bonn.de>)
-0       beshort         0x601A          Atari 68xxx executable,
->2      belong          x               text len %lu,
->6      belong          x               data len %lu,
->10     belong          x               BSS len %lu,
->14     belong          x               symboltab len %lu,
->18     belong          0
->22     belong          &0x01           fastload flag,
->22     belong          &0x02           may be loaded to alternate RAM,
->22     belong          &0x04           malloc may be from alternate RAM,
->22     belong          x               flags: 0x%lX,
->26     beshort         0               no relocation tab
->26     beshort         !0              + relocation tab
->30     string          SFX             [Self-Extracting LZH SFX archive]
->38     string          SFX             [Self-Extracting LZH SFX archive]
->44     string          ZIP!            [Self-Extracting ZIP SFX archive]
-
-0       beshort         0x0064          Atari 68xxx CPX file
->8      beshort         x               (version %04lx)
-#
-# Mach magic number info
-#
-0      long            0xefbe  OSF/Rose object
-# I386 magic number info
-#
-0      short           0565    i386 COFF object
-
-#------------------------------------------------------------------------------
-# perl:  file(1) magic for Larry Wall's perl language.
-#
-# The ``eval'' line recognizes an outrageously clever hack for USG systems.
-# Keith Waclena <keith@cerberus.uchicago.edu>
-# Send additions to <perl5-porters@perl.org>
-0      string/b        #!\ /bin/perl                   perl script text executable
-0      string          eval\ "exec\ /bin/perl          perl script text
-0      string/b        #!\ /usr/bin/perl               perl script text executable
-0      string          eval\ "exec\ /usr/bin/perl      perl script text
-0      string/b        #!\ /usr/local/bin/perl         perl script text
-0      string          eval\ "exec\ /usr/local/bin/perl        perl script text executable
-0      string          eval\ '(exit\ $?0)'\ &&\ eval\ 'exec    perl script text
-
-# a couple more, by me
-# XXX: christos matches
-#0     regex           package         Perl5 module source text (via regex)
-0      string          package         Perl5 module source text
-
-# Perl Storable data files.
-0      string  perl-store      perl Storable(v0.6) data
->4     byte    >0      (net-order %d)
->>4    byte    &01     (network-ordered)
->>4    byte    =3      (major 1)
->>4    byte    =2      (major 1)
-
-0      string  pst0    perl Storable(v0.7) data
->4     byte    >0
->>4    byte    &01     (network-ordered)
->>4    byte    =5      (major 2)
->>4    byte    =4      (major 2)
->>5    byte    >0      (minor %d)
-
-#------------------------------------------------------------------------------
-# xenix:  file(1) magic for Microsoft Xenix
-#
-# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
-# model" lifted from "magic.xenix", with comment "derived empirically;
-# treat as folklore until proven"
-#
-# "small model", "large model", "huge model" stuff lifted from XXX
-#
-# XXX - "x.out" collides with PDP-11 archives
-#
-0      string          core            core file (Xenix)
-0      byte            0x80            8086 relocatable (Microsoft)
-0      leshort         0xff65          x.out
->2     string          __.SYMDEF        randomized
->0     byte            x               archive
-0      leshort         0x206           Microsoft a.out
->8     leshort         1               Middle model
->0x1e  leshort         &0x10           overlay
->0x1e  leshort         &0x2            separate
->0x1e  leshort         &0x4            pure
->0x1e  leshort         &0x800          segmented
->0x1e  leshort         &0x400          standalone
->0x1e  leshort         &0x8            fixed-stack
->0x1c  byte            &0x80           byte-swapped
->0x1c  byte            &0x40           word-swapped
->0x10  lelong          >0              not-stripped
->0x1e  leshort         ^0xc000         pre-SysV
->0x1e  leshort         &0x4000         V2.3
->0x1e  leshort         &0x8000         V3.0
->0x1c  byte            &0x4            86
->0x1c  byte            &0xb            186
->0x1c  byte            &0x9            286
->0x1c  byte            &0xa            386
->0x1f  byte            <0x040          small model
->0x1f  byte            =0x048          large model     
->0x1f  byte            =0x049          huge model 
->0x1e  leshort         &0x1            executable
->0x1e  leshort         ^0x1            object file
->0x1e  leshort         &0x40           Large Text
->0x1e  leshort         &0x20           Large Data
->0x1e  leshort         &0x120          Huge Objects Enabled
->0x10  lelong          >0              not stripped
-
-0      leshort         0x140           old Microsoft 8086 x.out
->0x3   byte            &0x4            separate
->0x3   byte            &0x2            pure
->0     byte            &0x1            executable
->0     byte            ^0x1            relocatable
->0x14  lelong          >0              not stripped
-
-0      lelong          0x206           b.out
->0x1e  leshort         &0x10           overlay
->0x1e  leshort         &0x2            separate
->0x1e  leshort         &0x4            pure
->0x1e  leshort         &0x800          segmented
->0x1e  leshort         &0x400          standalone
->0x1e  leshort         &0x1            executable
->0x1e  leshort         ^0x1            object file
->0x1e  leshort         &0x4000         V2.3
->0x1e  leshort         &0x8000         V3.0
->0x1c  byte            &0x4            86
->0x1c  byte            &0xb            186
->0x1c  byte            &0x9            286
->0x1c  byte            &0x29           286
->0x1c  byte            &0xa            386
->0x1e  leshort         &0x4            Large Text
->0x1e  leshort         &0x2            Large Data
->0x1e  leshort         &0x102          Huge Objects Enabled
-
-0      leshort         0x580           XENIX 8086 relocatable or 80286 small model
-#------------------------------------------------------------------------------
-# file(1) magic for tgif(1) files
-# From Hendrik Scholz <hendrik@scholz.net>
-
-0   string  %TGIF\ 4   tgif version 4 object file
-
-
-#------------------------------------------------------------------------------
-# sc:  file(1) magic for "sc" spreadsheet
-#
-38     string          Spreadsheet     sc spreadsheet file
-
-#------------------------------------------------------------------------------
-# pyramid:  file(1) magic for Pyramids
-#
-# XXX - byte order?
-#
-0      long            0x50900107      Pyramid 90x family executable
-0      long            0x50900108      Pyramid 90x family pure executable
->16    long            >0              not stripped
-0      long            0x5090010b      Pyramid 90x family demand paged pure executable
->16    long            >0              not stripped
-
-#------------------------------------------------------------------------------
-# adventure: file(1) magic for Adventure game files
-#
-# from Allen Garvin <earendil@faeryland.tamu-commerce.edu>
-# Edited by Dave Chapeskie <dchapes@ddm.on.ca> Jun 28, 1998
-# Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002
-#
-# ALAN
-# I assume there are other, lower versions, but these are the only ones I
-# saw in the archive.
-0      beshort 0x0206  ALAN game data
->2     byte    <10     version 2.6%d
-
-# Conflicts with too much other stuff!
-# Infocom
-# (Note: to avoid false matches Z-machine version 1 and 2 are not
-# recognized since only the oldest Zork I and II used them.  Similarly
-# there are 4 Infocom games that use version 4 that are not recognized.)
-#0     byte    3       Infocom game data (Z-machine 3,
-#>2    beshort <0x7fff Release %3d,
-#>26   beshort >0      Size %d*2
-#>18   string  >\0     Serial %.6s)
-#0     byte    5       Infocom game data (Z-machine 5,
-#>2    beshort <0x7fff Release %3d,
-#>26   beshort >0      Size %d*4
-#>18   string  >\0     Serial %.6s)
-#0     byte    6       Infocom game data (Z-machine 6,
-#>2    beshort <0x7fff Release %3d,
-#>26   beshort >0      Size %d*8
-#>18   string  >\0     Serial %.6s)
-#0     byte    8       Infocom game data (Z-machine 8,
-#>2    beshort <0x7fff Release %3d,
-#>26   beshort >0      Size %d*8
-#>18   string  >\0     Serial %.6s)
-
-# TADS (Text Adventure Development System)
-#  All files are machine-independent (games compile to byte-code) and are tagged
-#  with a version string of the form "V2.<digit>.<digit>\0" (but TADS 3 is
-#  on the way).
-#  Game files start with "TADS2 bin\n\r\032\0" then the compiler version.
-0      string  TADS2\ bin      TADS
->9     belong  !0x0A0D1A00     game data, CORRUPTED
->9     belong   0x0A0D1A00
->>13   string  >\0             %s game data
-#  Resource files start with "TADS2 rsc\n\r\032\0" then the compiler version.
-0      string  TADS2\ rsc      TADS
->9     belong  !0x0A0D1A00     resource data, CORRUPTED
->9     belong   0x0A0D1A00
->>13   string  >\0             %s resource data
-#  Some saved game files start with "TADS2 save/g\n\r\032\0", a little-endian
-#  2-byte length N, the N-char name of the game file *without* a NUL (darn!),
-# "TADS2 save\n\r\032\0" and the interpreter version. 
-0      string  TADS2\ save/g   TADS
->12    belong  !0x0A0D1A00     saved game data, CORRUPTED
->12    belong   0x0A0D1A00
->>(16.s+32) string >\0         %s saved game data
-#  Other saved game files start with "TADS2 save\n\r\032\0" and the interpreter
-#  version.
-0      string  TADS2\ save     TADS
->10    belong  !0x0A0D1A00     saved game data, CORRUPTED
->10    belong   0x0A0D1A00
->>14   string  >\0             %s saved game data
-
-#------------------------------------------------------------------------------
-# att3b:  file(1) magic for AT&T 3B machines
-#
-# The `versions' should be un-commented if they work for you.
-# (Was the problem just one of endianness?)
-#
-# 3B20
-#
-# The 3B20 conflicts with SCCS.
-#0     beshort         0550            3b20 COFF executable
-#>12   belong          >0              not stripped
-#>22   beshort         >0              - version %ld
-#0     beshort         0551            3b20 COFF executable (TV)
-#>12   belong          >0              not stripped
-#>22   beshort         >0              - version %ld
-#
-# WE32K
-#
-0      beshort         0560            WE32000 COFF
->18    beshort         ^00000020       object
->18    beshort         &00000020       executable
->12    belong          >0              not stripped
->18    beshort         ^00010000       N/A on 3b2/300 w/paging
->18    beshort         &00020000       32100 required
->18    beshort         &00040000       and MAU hardware required
->20    beshort         0407            (impure)
->20    beshort         0410            (pure)
->20    beshort         0413            (demand paged)
->20    beshort         0443            (target shared library)
->22    beshort         >0              - version %ld
-0      beshort         0561            WE32000 COFF executable (TV)
->12    belong          >0              not stripped
-#>18   beshort         &00020000       - 32100 required
-#>18   beshort         &00040000       and MAU hardware required
-#>22   beshort         >0              - version %ld
-#
-# core file for 3b2 
-0      string          \000\004\036\212\200    3b2 core file
->364   string          >\0             of '%s'
-
-#------------------------------------------------------------------------------
-# flash:       file(1) magic for Macromedia Flash file format
-#
-# See
-#
-#      http://www.macromedia.com/software/flash/open/
-#
-0      string          FWS             Macromedia Flash data,
->3     byte            x               version %d
-0      string          CWS             Macromedia Flash data (compressed),
->3     byte            x               version %d
-#
-# From Dave Wilson
-0      string AGD4\xbe\xb8\xbb\xcb\x00 Macromedia Freehand 9 Document
-
-#------------------------------------------------------------------------------
-# karma:  file(1) magic for Karma data files
-#
-# From <rgooch@atnf.csiro.au>
-
-0      string          KarmaRHD Version        Karma Data Structure Version
->16    belong          x               %lu
-#------------------------------------------------------------------------------
-# octave binary data file(1) magic, from Dirk Eddelbuettel <edd@debian.org>
-0      string          Octave-1-L      Octave binary data (little endian)
-0      string          Octave-1-B      Octave binary data (big endian)
-
-#------------------------------------------------------------------------------
-#
-# Parix COFF executables
-# From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de>
-#
-0      beshort&0xfff   0xACE   PARIX
->0     byte&0xf0       0x80    T800
->0     byte&0xf0       0x90    T9000
->19    byte&0x02       0x02    executable
->19    byte&0x02       0x00    object
->19    byte&0x0c       0x00    not stripped
-
-#------------------------------------------------------------------------------
-# plan9:  file(1) magic for AT&T Bell Labs' Plan 9 executables
-# From: "Stefan A. Haubenthal" <polluks@web.de>
-#
-0      belong          0x00000107      Plan 9 executable, Motorola 68k
-0      belong          0x000001EB      Plan 9 executable, Intel 386
-0      belong          0x00000247      Plan 9 executable, Intel 960
-0      belong          0x000002AB      Plan 9 executable, SPARC
-0      belong          0x00000407      Plan 9 executable, MIPS R3000
-0      belong          0x0000048B      Plan 9 executable, AT&T DSP 3210
-0      belong          0x00000517      Plan 9 executable, MIPS R4000 BE
-0      belong          0x000005AB      Plan 9 executable, AMD 29000
-0      belong          0x00000647      Plan 9 executable, ARM 7-something
-0      belong          0x000006EB      Plan 9 executable, PowerPC
-0      belong          0x00000797      Plan 9 executable, MIPS R4000 LE
-0      belong          0x0000084B      Plan 9 executable, DEC Alpha
-
-#------------------------------------------------------------------------------
-# troff:  file(1) magic for *roff
-#
-# updated by Daniel Quinlan (quinlan@yggdrasil.com)
-
-# troff input
-0      string          .\\"            troff or preprocessor input text
-0      string          '\\"            troff or preprocessor input text
-0      string          '.\\"           troff or preprocessor input text
-0      string          \\"             troff or preprocessor input text
-0      string          '''             troff or preprocessor input text
-
-# ditroff intermediate output text
-0      string          x\ T            ditroff output text
->4     string          cat             for the C/A/T phototypesetter
->4     string          ps              for PostScript
->4     string          dvi             for DVI
->4     string          ascii           for ASCII
->4     string          lj4             for LaserJet 4
->4     string          latin1          for ISO 8859-1 (Latin 1)
->4     string          X75             for xditview at 75dpi
->>7    string          -12             (12pt)
->4     string          X100            for xditview at 100dpi
->>8    string          -12             (12pt)
-
-# output data formats
-0      string          \100\357        very old (C/A/T) troff output data
-
-#------------------------------------------------------------------------------
-# spectrum:  file(1) magic for Spectrum emulator files.
-#
-# John Elliott <jce@seasip.demon.co.uk>
-
-#
-# Spectrum +3DOS header
-#
-0       string          PLUS3DOS\032    Spectrum +3 data
->15     byte            0               - BASIC program
->15     byte            1               - number array
->15     byte            2               - character array
->15     byte            3               - memory block
->>16    belong          0x001B0040      (screen)
->15     byte            4               - Tasword document
->15     string          TAPEFILE        - ZXT tapefile
-#
-# Tape file. This assumes the .TAP starts with a Spectrum-format header,
-# which nearly all will.
-#
-0       string          \023\000\000    Spectrum .TAP data
->4      string          x               "%-10.10s"
->3      byte            0               - BASIC program
->3      byte            1               - number array
->3      byte            2               - character array
->3      byte            3               - memory block
->>14    belong          0x001B0040      (screen)
-
-# The following three blocks are from pak21-spectrum@srcf.ucam.org
-# TZX tape images
-0      string          ZXTape!\x1a     Spectrum .TZX data
->8     byte            x               version %d
->9     byte            x               .%d
-
-# RZX input recording files
-0      string          RZX!            Spectrum .RZX data
->4     byte            x               version %d
->5     byte            x               .%d
-
-# And three sorts of disk image
-0      string          MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
-0      string          MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
-0      string          EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
-
-#------------------------------------------------------------------------------
-# softquad:  file(1) magic for SoftQuad Publishing Software
-#
-# Author/Editor and RulesBuilder
-#
-# XXX - byte order?
-#
-0      string          \<!SQ\ DTD>     Compiled SGML rules file
->9     string          >\0              Type %s
-0      string          \<!SQ\ A/E>     A/E SGML Document binary
->9     string          >\0              Type %s
-0      string          \<!SQ\ STS>     A/E SGML binary styles file
->9     string          >\0              Type %s
-0      short           0xc0de          Compiled PSI (v1) data
-0      short           0xc0da          Compiled PSI (v2) data
->3     string          >\0             (%s)
-# Binary sqtroff font/desc files...
-0      short           0125252         SoftQuad DESC or font file binary
->2     short           >0              - version %d
-# Bitmaps...
-0      string          SQ\ BITMAP1     SoftQuad Raster Format text
-#0     string          SQ\ BITMAP2     SoftQuad Raster Format data
-# sqtroff intermediate language (replacement for ditroff int. lang.)
-0      string          X\              SoftQuad troff Context intermediate
->2     string          495             for AT&T 495 laser printer
->2     string          hp              for Hewlett-Packard LaserJet
->2     string          impr            for IMAGEN imPRESS
->2     string          ps              for PostScript
-
-#------------------------------------------------------------------------------
-# Dyadic: file(1) magic for Dyalog APL.
-#
-0      byte    0xaa
->1     byte    <4              Dyalog APL
->>1    byte    0x00            incomplete workspace
->>1    byte    0x01            component file
->>1    byte    0x02            external variable
->>1    byte    0x03            workspace
->>2    byte    x               version %d
->>3    byte    x               .%d
-
-#------------------------------------------------------------------------------
-# palm:  file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks
-#
-# Brian Lalor <blalor@hcirisc.cs.binghamton.edu>
-
-# appl
-60      belong                  0x6170706c      PalmOS application
->0      string                  >\0             "%s"
-# TEXt
-60      belong                  0x54455874      AportisDoc file
->0      string                  >\0             "%s"
-# HACK
-60      belong                  0x4841434b      HackMaster hack
->0      string                  >\0             "%s"
-
-# Variety of PalmOS document types
-# Michael-John Turner <mj@debian.org>
-# Thanks to Hasan Umit Ezerce <humit@tr-net.net.tr> for his DocType
-60     string                  BVokBDIC        BDicty PalmOS document
->0     string                  >\0             "%s"
-60     string                  DB99DBOS        DB PalmOS document
->0     string                  >\0             "%s"
-60     string                  vIMGView        FireViewer/ImageViewer PalmOS document
->0     string                  >\0             "%s"
-60     string                  PmDBPmDB        HanDBase PalmOS document
->0     string                  >\0             "%s"
-60     string                  InfoINDB        InfoView PalmOS document
->0     string                  >\0             "%s"
-60     string                  ToGoToGo        iSilo PalmOS document
->0     string                  >\0             "%s"
-60     string                  JfDbJBas        JFile PalmOS document
->0     string                  >\0             "%s"
-60     string                  JfDbJFil        JFile Pro PalmOS document
->0     string                  >\0             "%s"
-60     string                  DATALSdb        List PalmOS document
->0     string                  >\0             "%s"
-60     string                  Mdb1Mdb1        MobileDB PalmOS document
->0     string                  >\0             "%s"
-60     string                  PNRdPPrs        PeanutPress PalmOS document
->0     string                  >\0             "%s"
-60     string                  DataPlkr        Plucker PalmOS document
->0     string                  >\0             "%s"
-60     string                  DataSprd        QuickSheet PalmOS document
->0     string                  >\0             "%s"
-60     string                  SM01SMem        SuperMemo PalmOS document
->0     string                  >\0             "%s"
-60     string                  DataTlPt        TealDoc PalmOS document
->0     string                  >\0             "%s"
-60     string                  InfoTlIf        TealInfo PalmOS document
->0     string                  >\0             "%s"
-60     string                  DataTlMl        TealMeal PalmOS document
->0     string                  >\0             "%s"
-60     string                  DataTlPt        TealPaint PalmOS document
->0     string                  >\0             "%s"
-60     string                  dataTDBP        ThinkDB PalmOS document
->0     string                  >\0             "%s"
-60     string                  TdatTide        Tides PalmOS document
->0     string                  >\0             "%s"
-60     string                  ToRaTRPW        TomeRaider PalmOS document
->0     string                  >\0             "%s"
-
-# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net)
-# For version 1.xx zTXTs, outputs version and numbers of bookmarks and
-#   annotations.
-# For other versions, just outputs version.
-#
-60             string          zTXT            A GutenPalm zTXT e-book
->0             string          >\0             "%s"
->(0x4E.L)      byte            0
->>(0x4E.L+1)   byte            x               (v0.%02d)
->(0x4E.L)      byte            1
->>(0x4E.L+1)   byte            x               (v1.%02d)
->>>(0x4E.L+10) beshort         >0
->>>>(0x4E.L+10) beshort                <2              - 1 bookmark
->>>>(0x4E.L+10) beshort                >1              - %d bookmarks
->>>(0x4E.L+14) beshort         >0
->>>>(0x4E.L+14) beshort                <2              - 1 annotation
->>>>(0x4E.L+14) beshort                >1              - %d annotations
->(0x4E.L)      byte            >1              (v%d.
->>(0x4E.L+1)   byte            x               %02d)
-
-# Palm OS .prc file types
-60             string          libr            Palm OS dynamic library data
->0             string          >\0             "%s"
-60             string          ptch            Palm OS operating system patch data
->0             string          >\0             "%s"
-
-# Mobipocket (www.mobipocket.com), donated by Carl Witty
-60     string                  BOOKMOBI        Mobipocket E-book
->0     string                  >\0             "%s"
-#------------------------------------------------------------------------------
-# pdf:  file(1) magic for Portable Document Format
-#
-
-0      string          %PDF-           PDF document
->5     byte            x               \b, version %c
->7     byte            x               \b.%c
-
-#------------------------------------------------------------------------------
-# vorbis:  file(1) magic for Ogg/Vorbis files
-#
-# From Felix von Leitner <leitner@fefe.de>
-# Extended by Beni Cherniavsky <cben@crosswinds.net>
-# Further extended by Greg Wooledge <greg@wooledge.org>
-#
-# Most (everything but the number of channels and bitrate) is commented
-# out with `##' as it's not interesting to the average user.  The most
-# probable things advanced users would want to uncomment are probably
-# the number of comments and the encoder version.
-#
-# --- Ogg Framing ---
-0              string          OggS            Ogg data
->4             byte            !0              UNKNOWN REVISION %u
-##>4           byte            0               revision 0
->4             byte            0
-##>>14         lelong          x               (Serial %lX)
-# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net)
->>28           string          fLaC            \b, FLAC audio
-# non-Vorbis content: Theora
->>28           string          \x80theora      \b, Theora video
-# non-Vorbis content: Speex
->>28           string          Speex\ \ \      \b, Speex audio
-# non-Vorbis content: OGM
->>28           string          \x01video\0\0\0 \b, OGM video
->>>37          string/c        div3            (DivX 3)
->>>37          string/c        divx            (DivX 4)
->>>37          string/c        dx50            (DivX 5)
->>>37          string/c        xvid            (XviD)
-# --- First vorbis packet - general header ---
->>28           string          \x01vorbis      \b, Vorbis audio,
->>>35          lelong          !0              UNKNOWN VERSION %lu,
-##>>>35                lelong          0               version 0,
->>>35          lelong          0
->>>>39         ubyte           1               mono,
->>>>39         ubyte           2               stereo,
->>>>39         ubyte           >2              %u channels,
->>>>40         lelong          x               %lu Hz
-# Minimal, nominal and maximal bitrates specified when encoding
->>>>48         string          <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff       \b,
-# The above tests if at least one of these is specified:
->>>>>52                lelong          !-1
-# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields
-# instead of -1.
-# Vorbis 1.0 uses 0 instead of -1.
->>>>>>52       lelong          !0
->>>>>>>52      lelong          !-1000
->>>>>>>>52     lelong          x               <%lu
->>>>>48                lelong          !-1
->>>>>>48       lelong          x               ~%lu
->>>>>44                lelong          !-1
->>>>>>44       lelong          !-1000
->>>>>>>44      lelong          !0
->>>>>>>>44     lelong          x               >%lu
->>>>>48                string          <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff       bps
-# -- Second vorbis header packet - the comments
-# A kludge to read the vendor string.  It's a counted string, not a
-# zero-terminated one, so file(1) can't read it in a generic way.
-# libVorbis is the only one existing currently, so I detect specifically
-# it.  The interesting value is the cvs date (8 digits decimal).
-# Post-RC1 Ogg files have the second header packet (and thus the version)
-# in a different place, so we must use an indirect offset.
->>>(84.b+85)           string          \x03vorbis
->>>>(84.b+96)          string/c        Xiphophorus\ libVorbis\ I       \b, created by: Xiphophorus libVorbis I
->>>>>(84.b+120)                string          >00000000       
-# Map to beta version numbers:
->>>>>>(84.b+120)       string          <20000508       (<beta1, prepublic)
->>>>>>(84.b+120)       string          20000508        (1.0 beta 1 or beta 2)
->>>>>>(84.b+120)       string          >20000508
->>>>>>>(84.b+120)      string          <20001031       (beta2-3)
->>>>>>(84.b+120)       string          20001031        (1.0 beta 3)
->>>>>>(84.b+120)       string          >20001031
->>>>>>>(84.b+120)      string          <20010225       (beta3-4)
->>>>>>(84.b+120)       string          20010225        (1.0 beta 4)
->>>>>>(84.b+120)       string          >20010225
->>>>>>>(84.b+120)      string          <20010615       (beta4-RC1)
->>>>>>(84.b+120)       string          20010615        (1.0 RC1)
->>>>>>(84.b+120)       string          20010813        (1.0 RC2)
->>>>>>(84.b+120)       string          20010816        (RC2 - Garf tuned v1)
->>>>>>(84.b+120)       string          20011014        (RC2 - Garf tuned v2)
->>>>>>(84.b+120)       string          20011217        (1.0 RC3)
->>>>>>(84.b+120)       string          20011231        (1.0 RC3)
-# Some pre-1.0 CVS snapshots still had "Xiphphorus"...
->>>>>>(84.b+120)       string          >20011231       (pre-1.0 CVS)
-# For the 1.0 release, Xiphophorus is replaced by Xiph.Org
->>>>(84.b+96)          string/c        Xiph.Org\ libVorbis\ I  \b, created by: Xiph.Org libVorbis I
->>>>>(84.b+117)                string          >00000000       
->>>>>>(84.b+117)       string          <20020717       (pre-1.0 CVS)
->>>>>>(84.b+117)       string          20020717        (1.0)
->>>>>>(84.b+117)       string          20030909        (1.0.1)
->>>>>>(84.b+117)       string          20040629        (1.1.0 RC1)
-
-#-----------------------------------------------
-# GNU Smalltalk image, starting at version 1.6.2
-# From: catull_us@yahoo.com
-#
-0      string  GSTIm\0\0       GNU SmallTalk
-# little-endian
->7     byte&1  =0              LE image version
->>10   byte    x               %d.
->>9    byte    x               \b%d.
->>8    byte    x               \b%d
-#>>12  lelong  x               , data: %ld
-#>>16  lelong  x               , table: %ld
-#>>20  lelong  x               , memory: %ld
-# big-endian
->7     byte&1  =1              BE image version
->>8    byte    x               %d.
->>9    byte    x               \b%d.
->>10   byte    x               \b%d
-#>>12  belong  x               , data: %ld
-#>>16  belong  x               , table: %ld
-#>>20  belong  x               , memory: %ld
-
-
-
-#------------------------------------------------------------------------------
-# sgml:  file(1) magic for Standard Generalized Markup Language
-# HyperText Markup Language (HTML) is an SGML document type,
-# from Daniel Quinlan (quinlan@yggdrasil.com)
-# adapted to string extenstions by Anthon van der Neut <anthon@mnt.org)
-0   string/cB  \<!DOCTYPE\ html        HTML document text
-0   string/cb  \<head                  HTML document text
-0   string/cb  \<title                 HTML document text
-0   string/cb  \<html                  HTML document text
-
-# Extensible markup language (XML), a subset of SGML
-# from Marc Prud'hommeaux (marc@apocalypse.org)
-0      string/cb       \<?xml                  XML document text
-0      string          \<?xml\ version "       XML
-0      string          \<?xml\ version="       XML
->15    string          >\0                     %.3s document text
->>23   string          \<xsl:stylesheet        (XSL stylesheet)
->>24   string          \<xsl:stylesheet        (XSL stylesheet)
-0      string/b        \<?xml                  XML document text
-0      string/cb       \<?xml                  broken XML document text
-
-
-# SGML, mostly from rph@sq
-0   string/cb  \<!doctype              exported SGML document text
-0   string/cb  \<!subdoc               exported SGML subdocument text
-0   string/cb  \<!--                   exported SGML document text
-
-# Web browser cookie files
-# (Mozilla, Galeon, Netscape 4, Konqueror..)
-# Ulf Harnhammar <ulfh@update.uu.se>
-0      string  #\ HTTP\ Cookie\ File   Web browser cookie text
-0      string  #\ Netscape\ HTTP\ Cookie\ File Netscape cookie text
-0      string  #\ KDE\ Cookie\ File    Konqueror cookie text
-
-#------------------------------------------------------------------------------
-# msvc:  file(1) magic for msvc
-# "H. Nanosecond" <aldomel@ix.netcom.com>
-# Microsoft visual C
-# 
-# I have version 1.0
-
-# .aps
-0      string  HWB\000\377\001\000\000\000     Microsoft Visual C .APS file
-
-# .ide
-#too long 0    string  \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316        MSVC .ide
-0      string  \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157    MSVC .ide
-
-# .res
-0      string  \000\000\000\000\040\000\000\000\377    MSVC .res
-0      string  \377\003\000\377\001\000\020\020\350    MSVC .res
-0      string  \377\003\000\377\001\000\060\020\350    MSVC .res
-
-#.lib
-0      string  \360\015\000\000        Microsoft Visual C library
-0      string  \360\075\000\000        Microsoft Visual C library
-0      string  \360\175\000\000        Microsoft Visual C library
-
-#.pch
-0      string  DTJPCH0\000\022\103\006\200     Microsoft Visual C .pch
-
-# .pdb
-# too long 0   string  Microsoft\ C/C++\ program\ database\ 
-0      string  Microsoft\ C/C++\       MSVC program database
->18    string  program\ database\      
->33    string  >\0     ver %s
-
-#.sbr
-0      string  \000\002\000\007\000    MSVC .sbr
->5     string  >\0     %s
-
-#.bsc
-0      string  \002\000\002\001        MSVC .bsc
-
-#.wsp
-0      string  1.00\ .0000.0000\000\003        MSVC .wsp version 1.0000.0000
-# these seem to start with the version and contain menus
-
-#------------------------------------------------------------------------------
-# news:  file(1) magic for SunOS NeWS fonts (not "news" as in "netnews")
-#
-0      string          StartFontMetrics        ASCII font metrics
-0      string          StartFont       ASCII font bits
-0      belong          0x137A2944      NeWS bitmap font
-0      belong          0x137A2947      NeWS font family
-0      belong          0x137A2950      scalable OpenFont binary
-0      belong          0x137A2951      encrypted scalable OpenFont binary
-8      belong          0x137A2B45      X11/NeWS bitmap font
-8      belong          0x137A2B48      X11/NeWS font family
-
-# -----------------------------------------------------------
-# VMware specific files (deducted from version 1.1 and log file entries)
-# Anthon van der Neut (anthon@mnt.org)
-0      belong  0x4d52564e      VMware nvram 
-0      belong  0x434f5744      VMware
->4     byte    3               virtual disk 
->>32   lelong  x               (%d/
->>36   lelong  x               \b%d/
->>40   lelong  x               \b%d)
->4     byte    2               undoable disk
->>32   string  >\0             (%s)
-
-#------------------------------------------------------------------------------
-# diamond:  file(1) magic for Diamond system
-#
-# ... diamond is a multi-media mail and electronic conferencing system....
-#
-# XXX - I think it was either renamed Slate, or replaced by Slate....
-#
-#      The full deal is too long...
-#0     string  <list>\n<protocol\ bbn-multimedia-format>       Diamond Multimedia Document
-0      string  =<list>\n<protocol\ bbn-m       Diamond Multimedia Document
-
-#------------------------------------------------------------------------------
-# dump:  file(1) magic for dump file format--for new and old dump filesystems
-#
-# We specify both byte orders in order to recognize byte-swapped dumps.
-#
-24     belong  60012           new-fs dump file (big endian),
->4     bedate  x               Previous dump %s,
->8     bedate  x               This dump %s,
->12    belong  >0              Volume %ld,
->692   belong  0               Level zero, type:
->692   belong  >0              Level %d, type:
->0     belong  1               tape header,
->0     belong  2               beginning of file record,
->0     belong  3               map of inodes on tape,
->0     belong  4               continuation of file record,
->0     belong  5               end of volume,
->0     belong  6               map of inodes deleted,
->0     belong  7               end of medium (for floppy),
->676   string  >\0             Label %s,
->696   string  >\0             Filesystem %s,
->760   string  >\0             Device %s,
->824   string  >\0             Host %s,
->888   belong  >0              Flags %x
-
-24     belong  60011           old-fs dump file (big endian),
-#>4    bedate  x               Previous dump %s,
-#>8    bedate  x               This dump %s,
->12    belong  >0              Volume %ld,
->692   belong  0               Level zero, type:
->692   belong  >0              Level %d, type:
->0     belong  1               tape header,
->0     belong  2               beginning of file record,
->0     belong  3               map of inodes on tape,
->0     belong  4               continuation of file record,
->0     belong  5               end of volume,
->0     belong  6               map of inodes deleted,
->0     belong  7               end of medium (for floppy),
->676   string  >\0             Label %s,
->696   string  >\0             Filesystem %s,
->760   string  >\0             Device %s,
->824   string  >\0             Host %s,
->888   belong  >0              Flags %x
-
-24     lelong  60012           new-fs dump file (little endian),
->4     ledate  x               This dump %s,
->8     ledate  x               Previous dump %s,
->12    lelong  >0              Volume %ld,
->692   lelong  0               Level zero, type:
->692   lelong  >0              Level %d, type:
->0     lelong  1               tape header,
->0     lelong  2               beginning of file record,
->0     lelong  3               map of inodes on tape,
->0     lelong  4               continuation of file record,
->0     lelong  5               end of volume,
->0     lelong  6               map of inodes deleted,
->0     lelong  7               end of medium (for floppy),
->676   string  >\0             Label %s,
->696   string  >\0             Filesystem %s,
->760   string  >\0             Device %s,
->824   string  >\0             Host %s,
->888   lelong  >0              Flags %x
-
-24     lelong  60011           old-fs dump file (little endian),
-#>4    ledate  x               Previous dump %s,
-#>8    ledate  x               This dump %s,
->12    lelong  >0              Volume %ld,
->692   lelong  0               Level zero, type:
->692   lelong  >0              Level %d, type:
->0     lelong  1               tape header,
->0     lelong  2               beginning of file record,
->0     lelong  3               map of inodes on tape,
->0     lelong  4               continuation of file record,
->0     lelong  5               end of volume,
->0     lelong  6               map of inodes deleted,
->0     lelong  7               end of medium (for floppy),
->676   string  >\0             Label %s,
->696   string  >\0             Filesystem %s,
->760   string  >\0             Device %s,
->824   string  >\0             Host %s,
->888   lelong  >0              Flags %x
-
-#------------------------------------------------------------------------------
-# linux:  file(1) magic for Linux files
-#
-# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
-# The following basic Linux magic is useful for reference, but using
-# "long" magic is a better practice in order to avoid collisions.
-#
-# 2    leshort         100             Linux/i386
-# >0   leshort         0407            impure executable (OMAGIC)
-# >0   leshort         0410            pure executable (NMAGIC)
-# >0   leshort         0413            demand-paged executable (ZMAGIC)
-# >0   leshort         0314            demand-paged executable (QMAGIC)
-#
-0      lelong          0x00640107      Linux/i386 impure executable (OMAGIC)
->16    lelong          0               \b, stripped
-0      lelong          0x00640108      Linux/i386 pure executable (NMAGIC)
->16    lelong          0               \b, stripped
-0      lelong          0x0064010b      Linux/i386 demand-paged executable (ZMAGIC)
->16    lelong          0               \b, stripped
-0      lelong          0x006400cc      Linux/i386 demand-paged executable (QMAGIC)
->16    lelong          0               \b, stripped
-#
-0      string          \007\001\000    Linux/i386 object file
->20    lelong          >0x1020         \b, DLL library
-# Linux-8086 stuff:
-0      string          \01\03\020\04   Linux-8086 impure executable
->28    long            !0              not stripped
-0      string          \01\03\040\04   Linux-8086 executable
->28    long            !0              not stripped
-#
-0      string          \243\206\001\0  Linux-8086 object file
-#
-0      string          \01\03\020\20   Minix-386 impure executable
->28    long            !0              not stripped
-0      string          \01\03\040\20   Minix-386 executable
->28    long            !0              not stripped
-# core dump file, from Bill Reynolds <bill@goshawk.lanl.gov>
-216    lelong          0421            Linux/i386 core file
->220   string          >\0             of '%s'
->200   lelong          >0              (signal %d)
-#
-# LILO boot/chain loaders, from Daniel Quinlan <quinlan@yggdrasil.com>
-# this can be overridden by the DOS executable (COM) entry
-2      string          LILO            Linux/i386 LILO boot/chain loader
-#
-# PSF fonts, from H. Peter Anvin <hpa@yggdrasil.com>
-0      leshort         0x0436          Linux/i386 PC Screen Font data,
->2     byte            0               256 characters, no directory,
->2     byte            1               512 characters, no directory,
->2     byte            2               256 characters, Unicode directory,
->2     byte            3               512 characters, Unicode directory,
->3     byte            >0              8x%d
-# Linux swap file, from Daniel Quinlan <quinlan@yggdrasil.com>
-4086   string          SWAP-SPACE      Linux/i386 swap file
-# according to man page of mkswap (8) March 1999
-4086   string          SWAPSPACE2      Linux/i386 swap file (new style)
->0x400 long            x               %d (4K pages)
->0x404 long            x               size %d pages
-# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
-#
-#      from Erik Troan (ewt@redhat.com) examining od dumps, so this
-#              could be wrong
-#      updated by David Mosberger (davidm@azstarnet.com) based on
-#      GNU BFD and MIPS info found below.
-#
-0      leshort         0x0183          ECOFF alpha
->24    leshort         0407            executable
->24    leshort         0410            pure
->24    leshort         0413            demand paged
->8     long            >0              not stripped
->8     long            0               stripped
->23    leshort         >0              - version %ld.
-#
-# Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu>
-# and others such as Axel Kohlmeyer <akohlmey@rincewind.chemie.uni-ulm.de>
-# and Nicolás Lichtmaier <nick@debian.org>
-# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
-# Linux kernel boot images (i386 arch) (Wolfram Kleff)
-514    string          HdrS            Linux kernel
->510   leshort         0xAA55          x86 boot executable
->>518  leshort         >=3D0x200
->>529  byte            0               zImage,
->>>529 byte            1               bzImage,
->>>(526.s+0x200) string        >\0             version %s,
->>498  leshort         1               RO-rootFS,
->>498  leshort         0               RW-rootFS,
->>508  leshort         >0              root_dev 0x%X,
->>502  leshort         >0              swap_dev 0x%X,
->>504  leshort         >0              RAMdisksize %u KB,
->>506  leshort         0xFFFF          Normal VGA
->>506  leshort         0xFFFE          Extended VGA
->>506  leshort         0xFFFD          Prompt for Videomode
->>506  leshort         >0              Video mode %d
-# This also matches new kernels, which were caught above by "HdrS".
-0              belong  0xb8c0078e      Linux kernel
->0x1e3         string  Loading         version 1.3.79 or older
->0x1e9         string  Loading         from prehistoric times
-
-# System.map files - Nicolás Lichtmaier <nick@debian.org>
-8      string  \ A\ _text      Linux kernel symbol map text
-
-# LSM entries - Nicolás Lichtmaier <nick@debian.org>
-0      string  Begin3  Linux Software Map entry text
-0      string  Begin4  Linux Software Map entry text (new format)
-
-# From Matt Zimmerman
-0       belong  0x4f4f4f4d      User-mode Linux COW file
->4      belong  x               \b, version %d
->8      string  >\0             \b, backing file %s
-
-############################################################################
-# Linux kernel versions
-
-0              string          \xb8\xc0\x07\x8e\xd8\xb8\x00\x90        Linux
->497           leshort         0               x86 boot sector
->>514          belong          0x8e    of a kernel from the dawn of time!
->>514          belong          0x908ed8b4      version 0.99-1.1.42
->>514          belong          0x908ed8b8      for memtest86
-
->497           leshort         !0              x86 kernel
->>504          leshort         >0              RAMdisksize=%u KB
->>502          leshort         >0              swap=0x%X
->>508          leshort         >0              root=0x%X
->>>498         leshort         1               \b-ro
->>>498         leshort         0               \b-rw
->>506          leshort         0xFFFF          vga=normal
->>506          leshort         0xFFFE          vga=extended
->>506          leshort         0xFFFD          vga=ask
->>506          leshort         >0              vga=%d
->>514          belong          0x908ed881      version 1.1.43-1.1.45
->>514          belong          0x15b281cd
->>>0xa8e       belong          0x55AA5a5a      version 1.1.46-1.2.13,1.3.0
->>>0xa99       belong          0x55AA5a5a      version 1.3.1,2
->>>0xaa3       belong          0x55AA5a5a      version 1.3.3-1.3.30
->>>0xaa6       belong          0x55AA5a5a      version 1.3.31-1.3.41
->>>0xb2b       belong          0x55AA5a5a      version 1.3.42-1.3.45
->>>0xaf7       belong          0x55AA5a5a      version 1.3.46-1.3.72
->>514          string          HdrS
->>>518         leshort         >0x1FF
->>>>529                byte            0               \b, zImage
->>>>529                byte            1               \b, bzImage
->>>>(526.s+0x200) string       >\0             \b, version %s
-
-# Linux boot sector thefts.
-0              belong          0xb8c0078e      Linux
->0x1e6         belong          0x454c4b53      ELKS Kernel
->0x1e6         belong          !0x454c4b53     style boot sector
-
-############################################################################
-# Linux 8086 executable
-0      lelong&0xFF0000FF 0xC30000E9    Linux-Dev86 executable, headerless
->5     string          .               
->>4    string          >\0             \b, libc version %s
-
-0      lelong&0xFF00FFFF 0x4000301     Linux-8086 executable
->2     byte&0x01       !0              \b, unmapped zero page
->2     byte&0x20       0               \b, impure
->2     byte&0x20       !0
->>2    byte&0x10       !0              \b, A_EXEC
->2     byte&0x02       !0              \b, A_PAL
->2     byte&0x04       !0              \b, A_NSYM
->2     byte&0x08       !0              \b, A_STAND
->2     byte&0x40       !0              \b, A_PURE
->2     byte&0x80       !0              \b, A_TOVLY
->28     long            !0              \b, not stripped
->37    string          .               
->>36   string          >\0             \b, libc version %s
-
-# 0    lelong&0xFF00FFFF 0x10000301    ld86 I80386 executable
-# 0    lelong&0xFF00FFFF 0xB000301     ld86 M68K executable
-# 0    lelong&0xFF00FFFF 0xC000301     ld86 NS16K executable
-# 0    lelong&0xFF00FFFF 0x17000301    ld86 SPARC executable
-
-# SYSLINUX boot logo files (from 'ppmtolss16' sources)
-# http://syslinux.zytor.com/
-#
-0      lelong  =0x1413f33d             SYSLINUX' LSS16 image data
->4     leshort x                       \b, width %d
->6     leshort x                       \b, height %d
-#------------------------------------------------------------------------------
-# mime:  file(1) magic for MIME encoded files
-#
-0      string          Content-Type:\
->14    string          >\0             %s
-0      string          Content-Type:
->13    string          >\0             %s
-
-#------------------------------------------------------------------------------
-# zilog:  file(1) magic for Zilog Z8000.
-#
-# Was it big-endian or little-endian?  My Product Specification doesn't
-# say.
-#
-0      long            0xe807          object file (z8000 a.out)
-0      long            0xe808          pure object file (z8000 a.out)
-0      long            0xe809          separate object file (z8000 a.out)
-0      long            0xe805          overlay object file (z8000 a.out)
-
-#------------------------------------------------------------------------------
-# sgi:  file(1) magic for Silicon Graphics applications
-
-#
-#
-# Performance Co-Pilot file types
-0      string  PmNs                            PCP compiled namespace (V.0)
-0      string  PmN                             PCP compiled namespace
->3     string  >\0                             (V.%1.1s)
-3      lelong  0x84500526                      PCP archive
->7     byte    x                               (V.%d)
->20    lelong  -2                              temporal index
->20    lelong  -1                              metadata
->20    lelong  0                               log volume #0
->20    lelong  >0                              log volume #%ld
->24    string  >\0                             host: %s
-0      string  PCPFolio                        PCP 
->9     string  Version:                        Archive Folio
->18    string  >\0                             (V.%s)
-0      string  #pmchart                        PCP pmchart view
->9     string  Version
->17    string  >\0                             (V%-3.3s)
-0      string  pmview                          PCP pmview config
->7     string  Version
->15    string  >\0                             (V%-3.3s)
-0      string  #pmlogger                       PCP pmlogger config
->10    string  Version
->18    string  >\0                             (V%1.1s)
-0      string  PcPh                            PCP Help 
->4     string  1                               Index
->4     string  2                               Text
->5     string  >\0                             (V.%1.1s)
-0      string  #pmieconf-rules                 PCP pmieconf rules
->16    string  >\0                             (V.%1.1s)
-3      string  pmieconf-pmie                   PCP pmie config
->17    string  >\0                             (V.%1.1s)
-
-# SpeedShop data files
-0      lelong  0x13130303                      SpeedShop data file
-
-# mdbm files
-0      lelong  0x01023962                      mdbm file, version 0 (obsolete)
-0      string  mdbm                            mdbm file,
->5     byte    x                               version %d,
->6     byte    x                               2^%d pages,
->7     byte    x                               pagesize 2^%d,
->17    byte    x                               hash %d,
->11    byte    x                               dataformat %d
-
-# Alias|Wavefront Maya files
-0      string  //Maya ASCII    Alias|Wavefront Maya Ascii File,
->13    string  >\0     version %s
-8      string  MAYAFOR4        Alias|Wavefront Maya Binary File,
->32    string  >\0     version %s scene
-8      string  MayaFOR4        Alias|Wavefront Maya Binary File,
->32    string  >\0     version %s scene
-8      string  CIMG            Alias|Wavefront Maya Image File
-8      string  DEEP            Alias|Wavefront Maya Image File
-
-#------------------------------------------------------------------------------
-# sequent:  file(1) magic for Sequent machines
-#
-# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
-# For Sequent's multiprocessor systems (incomplete).
-0      lelong  0x00ea          BALANCE NS32000 .o
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-0      lelong  0x10ea          BALANCE NS32000 executable (0 @ 0)
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-0      lelong  0x20ea          BALANCE NS32000 executable (invalid @ 0)
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-0      lelong  0x30ea          BALANCE NS32000 standalone executable
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-#
-# Symmetry information added by Jason Merrill <jason@jarthur.claremont.edu>.
-# Symmetry magic nums will not be reached if DOS COM comes before them;
-# byte 0xeb is matched before these get a chance.
-0      leshort 0x12eb          SYMMETRY i386 .o
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-0      leshort 0x22eb          SYMMETRY i386 executable (0 @ 0)
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-0      leshort 0x32eb          SYMMETRY i386 executable (invalid @ 0)
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-0      leshort 0x42eb          SYMMETRY i386 standalone executable
->16    lelong  >0              not stripped
->124   lelong  >0              version %ld
-
-#------------------------------------------------------------------------------
-# blit:  file(1) magic for 68K Blit stuff as seen from 680x0 machine
-#
-# Note that this 0407 conflicts with several other a.out formats...
-#
-# XXX - should this be redone with "be" and "le", so that it works on
-# little-endian machines as well?  If so, what's the deal with
-# "VAX-order" and "VAX-order2"?
-#
-#0     long            0407            68K Blit (standalone) executable
-#0     short           0407            VAX-order2 68K Blit (standalone) executable
-0      short           03401           VAX-order 68K Blit (standalone) executable
-0      long            0406            68k Blit mpx/mux executable
-0      short           0406            VAX-order2 68k Blit mpx/mux executable
-0      short           03001           VAX-order 68k Blit mpx/mux executable
-# Need more values for WE32 DMD executables.
-# Note that 0520 is the same as COFF
-#0     short           0520            tty630 layers executable
-#------------------------------------------------------------------------------
-# impulse tracker:  file(1) magic for Impulse Tracker data files
-#
-# From <collver1@attbi.com>
-# These are the /etc/magic entries to decode modules, instruments, and
-# samples in Impulse Tracker's native format.
-
-0      string          IMPS            Impulse Tracker Sample
->18    byte            &2              16 bit
->18    byte            ^2              8 bit
->18    byte            &4              stereo
->18    byte            ^4              mono
-0      string          IMPI            Impulse Tracker Instrument
->28    leshort         !0              ITv%x
->30    byte            !0              %d samples
-0      string          IMPM            Impulse Tracker Module
->40    leshort         !0              compatible w/ITv%x
->42    leshort         !0              created w/ITv%x
-
-#------------------------------------------------------------------------------
-# island:  file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1
-# "/etc/magic":
-# From: guy@netapp.com (Guy Harris)
-#
-4      string          pgscriptver     IslandWrite document
-13     string          DrawFile        IslandDraw document
-
-
-#------------------------------------------------------------------------------
-# maple:  file(1) magic for maple files
-# "H. Nanosecond" <aldomel@ix.netcom.com>
-# Maple V release 4, a multi-purpose math program
-#
-
-# maple library .lib
-0      string  \000MVR4\nI     MapleVr4 library
-
-# .ind
-# no magic for these :-(
-# they are compiled indexes for maple files
-
-# .hdb 
-0      string  \000\004\000\000        Maple help database
-
-# .mhp
-# this has the form <PACKAGE=name>
-0      string  \<PACKAGE=      Maple help file
-0      string  \<HELP\ NAME=   Maple help file
-0      string  \n\<HELP\ NAME= Maple help file with extra carriage return at start (yuck)
-#0     string  #\ Newton       Maple help file, old style
-0      string  #\ daub Maple help file, old style
-#0     string  #===========    Maple help file, old style
-
-# .mws
-0      string  \000\000\001\044\000\221        Maple worksheet
-#this is anomalous
-0      string  WriteNow\000\002\000\001\000\000\000\000\100\000\000\000\000\000        Maple worksheet, but weird
-# this has the form {VERSION 2 3 "IBM INTEL NT" "2.3" }\n
-# that is {VERSION major_version miunor_version computer_type version_string}
-0      string  {VERSION\       Maple worksheet
->9     string  >\0     version %.1s.
->>10   string
->>>11  string  >\0     %.1s
-
-# .mps
-0      string  \0\0\001$       Maple something
-# from byte 4 it is either 'nul E' or 'soh R'
-# I think 'nul E' means a file that was saved as  a different name
-# a sort of revision marking
-# 'soh R' means new 
->4     string  \000\105        An old revision
->4     string  \001\122        The latest save
-
-# .mpl
-# some of these are the same as .mps above
-#0000000 000 000 001 044 000 105 same as .mps
-#0000000 000 000 001 044 001 122 same as .mps
-
-0      string  #\n##\ <SHAREFILE=      Maple something
-0      string  \n#\n##\ <SHAREFILE=    Maple something
-0      string  ##\ <SHAREFILE= Maple something
-0      string  #\r##\ <SHAREFILE=      Maple something
-0      string  \r#\r##\ <SHAREFILE=    Maple something
-0      string  #\ \r##\ <DESCRIBE>     Maple something anomalous.
-#
-# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-#    must display the following acknowledgement:
-#      This product includes software developed by Ignatios Souvatzis for
-#      the NetBSD project.
-# 4. The name of the author may not be used to endorse or promote products
-#    derived from this software without specific prior written permission.
-#
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-#
-#
-# OS9/6809 module descriptions:
-#
-0      beshort         0x87CD  OS9/6809 module:
-#
->6     byte&0x0f       0x00    non-executable
->6     byte&0x0f       0x01    machine language
->6     byte&0x0f       0x02    BASIC I-code
->6     byte&0x0f       0x03    Pascal P-code
->6     byte&0x0f       0x04    C I-code
->6     byte&0x0f       0x05    COBOL I-code
->6     byte&0x0f       0x06    Fortran I-code
-#
->6     byte&0xf0       0x10    program executable
->6     byte&0xf0       0x20    subroutine
->6     byte&0xf0       0x30    multi-module
->6     byte&0xf0       0x40    data module
-#
->6     byte&0xf0       0xC0    system module
->6     byte&0xf0       0xD0    file manager
->6     byte&0xf0       0xE0    device driver
->6     byte&0xf0       0xF0    device descriptor
-#
-# OS9/m68k stuff (to be continued)
-#
-0      beshort         0x4AFC  OS9/68K module:
-#
-# attr
->0x14  byte&0x80       0x80    re-entrant
->0x14  byte&0x40       0x40    ghost
->0x14  byte&0x20       0x20    system-state
-#
-# lang:
-#
->0x13  byte            1       machine language
->0x13  byte            2       BASIC I-code
->0x13  byte            3       Pascal P-code
->0x13  byte            4       C I-code
->0x13  byte            5       COBOL I-code
->0x13  byte            6       Fortran I-code
-#
-#
-# type:
-#
->0x12  byte            1       program executable
->0x12  byte            2       subroutine
->0x12  byte            3       multi-module
->0x12  byte            4       data module
->0x12  byte            11      trap library
->0x12  byte            12      system module
->0x12  byte            13      file manager
->0x12  byte            14      device driver
->0x12  byte            15      device descriptor
-
-#------------------------------------------------------------------------------
-# pkgadd:  file(1) magic for SysV R4 PKG Datastreams
-#
-0       string          #\ PaCkAgE\ DaTaStReAm  pkg Datastream (SVR4)
-
-#------------------------------------------------------------------------------
-# xo65 object files
-# From: "Ullrich von Bassewitz" <uz@cc65.org>
-#
-0      string          \x55\x7A\x6E\x61        xo65 object,
->4     leshort         x                       version %d,
->6     leshort&0x0001 =0x0001                  with debug info
->6     leshort&0x0001 =0x0000                  no debug info
-
-# xo65 library files
-0      string          \x6E\x61\x55\x7A        xo65 library,
->4     leshort         x                       version %d
-
-# o65 object files
-0      string          \x01\x00\x6F\x36\x35    o65
->6     leshort&0x1000  =0x0000                 executable,
->6     leshort&0x1000  =0x1000                 object,
->5     byte            x                       version %d,
->6     leshort&0x8000  =0x8000                 65816,
->6     leshort&0x8000  =0x0000                 6502,
->6     leshort&0x2000  =0x2000                 32 bit,
->6     leshort&0x2000  =0x0000                 16 bit,
->6     leshort&0x4000  =0x4000                 page reloc,
->6     leshort&0x4000  =0x0000                 byte reloc,
->6     leshort&0x0003  =0x0000                 alignment 1
->6     leshort&0x0003  =0x0001                 alignment 2
->6     leshort&0x0003  =0x0002                 alignment 4
->6     leshort&0x0003  =0x0003                 alignment 256
-#------------------------------------------------------------------------------
-# Virtutech Compressed Random Access File Format
-#
-# From <gustav@virtutech.com>
-0      string          \211\277\036\203        Virtutech CRAFF
->4     belong          x               v%d
->20    belong          0               uncompressed
->20    belong          1               bzipp2ed
->20    belong          2               gzipped
->24    belong          0               not clean
-
-#------------------------------------------------------------------------------
-# uuencode:  file(1) magic for ASCII-encoded files
-#
-
-# GRR:  the first line of xxencoded files is identical to that in uuencoded
-# files, but the first character in most subsequent lines is 'h' instead of
-# 'M'.  (xxencoding uses lowercase letters in place of most of uuencode's
-# punctuation and survives BITNET gateways better.)  If regular expressions
-# were supported, this entry could possibly be split into two with
-# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs).
-0      string          begin\040       uuencoded or xxencoded text
-
-# btoa(1) is an alternative to uuencode that requires less space.
-0      string          xbtoa\ Begin    btoa'd text
-
-# ship(1) is another, much cooler alternative to uuencode.
-# Greg Roelofs, newt@uchicago.edu
-0      string          $\012ship       ship'd binary text
-
-# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)
-# Greg Roelofs, newt@uchicago.edu
-0      string  Decode\ the\ following\ with\ bdeco     bencoded News text
-
-# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
-# Daniel Quinlan, quinlan@yggdrasil.com
-11     string  must\ be\ converted\ with\ BinHex       BinHex binary text
->41    string  x                                       \b, version %.3s
-
-# GRR:  is MIME BASE64 encoding handled somewhere?
-#------------------------------------------------------------------------------
-# amanda:  file(1) magic for amanda file format
-#
-0      string  AMANDA:\                AMANDA 
->8     string  TAPESTART\ DATE         tape header file,
->>23   string  X
->>>25  string  >\                      Unused %s
->>23   string  >\                      DATE %s
->8     string  FILE\                   dump file,
->>13   string  >\                      DATE %s
-
-#------------------------------------------------------------------------------
-# audio:  file(1) magic for sound formats (see also "iff")
-#
-# Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),
-# and others
-#
-
-# Sun/NeXT audio data
-0      string          .snd            Sun/NeXT audio data:
->12    belong          1               8-bit ISDN mu-law,
->12    belong          2               8-bit linear PCM [REF-PCM],
->12    belong          3               16-bit linear PCM,
->12    belong          4               24-bit linear PCM,
->12    belong          5               32-bit linear PCM,
->12    belong          6               32-bit IEEE floating point,
->12    belong          7               64-bit IEEE floating point,
->12    belong          8               Fragmented sample data,
->12    belong          10              DSP program,
->12    belong          11              8-bit fixed point,
->12    belong          12              16-bit fixed point,
->12    belong          13              24-bit fixed point,
->12    belong          14              32-bit fixed point,
->12    belong          18              16-bit linear with emphasis,
->12    belong          19              16-bit linear compressed,
->12    belong          20              16-bit linear with emphasis and compression,
->12    belong          21              Music kit DSP commands,
->12    belong          23              8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
->12    belong          24              compressed (8-bit CCITT G.722 ADPCM)
->12    belong          25              compressed (3-bit CCITT G.723.3 ADPCM),
->12    belong          26              compressed (5-bit CCITT G.723.5 ADPCM),
->12    belong          27              8-bit A-law (CCITT G.711),
->20    belong          1               mono,
->20    belong          2               stereo,
->20    belong          4               quad,
->16    belong          >0              %d Hz
-
-# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
-# that uses little-endian encoding and has a different magic number
-0      lelong          0x0064732E      DEC audio data:
->12    lelong          1               8-bit ISDN mu-law,
->12    lelong          2               8-bit linear PCM [REF-PCM],
->12    lelong          3               16-bit linear PCM,
->12    lelong          4               24-bit linear PCM,
->12    lelong          5               32-bit linear PCM,
->12    lelong          6               32-bit IEEE floating point,
->12    lelong          7               64-bit IEEE floating point,
->12    belong          8               Fragmented sample data,
->12    belong          10              DSP program,
->12    belong          11              8-bit fixed point,
->12    belong          12              16-bit fixed point,
->12    belong          13              24-bit fixed point,
->12    belong          14              32-bit fixed point,
->12    belong          18              16-bit linear with emphasis,
->12    belong          19              16-bit linear compressed,
->12    belong          20              16-bit linear with emphasis and compression,
->12    belong          21              Music kit DSP commands,
->12    lelong          23              8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
->12    belong          24              compressed (8-bit CCITT G.722 ADPCM)
->12    belong          25              compressed (3-bit CCITT G.723.3 ADPCM),
->12    belong          26              compressed (5-bit CCITT G.723.5 ADPCM),
->12    belong          27              8-bit A-law (CCITT G.711),
->20    lelong          1               mono,
->20    lelong          2               stereo,
->20    lelong          4               quad,
->16    lelong          >0              %d Hz
-
-# Creative Labs AUDIO stuff
-0      string  MThd                    Standard MIDI data
->8     beshort x                       (format %d)
->10    beshort x                       using %d track
->10    beshort         >1              \bs
->12    beshort&0x7fff  x               at 1/%d
->12    beshort&0x8000  >0              SMPTE
-
-0      string  CTMF                    Creative Music (CMF) data
-0      string  SBI                     SoundBlaster instrument data
-0      string  Creative\ Voice\ File   Creative Labs voice data
-# is this next line right?  it came this way...
->19    byte    0x1A
->23    byte    >0                      - version %d
->22    byte    >0                      \b.%d
-
-# first entry is also the string "NTRK"
-0      belong          0x4e54524b      MultiTrack sound data
->4     belong          x               - version %ld
-
-# Extended MOD format (*.emd) (Greg Roelofs, newt@uchicago.edu); NOT TESTED
-# [based on posting 940824 by "Dirk/Elastik", husberg@lehtori.cc.tut.fi]
-0      string          EMOD            Extended MOD sound data,
->4     byte&0xf0       x               version %d
->4     byte&0x0f       x               \b.%d,
->45    byte            x               %d instruments
->83    byte            0               (module)
->83    byte            1               (song)
-
-# Real Audio (Magic .ra\0375)
-0      belong          0x2e7261fd      RealAudio sound file
-0      string          .RMF            RealMedia file
-
-# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert@dialin.ind.net]
-# Oct 31, 1995
-# fixed by <doj@cubic.org> 2003-06-24
-# Too short...
-#0     string          MTM             MultiTracker Module sound file
-#0     string          if              Composer 669 Module sound data
-#0     string          JN              Composer 669 Module sound data (extended format)
-0      string          MAS_U           ULT(imate) Module sound data
-
-#0     string          FAR             Module sound data
-#>4    string          >\15            Title: "%s"
-
-0x2c   string          SCRM            ScreamTracker III Module sound data
->0     string          >\0             Title: "%s"
-
-# Gravis UltraSound patches
-# From <ache@nagual.ru>
-
-0      string          GF1PATCH110\0ID#000002\0        GUS patch
-0      string          GF1PATCH100\0ID#000002\0        Old GUS patch
-
-#
-# Taken from loader code from mikmod version 2.14
-# by Steve McIntyre (stevem@chiark.greenend.org.uk)
-# <doj@cubic.org> added title printing on 2003-06-24
-0      string  MAS_UTrack_V00
->14    string  >/0             ultratracker V1.%.1s module sound data
-
-0      string  UN05            MikMod UNI format module sound data
-
-0      string  Extended\ Module: Fasttracker II module sound data
->17    string  >\0             Title: "%s"
-
-21     string/c        !SCREAM!        Screamtracker 2 module sound data
-21     string  BMOD2STM        Screamtracker 2 module sound data
-1080   string  M.K.            4-channel Protracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  M!K!            4-channel Protracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  FLT4            4-channel Startracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  FLT8            8-channel Startracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  4CHN            4-channel Fasttracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  6CHN            6-channel Fasttracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  8CHN            8-channel Fasttracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  CD81            8-channel Octalyser module sound data
->0     string  >\0             Title: "%s"
-1080   string  OKTA            8-channel Oktalyzer module sound data
->0     string  >\0             Title: "%s"
-# Not good enough.
-#1082  string  CH
-#>1080 string  >/0             %.2s-channel Fasttracker "oktalyzer" module sound data
-1080   string  16CN            16-channel Taketracker module sound data
->0     string  >\0             Title: "%s"
-1080   string  32CN            32-channel Taketracker module sound data
->0     string  >\0             Title: "%s"
-
-# TOC sound files -Trevor Johnson <trevor@jpj.net>
-#
-0       string          TOC             TOC sound file
-
-# sidfiles <pooka@iki.fi>
-# added name,author,(c) and new RSID type by <doj@cubic.org> 2003-06-24
-0      string          SIDPLAY\ INFOFILE       Sidplay info file
-
-0      string          PSID                    PlaySID v2.2+ (AMIGA) sidtune
->4     beshort         >0                      w/ header v%d,
->14    beshort         =1                      single song,
->14    beshort         >1                      %d songs,
->16    beshort         >0                      default song: %d
->0x16  string          >\0                     name: "%s"
->0x36  string          >\0                     author: "%s"
->0x56  string          >\0                     copyright: "%s"
-
-0      string          RSID                    RSID sidtune PlaySID compatible
->4     beshort         >0                      w/ header v%d,
->14    beshort         =1                      single song,
->14    beshort         >1                      %d songs,
->16    beshort         >0                      default song: %d
->0x16  string          >\0                     name: "%s"
->0x36  string          >\0                     author: "%s"
->0x56  string          >\0                     copyright: "%s"
-
-# IRCAM <mpruett@sgi.com>
-# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
-0      belong          0x64a30100              IRCAM file (VAX)
-0      belong          0x64a30200              IRCAM file (Sun)
-0      belong          0x64a30300              IRCAM file (MIPS little-endian)
-0      belong          0x64a30400              IRCAM file (NeXT)
-
-# NIST SPHERE <mpruett@sgi.com>
-0      string          NIST_1A\n\ \ \ 1024\n   NIST SPHERE file
-
-# Sample Vision <mpruett@sgi.com>
-0      string          SOUND\ SAMPLE\ DATA\    Sample Vision file
-
-# Audio Visual Research <tonigonenstein@users.sourceforge.net>
-0      string          2BIT                    Audio Visual Research file,
->12    beshort         =0                      mono,
->12    beshort         =-1                     stereo,
->14    beshort         x                       %d bits
->16    beshort         =0                      unsigned,
->16    beshort         =-1                     signed,
->22    belong&0x00ffffff       x               %d Hz,
->18    beshort         =0                      no loop,
->18    beshort         =-1                     loop,
->21    ubyte           <=127                   note %d,
->22    byte            =0                      replay 5.485 KHz
->22    byte            =1                      replay 8.084 KHz
->22    byte            =2                      replay 10.971 Khz
->22    byte            =3                      replay 16.168 Khz
->22    byte            =4                      replay 21.942 KHz
->22    byte            =5                      replay 32.336 KHz
->22    byte            =6                      replay 43.885 KHz
->22    byte            =7                      replay 47.261 KHz
-
-# SGI SoundTrack <mpruett@sgi.com>
-0      string          _SGI_SoundTrack         SGI SoundTrack project file
-# ID3 version 2 tags <waschk@informatik.uni-rostock.de>
-0      string          ID3     MP3 file with ID3 version 2.
->3     ubyte   <0xff   \b%d.
->4     ubyte   <0xff   \b%d tag
-
-# NSF (NES sound file) magic
-0      string          NESM\x1a        NES Sound File
->14    string          >\0             ("%s" by
->46    string          >\0             %s, copyright
->78    string          >\0             %s),
->5     byte            x               version %d,
->6     byte            x               %d tracks,
->122   byte&0x2        =1              dual PAL/NTSC
->122   byte&0x1        =1              PAL
->122   byte&0x1        =0              NTSC
-
-# Impuse tracker module (audio/x-it)
-0      string          IMPM            Impulse Tracker module sound data -
->4     string          >\0             "%s"
->40    leshort         !0              compatible w/ITv%x
->42    leshort         !0              created w/ITv%x
-
-# Imago Orpheus module (audio/x-imf)
-60     string          IM10            Imago Orpheus module sound data -
->0     string          >\0             "%s"
-
-# From <collver1@attbi.com>
-# These are the /etc/magic entries to decode modules, instruments, and
-# samples in Impulse Tracker's native format.
-
-0      string          IMPS            Impulse Tracker Sample
->18    byte            &2              16 bit
->18    byte            ^2              8 bit
->18    byte            &4              stereo
->18    byte            ^4              mono
-0      string          IMPI            Impulse Tracker Instrument
->28    leshort         !0              ITv%x
->30    byte            !0              %d samples
-
-# Yamaha TX Wave:  file(1) magic for Yamaha TX Wave audio files
-# From <collver1@attbi.com>
-0      string          LM8953          Yamaha TX Wave
->22    byte            0x49            looped
->22    byte            0xC9            non-looped
->23    byte            1               33kHz
->23    byte            2               50kHz
->23    byte            3               16kHz
-
-# scream tracker:  file(1) magic for Scream Tracker sample files
-#
-# From <collver1@attbi.com>
-76     string          SCRS            Scream Tracker Sample
->0     byte            1               sample
->0     byte            2               adlib melody
->0     byte            >2              adlib drum
->31    byte            &2              stereo
->31    byte            ^2              mono
->31    byte            &4              16bit little endian
->31    byte            ^4              8bit
->30    byte            0               unpacked
->30    byte            1               packed
-
-# audio
-# From: Cory Dikkers <cdikkers@swbell.net>
-0      string          MMD0            MED music file, version 0
-0      string          MMD1            OctaMED Pro music file, version 1
-0      string          MMD3            OctaMED Soundstudio music file, version 3
-0      string          OctaMEDCmpr     OctaMED Soundstudio compressed file
-0      string          MED             MED_Song
-0      string          SymM            Symphonie SymMOD music file
-#
-0      string          THX             AHX version
->3     byte            =0              1 module data
->3     byte            =1              2 module data
-#
-0      string          OKTASONG        Oktalyzer module data
-#
-0      string          DIGI\ Booster\ module\0 %s
->20    byte            >0              %c
->>21   byte            >0              \b%c
->>>22  byte            >0              \b%c
->>>>23 byte            >0              \b%c
->610   string          >\0             \b, "%s"
-#
-0      string          DBM0            DIGI Booster Pro Module
->4     byte            >0              V%X.
->>5    byte            x               \b%02X
->16    string          >\0             \b, "%s"
-#
-0      string          FTMN            FaceTheMusic module
->16    string          >\0d            \b, "%s"
-
-# From: <doj@cubic.org> 2003-06-24
-0      string          AMShdr\32       Velvet Studio AMS Module v2.2
-0      string          Extreme         Extreme Tracker AMS Module v1.3
-0      string          DDMF            Xtracker DMF Module
->4     byte            x               v%i
->0xD   string          >\0             Title: "%s"
->0x2B  string          >\0             Composer: "%s"
-0      string          DSM\32          Dynamic Studio Module DSM
-0      string          SONG            DigiTrekker DTM Module
-0      string          DMDL            DigiTrakker MDL Module
-0      string          PSM\32          Protracker Studio PSM Module
-44     string          PTMF            Poly Tracker PTM Module
->0     string          >\32            Title: "%s"
-0      string          MT20            MadTracker 2.0 Module MT2
-0      string          RAD\40by\40REALiTY!! RAD Adlib Tracker Module RAD
-0      string          RTMM            RTM Module
-0x426  string          MaDoKaN96       XMS Adlib Module
->0     string          >\0             Composer: "%s"
-0      string          AMF             AMF Module
->4     string          >\0             Title: "%s"
-0      string          MODINFO1        Open Cubic Player Module Inforation MDZ
-0      string          Extended\40Instrument: Fast Tracker II Instrument
-
-# From: Takeshi Hamasaki <hma@syd.odn.ne.jp>
-# NOA Nancy Codec file
-0      string          \210NOA\015\012\032     NOA Nancy Codec Movie file
-# Yamaha SMAF format
-0      string          MMMD            Yamaha SMAF file
-# Sharp Jisaku Melody format for PDC
-0      string          \001Sharp\040JisakuMelody       SHARP Cell-Phone ringing Melody
->20    string          Ver01.00        Ver. 1.00
->>32   byte            x               , %d tracks
-
-# Free lossless audio codec <http://flac.sourceforge.net>
-# From: Przemyslaw Augustyniak <silvathraec@rpg.pl>
-0      string                  fLaC            FLAC audio bitstream data
->4     byte&0x7f               >0              \b, unknown version
->4     byte&0x7f               0               \b
-# some common bits/sample values
->>20   beshort&0x1f0           0x030           \b, 4 bit
->>20   beshort&0x1f0           0x050           \b, 6 bit
->>20   beshort&0x1f0           0x070           \b, 8 bit
->>20   beshort&0x1f0           0x0b0           \b, 12 bit
->>20   beshort&0x1f0           0x0f0           \b, 16 bit
->>20   beshort&0x1f0           0x170           \b, 24 bit
->>20   byte&0xe                0x0             \b, mono
->>20   byte&0xe                0x2             \b, stereo
->>20   byte&0xe                0x4             \b, 3 channels
->>20   byte&0xe                0x6             \b, 4 channels
->>20   byte&0xe                0x8             \b, 5 channels
->>20   byte&0xe                0xa             \b, 6 channels
->>20   byte&0xe                0xc             \b, 7 channels
->>20   byte&0xe                0xe             \b, 8 channels
-# some common sample rates
->>17   belong&0xfffff0         0x0ac440        \b, 44.1 kHz
->>17   belong&0xfffff0         0x0bb800        \b, 48 kHz
->>17   belong&0xfffff0         0x07d000        \b, 32 kHz
->>17   belong&0xfffff0         0x056220        \b, 22.05 kHz
->>17   belong&0xfffff0         0x05dc00        \b, 24 kHz
->>17   belong&0xfffff0         0x03e800        \b, 16 kHz
->>17   belong&0xfffff0         0x02b110        \b, 11.025 kHz
->>17   belong&0xfffff0         0x02ee00        \b, 12 kHz
->>17   belong&0xfffff0         0x01f400        \b, 8 kHz
->>17   belong&0xfffff0         0x177000        \b, 96 kHz
->>17   belong&0xfffff0         0x0fa000        \b, 64 kHz
->>21   byte&0xf                >0              \b, >4G samples
->>21   byte&0xf                0               \b
->>>22  belong                  >0              \b, %u samples
->>>22  belong                  0               \b, length unknown
-
-# (ISDN) VBOX voice message file (Wolfram Kleff)
-0       string          VBOX            VBOX voice message data
-
-# ReBorn Song Files (.rbs)
-# David J. Singer <doc@deadvirgins.org.uk>
-8       string          RB40             RBS Song file
->29     string          ReBorn           created by ReBorn
->37     string          Propellerhead    created by ReBirth
-
-# Synthesizer Generator and Kimwitu share their file format
-0      string          A#S#C#S#S#L#V#3     Synthesizer Generator or Kimwitu data
-# Kimwitu++ uses a slightly different magic
-0      string          A#S#C#S#S#L#HUB     Kimwitu++ data
-
-# From "Simon Hosie
-0       string  TFMX-SONG       TFMX module sound data
-
-# From danny.milo@gmx.net (Danny Milosavljevic)
-# monkeysaudio for magic.mime
-0      string  MAC\    X/Monkey audio,
->4     leshort >0      version %d,
->6     leshort >0      compression level %d,
->8     leshort >0      flags %x,
->10    leshort >0      channels %d,
->12    lelong  >0      samplerate %d,
->24    lelong  >0      frames %d
-
-#------------------------------------------------------------------------------
-# bsdi:  file(1) magic for BSD/OS (from BSDI) objects
-#
-
-0      lelong          0314            386 compact demand paged pure executable
->16    lelong          >0              not stripped
->32    byte            0x6a            (uses shared libs)
-
-0      lelong          0407            386 executable
->16    lelong          >0              not stripped
->32    byte            0x6a            (uses shared libs)
-
-0      lelong          0410            386 pure executable
->16    lelong          >0              not stripped
->32    byte            0x6a            (uses shared libs)
-
-0      lelong          0413            386 demand paged pure executable
->16    lelong          >0              not stripped
->32    byte            0x6a            (uses shared libs)
-
-# same as in SunOS 4.x, except for static shared libraries
-0      belong&077777777        0600413         sparc demand paged
->0     byte            &0x80
->>20   belong          <4096           shared library
->>20   belong          =4096           dynamically linked executable
->>20   belong          >4096           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
->36    belong          0xb4100001      (uses shared libs)
-
-0      belong&077777777        0600410         sparc pure
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
->36    belong          0xb4100001      (uses shared libs)
-
-0      belong&077777777        0600407         sparc
->0     byte            &0x80           dynamically linked executable
->0     byte            ^0x80           executable
->16    belong          >0              not stripped
->36    belong          0xb4100001      (uses shared libs)
-
-#------------------------------------------------------------------------------
-# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files
-# From Roger Leigh <roger@whinlatter.uklinux.net>
-0       string          FCS1.0          Flow Cytometry Standard (FCS) data, version 1.0
-0       string          FCS2.0          Flow Cytometry Standard (FCS) data, version 2.0
-0       string          FCS3.0          Flow Cytometry Standard (FCS) data, version 3.0
-
-
-#------------------------------------------------------------------------------
-# intel:  file(1) magic for x86 Unix
-#
-# Various flavors of x86 UNIX executable/object (other than Xenix, which
-# is in "microsoft").  DOS is in "msdos"; the ambitious soul can do
-# Windows as well.
-#
-# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
-# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere
-# as well, if, as, and when IBM makes it portable.
-#
-# The `versions' should be un-commented if they work for you.
-# (Was the problem just one of endianness?)
-#
-0      leshort         0502            basic-16 executable
->12    lelong          >0              not stripped
-#>22   leshort         >0              - version %ld
-0      leshort         0503            basic-16 executable (TV)
->12    lelong          >0              not stripped
-#>22   leshort         >0              - version %ld
-0      leshort         0510            x86 executable
->12    lelong          >0              not stripped
-0      leshort         0511            x86 executable (TV)
->12    lelong          >0              not stripped
-0      leshort         =0512           iAPX 286 executable small model (COFF)
->12    lelong          >0              not stripped
-#>22   leshort         >0              - version %ld
-0      leshort         =0522           iAPX 286 executable large model (COFF)
->12    lelong          >0              not stripped
-#>22   leshort         >0              - version %ld
-# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
-0      leshort         =0514           80386 COFF executable
->12    lelong          >0              not stripped
->22    leshort         >0              - version %ld
-
-# rom: file(1) magic for BIOS ROM Extensions found in intel machines
-#      mapped into memory between 0xC0000 and 0xFFFFF
-# From Gürkan Sengün <gurkan@linuks.mine.nu>, www.linuks.mine.nu
-0        beshort         0x55AA       BIOS (ia32) ROM Ext.
->5       string          USB          USB
->7       string          LDR          UNDI image
->30      string          IBM          IBM comp. Video
->26      string          Adaptec      Adaptec
->28      string          Adaptec      Adaptec
->42      string          PROMISE      Promise
->2       byte            x            (%d*512)
-
-#------------------------------------------------------------------------------
-# netbsd:  file(1) magic for NetBSD objects
-#
-# All new-style magic numbers are in network byte order.
-#
-
-0      lelong                  000000407       a.out NetBSD little-endian object file
->16    lelong                  >0              not stripped
-0      belong                  000000407       a.out NetBSD big-endian object file
->16    belong                  >0              not stripped
-
-0      belong&0377777777       041400413       a.out NetBSD/i386 demand paged
->0     byte                    &0x80           
->>20   lelong                  <4096           shared library
->>20   lelong                  =4096           dynamically linked executable
->>20   lelong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       041400410       a.out NetBSD/i386 pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       041400407       a.out NetBSD/i386
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   lelong                  !0              executable
->>20   lelong                  =0              object file
->16    lelong                  >0              not stripped
-0      belong&0377777777       041400507       a.out NetBSD/i386 core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-0      belong&0377777777       041600413       a.out NetBSD/m68k demand paged
->0     byte                    &0x80           
->>20   belong                  <8192           shared library
->>20   belong                  =8192           dynamically linked executable
->>20   belong                  >8192           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       041600410       a.out NetBSD/m68k pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       041600407       a.out NetBSD/m68k
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   belong                  !0              executable
->>20   belong                  =0              object file
->16    belong                  >0              not stripped
-0      belong&0377777777       041600507       a.out NetBSD/m68k core
->12    string                  >\0             from '%s'
->32    belong                  !0              (signal %d)
-
-0      belong&0377777777       042000413       a.out NetBSD/m68k4k demand paged
->0     byte                    &0x80           
->>20   belong                  <4096           shared library
->>20   belong                  =4096           dynamically linked executable
->>20   belong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       042000410       a.out NetBSD/m68k4k pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       042000407       a.out NetBSD/m68k4k
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   belong                  !0              executable
->>20   belong                  =0              object file
->16    belong                  >0              not stripped
-0      belong&0377777777       042000507       a.out NetBSD/m68k4k core
->12    string                  >\0             from '%s'
->32    belong                  !0              (signal %d)
-
-0      belong&0377777777       042200413       a.out NetBSD/ns32532 demand paged
->0     byte                    &0x80           
->>20   lelong                  <4096           shared library
->>20   lelong                  =4096           dynamically linked executable
->>20   lelong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       042200410       a.out NetBSD/ns32532 pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       042200407       a.out NetBSD/ns32532
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   lelong                  !0              executable
->>20   lelong                  =0              object file
->16    lelong                  >0              not stripped
-0      belong&0377777777       042200507       a.out NetBSD/ns32532 core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-0      belong&0377777777       045200507       a.out NetBSD/powerpc core
->12    string                  >\0             from '%s'
-
-0      belong&0377777777       042400413       a.out NetBSD/sparc demand paged
->0     byte                    &0x80           
->>20   belong                  <8192           shared library
->>20   belong                  =8192           dynamically linked executable
->>20   belong                  >8192           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       042400410       a.out NetBSD/sparc pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       042400407       a.out NetBSD/sparc
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   belong                  !0              executable
->>20   belong                  =0              object file
->16    belong                  >0              not stripped
-0      belong&0377777777       042400507       a.out NetBSD/sparc core
->12    string                  >\0             from '%s'
->32    belong                  !0              (signal %d)
-
-0      belong&0377777777       042600413       a.out NetBSD/pmax demand paged
->0     byte                    &0x80           
->>20   lelong                  <4096           shared library
->>20   lelong                  =4096           dynamically linked executable
->>20   lelong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       042600410       a.out NetBSD/pmax pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       042600407       a.out NetBSD/pmax
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   lelong                  !0              executable
->>20   lelong                  =0              object file
->16    lelong                  >0              not stripped
-0      belong&0377777777       042600507       a.out NetBSD/pmax core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-0      belong&0377777777       043000413       a.out NetBSD/vax 1k demand paged
->0     byte                    &0x80           
->>20   lelong                  <4096           shared library
->>20   lelong                  =4096           dynamically linked executable
->>20   lelong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       043000410       a.out NetBSD/vax 1k pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       043000407       a.out NetBSD/vax 1k
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   lelong                  !0              executable
->>20   lelong                  =0              object file
->16    lelong                  >0              not stripped
-0      belong&0377777777       043000507       a.out NetBSD/vax 1k core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-0      belong&0377777777       045400413       a.out NetBSD/vax 4k demand paged
->0     byte                    &0x80           
->>20   lelong                  <4096           shared library
->>20   lelong                  =4096           dynamically linked executable
->>20   lelong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       045400410       a.out NetBSD/vax 4k pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       045400407       a.out NetBSD/vax 4k
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   lelong                  !0              executable
->>20   lelong                  =0              object file
->16    lelong                  >0              not stripped
-0      belong&0377777777       045400507       a.out NetBSD/vax 4k core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-# NetBSD/alpha does not support (and has never supported) a.out objects,
-# so no rules are provided for them.  NetBSD/alpha ELF objects are 
-# dealt with in "elf".
-0      lelong          0x00070185              ECOFF NetBSD/alpha binary
->10    leshort         0x0001                  not stripped
->10    leshort         0x0000                  stripped
-0      belong&0377777777       043200507       a.out NetBSD/alpha core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-0      belong&0377777777       043400413       a.out NetBSD/mips demand paged
->0     byte                    &0x80           
->>20   belong                  <8192           shared library
->>20   belong                  =8192           dynamically linked executable
->>20   belong                  >8192           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       043400410       a.out NetBSD/mips pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    belong                  >0              not stripped
-0      belong&0377777777       043400407       a.out NetBSD/mips
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   belong                  !0              executable
->>20   belong                  =0              object file
->16    belong                  >0              not stripped
-0      belong&0377777777       043400507       a.out NetBSD/mips core
->12    string                  >\0             from '%s'
->32    belong                  !0              (signal %d)
-
-0      belong&0377777777       043600413       a.out NetBSD/arm32 demand paged
->0     byte                    &0x80
->>20   lelong                  <4096           shared library
->>20   lelong                  =4096           dynamically linked executable
->>20   lelong                  >4096           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       043600410       a.out NetBSD/arm32 pure
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80           executable
->16    lelong                  >0              not stripped
-0      belong&0377777777       043600407       a.out NetBSD/arm32
->0     byte                    &0x80           dynamically linked executable
->0     byte                    ^0x80
->>0    byte                    &0x40           position independent
->>20   lelong                  !0              executable
->>20   lelong                  =0              object file
->16    lelong                  >0              not stripped
-# NetBSD/arm26 has always used ELF objects, but it shares a core file
-# format with NetBSD/arm32.
-0      belong&0377777777       043600507       a.out NetBSD/arm core
->12    string                  >\0             from '%s'
->32    lelong                  !0              (signal %d)
-
-#------------------------------------------------------------------------------
-# riff:  file(1) magic for RIFF format
-# See
-#
-#      http://www.seanet.com/users/matts/riffmci/riffmci.htm
-#
-# AVI section extended by Patrik Rådman <patrik+file-magic@iki.fi>
-#
-0      string          RIFF            RIFF (little-endian) data
-# RIFF Palette format
->8     string          PAL             \b, palette
->>16   leshort         x               \b, version %d
->>18   leshort         x               \b, %d entries
-# RIFF Device Independent Bitmap format
->8     string          RDIB            \b, device-independent bitmap
->>16   string          BM              
->>>30  leshort         12              \b, OS/2 1.x format
->>>>34 leshort         x               \b, %d x
->>>>36 leshort         x               %d
->>>30  leshort         64              \b, OS/2 2.x format
->>>>34 leshort         x               \b, %d x
->>>>36 leshort         x               %d
->>>30  leshort         40              \b, Windows 3.x format
->>>>34 lelong          x               \b, %d x
->>>>38 lelong          x               %d x
->>>>44 leshort         x               %d
-# RIFF MIDI format
->8     string          RMID            \b, MIDI
-# RIFF Multimedia Movie File format
->8     string          RMMP            \b, multimedia movie
-# Microsoft WAVE format (*.wav)
->8     string          WAVE            \b, WAVE audio
->>20   leshort         1               \b, Microsoft PCM
->>>34  leshort         >0              \b, %d bit
->>20   leshort         2               \b, Microsoft ADPCM
->>20   leshort         6               \b, ITU G.711 A-law
->>20   leshort         7               \b, ITU G.711 mu-law
->>20   leshort         17              \b, IMA ADPCM
->>20   leshort         20              \b, ITU G.723 ADPCM (Yamaha)
->>20   leshort         49              \b, GSM 6.10
->>20   leshort         64              \b, ITU G.721 ADPCM
->>20   leshort         80              \b, MPEG
->>20   leshort         85              \b, MPEG Layer 3
->>22   leshort         =1              \b, mono
->>22   leshort         =2              \b, stereo
->>22   leshort         >2              \b, %d channels
->>24   lelong          >0              %d Hz
-# Corel Draw Picture
->8     string          CDRA            \b, Corel Draw Picture
-# AVI == Audio Video Interleave
->8     string          AVI\040         \b, AVI
->>12    string          LIST
->>>20   string          hdrlavih
->>>>&36 lelong          x               \b, %lu x
->>>>&40 lelong          x               %lu,
->>>>&4  lelong          >1000000        <1 fps,
->>>>&4  lelong          1000000         1.00 fps,
->>>>&4  lelong          500000          2.00 fps,
->>>>&4  lelong          333333          3.00 fps,
->>>>&4  lelong          250000          4.00 fps,
->>>>&4  lelong          200000          5.00 fps,
->>>>&4  lelong          166667          6.00 fps,
->>>>&4  lelong          142857          7.00 fps,
->>>>&4  lelong          125000          8.00 fps,
->>>>&4  lelong          111111          9.00 fps,
->>>>&4  lelong          100000          10.00 fps,
-# ]9.9,10.1[
->>>>&4  lelong          <101010
->>>>>&-4        lelong  >99010
->>>>>>&-4       lelong  !100000         ~10 fps,
->>>>&4  lelong          83333           12.00 fps,
-# ]11.9,12.1[
->>>>&4  lelong          <84034
->>>>>&-4        lelong  >82645
->>>>>>&-4       lelong  !83333          ~12 fps,
->>>>&4  lelong          66667           15.00 fps,
-# ]14.9,15.1[
->>>>&4  lelong          <67114
->>>>>&-4        lelong  >66225
->>>>>>&-4       lelong  !66667          ~15 fps,
->>>>&4  lelong          50000           20.00 fps,
->>>>&4  lelong          41708           23.98 fps,
->>>>&4  lelong          41667           24.00 fps,
-# ]23.9,24.1[
->>>>&4  lelong          <41841
->>>>>&-4        lelong  >41494
->>>>>>&-4       lelong  !41708
->>>>>>>&-4      lelong  !41667          ~24 fps,
->>>>&4  lelong          40000           25.00 fps,
-# ]24.9,25.1[
->>>>&4  lelong          <40161
->>>>>&-4        lelong  >39841
->>>>>>&-4       lelong  !40000          ~25 fps,
->>>>&4  lelong          33367           29.97 fps,
->>>>&4  lelong          33333           30.00 fps,
-# ]29.9,30.1[
->>>>&4  lelong          <33445
->>>>>&-4        lelong  >33223
->>>>>>&-4       lelong  !33367
->>>>>>>&-4      lelong  !33333          ~30 fps,
->>>>&4  lelong          <32224          >30 fps,
-##>>>>&4  lelong          x               (%lu)
-##>>>>&20 lelong          x               %lu frames,
-# Note: The tests below assume that the AVI has 1 or 2 streams,
-#       "vids" optionally followed by "auds".
-#       (Should cover 99.9% of all AVIs.)
-# assuming avih length = 56
->>>88   string  LIST
->>>>96  string  strlstrh
->>>>>108        string  vids    video:
->>>>>>&0        lelong  0               uncompressed
-# skip past vids strh
->>>>>>(104.l+108)       string  strf
->>>>>>>(104.l+132)      lelong          1       RLE 8bpp
->>>>>>>(104.l+132)      string/c        cvid    Cinepak
->>>>>>>(104.l+132)      string/c        i263    Intel I.263
->>>>>>>(104.l+132)      string/c        iv32    Indeo 3.2
->>>>>>>(104.l+132)      string/c        iv41    Indeo 4.1
->>>>>>>(104.l+132)      string/c        iv50    Indeo 5.0
->>>>>>>(104.l+132)      string/c        mp42    Microsoft MPEG-4 v2
->>>>>>>(104.l+132)      string/c        mp43    Microsoft MPEG-4 v3
->>>>>>>(104.l+132)      string/c        mjpg    Motion JPEG
->>>>>>>(104.l+132)      string/c        div3    DivX 3
->>>>>>>>112             string/c        div3    Low-Motion
->>>>>>>>112             string/c        div4    Fast-Motion
->>>>>>>(104.l+132)      string/c        divx    DivX 4
->>>>>>>(104.l+132)      string/c        dx50    DivX 5
->>>>>>>(104.l+132)      string/c        xvid    XviD
->>>>>>>(104.l+132)      lelong  0
-##>>>>>>>(104.l+132)      string  x       (%.4s)
-# skip past first (video) LIST
->>>>(92.l+96)   string  LIST
->>>>>(92.l+104) string  strlstrh
->>>>>>(92.l+116)        string          auds    \b, audio:
-# auds strh length = 56:
->>>>>>>(92.l+172)       string          strf
->>>>>>>>(92.l+180)      leshort 0x0001  uncompressed PCM
->>>>>>>>(92.l+180)      leshort 0x0002  ADPCM
->>>>>>>>(92.l+180)      leshort 0x0055  MPEG-1 Layer 3
->>>>>>>>(92.l+180)      leshort 0x2000  Dolby AC3
->>>>>>>>(92.l+180)      leshort 0x0161  DivX
-##>>>>>>>>(92.l+180)      leshort x       (0x%.4x)
->>>>>>>>(92.l+182)      leshort 1       (mono,
->>>>>>>>(92.l+182)      leshort 2       (stereo,
->>>>>>>>(92.l+182)      leshort >2      (%d channels,
->>>>>>>>(92.l+184)      lelong  x       %d Hz)
-# auds strh length = 64:
->>>>>>>(92.l+180)       string          strf
->>>>>>>>(92.l+188)      leshort 0x0001  uncompressed PCM
->>>>>>>>(92.l+188)      leshort 0x0002  ADPCM
->>>>>>>>(92.l+188)      leshort 0x0055  MPEG-1 Layer 3
->>>>>>>>(92.l+188)      leshort 0x2000  Dolby AC3
->>>>>>>>(92.l+188)      leshort 0x0161  DivX
-##>>>>>>>>(92.l+188)      leshort x       (0x%.4x)
->>>>>>>>(92.l+190)      leshort 1       (mono,
->>>>>>>>(92.l+190)      leshort 2       (stereo,
->>>>>>>>(92.l+190)      leshort >2      (%d channels,
->>>>>>>>(92.l+192)      lelong  x       %d Hz)
-# Animated Cursor format
->8     string          ACON            \b, animated cursor
-# SoundFont 2 <mpruett@sgi.com>
->8     string          sfbk            SoundFont/Bank
-# MPEG-1 wrapped in a RIFF, apparently
->8      string          CDXA            \b, wrapped MPEG-1 (CDXA)
->8     string          4XMV            \b, 4X Movie file 
-
-#
-# XXX - some of the below may only appear in little-endian form.
-#
-# Also "MV93" appears to be for one form of Macromedia Director
-# files, and "GDMF" appears to be another multimedia format.
-#
-0      string          RIFX            RIFF (big-endian) data
-# RIFF Palette format
->8     string          PAL             \b, palette
->>16   beshort         x               \b, version %d
->>18   beshort         x               \b, %d entries
-# RIFF Device Independent Bitmap format
->8     string          RDIB            \b, device-independent bitmap
->>16   string          BM              
->>>30  beshort         12              \b, OS/2 1.x format
->>>>34 beshort         x               \b, %d x
->>>>36 beshort         x               %d
->>>30  beshort         64              \b, OS/2 2.x format
->>>>34 beshort         x               \b, %d x
->>>>36 beshort         x               %d
->>>30  beshort         40              \b, Windows 3.x format
->>>>34 belong          x               \b, %d x
->>>>38 belong          x               %d x
->>>>44 beshort         x               %d
-# RIFF MIDI format
->8     string          RMID            \b, MIDI
-# RIFF Multimedia Movie File format
->8     string          RMMP            \b, multimedia movie
-# Microsoft WAVE format (*.wav)
->8     string          WAVE            \b, WAVE audio
->>20   leshort         1               \b, Microsoft PCM
->>>34  leshort         >0              \b, %d bit
->>22   beshort         =1              \b, mono
->>22   beshort         =2              \b, stereo
->>22   beshort         >2              \b, %d channels
->>24   belong          >0              %d Hz
-# Corel Draw Picture
->8     string          CDRA            \b, Corel Draw Picture
-# AVI == Audio Video Interleave
->8     string          AVI\040         \b, AVI
-# Animated Cursor format
->8     string          ACON            \b, animated cursor
-# Notation Interchange File Format (big-endian only)
->8     string          NIFF            \b, Notation Interchange File Format
-# SoundFont 2 <mpruett@sgi.com>
->8     string          sfbk            SoundFont/Bank
-#------------------------------------------------------------------------------
-# Console game magic
-# Toby Deshane <hac@shoelace.digivill.net>
-#    ines:  file(1) magic for Marat's iNES Nintendo Entertainment System
-#           ROM dump format
-
-0 string NES\032 iNES ROM dump,
->4 byte  x     %dx16k PRG
->5 byte  x     \b, %dx8k CHR
->6 byte&0x01  =0x1  \b, [Vert.]
->6 byte&0x01  =0x0  \b, [Horiz.]
->6 byte&0x02  =0x2  \b, [SRAM]
->6 byte&0x04  =0x4  \b, [Trainer]
->6 byte&0x04  =0x8  \b, [4-Scr]
-
-#------------------------------------------------------------------------------
-# gameboy:  file(1) magic for the Nintendo (Color) Gameboy raw ROM format
-#
-0x104 belong 0xCEED6666 Gameboy ROM:
->0x134 string >\0 "%.16s"
->0x146 byte 0x03  \b,[SGB]
->0x147 byte 0x00  \b, [ROM ONLY]
->0x147 byte 0x01  \b, [ROM+MBC1]
->0x147 byte 0x02  \b, [ROM+MBC1+RAM]
->0x147 byte 0x03  \b, [ROM+MBC1+RAM+BATT]
->0x147 byte 0x05  \b, [ROM+MBC2]
->0x147 byte 0x06  \b, [ROM+MBC2+BATTERY]
->0x147 byte 0x08  \b, [ROM+RAM]
->0x147 byte 0x09  \b, [ROM+RAM+BATTERY]
->0x147 byte 0x0B  \b, [ROM+MMM01]
->0x147 byte 0x0C  \b, [ROM+MMM01+SRAM]
->0x147 byte 0x0D  \b, [ROM+MMM01+SRAM+BATT]
->0x147 byte 0x0F  \b, [ROM+MBC3+TIMER+BATT]
->0x147 byte 0x10  \b, [ROM+MBC3+TIMER+RAM+BATT]
->0x147 byte 0x11  \b, [ROM+MBC3]
->0x147 byte 0x12  \b, [ROM+MBC3+RAM]
->0x147 byte 0x13  \b, [ROM+MBC3+RAM+BATT]
->0x147 byte 0x19  \b, [ROM+MBC5]
->0x147 byte 0x1A  \b, [ROM+MBC5+RAM]
->0x147 byte 0x1B  \b, [ROM+MBC5+RAM+BATT]
->0x147 byte 0x1C  \b, [ROM+MBC5+RUMBLE]
->0x147 byte 0x1D  \b, [ROM+MBC5+RUMBLE+SRAM]
->0x147 byte 0x1E  \b, [ROM+MBC5+RUMBLE+SRAM+BATT]
->0x147 byte 0x1F  \b, [Pocket Camera]
->0x147 byte 0xFD  \b, [Bandai TAMA5]
->0x147 byte 0xFE  \b, [Hudson HuC-3]
->0x147 byte 0xFF  \b, [Hudson HuC-1]
-
->0x148 byte 0     \b, ROM: 256Kbit
->0x148 byte 1     \b, ROM: 512Kbit
->0x148 byte 2     \b, ROM: 1Mbit
->0x148 byte 3     \b, ROM: 2Mbit
->0x148 byte 4     \b, ROM: 4Mbit
->0x148 byte 5     \b, ROM: 8Mbit
->0x148 byte 6     \b, ROM: 16Mbit
->0x148 byte 0x52  \b, ROM: 9Mbit
->0x148 byte 0x53  \b, ROM: 10Mbit
->0x148 byte 0x54  \b, ROM: 12Mbit
-
->0x149 byte 1     \b, RAM: 16Kbit
->0x149 byte 2     \b, RAM: 64Kbit
->0x149 byte 3     \b, RAM: 128Kbit
->0x149 byte 4     \b, RAM: 1Mbit
-
-#>0x14e long  x     \b, CRC: %x
-
-#------------------------------------------------------------------------------
-# genesis:  file(1) magic for the Sega MegaDrive/Genesis raw ROM format
-#
-0x100 string SEGA  Sega MegaDrive/Genesis raw ROM dump
->0x120 string >\0 Name: "%.16s"
->0x110 string >\0 %.16s
->0x1B0 string RA with SRAM
-
-#------------------------------------------------------------------------------
-# genesis:  file(1) magic for the Super MegaDrive ROM dump format
-#
-0x280 string EAGN  Super MagicDrive ROM dump
->0 byte x %dx16k blocks
->2 byte 0 \b, last in series or standalone
->2 byte >0 \b, split ROM
->8 byte 0xAA
->9 byte 0xBB
-
-#------------------------------------------------------------------------------
-# genesis:  file(1) alternate magic for the Super MegaDrive ROM dump format
-#
-0x280 string EAMG  Super MagicDrive ROM dump
->0 byte x %dx16k blocks
->2 byte x \b, last in series or standalone
->8 byte 0xAA
->9 byte 0xBB
-
-#------------------------------------------------------------------------------
-# smsgg:  file(1) magic for Sega Master System and Game Gear ROM dumps
-#
-# Does not detect all images.  Very preliminary guesswork.  Need more data
-# on format.
-#
-# FIXME: need a little more info...;P
-#
-#0 byte 0xF3
-#>1 byte 0xED  Sega Master System/Game Gear ROM dump
-#>1 byte 0x31  Sega Master System/Game Gear ROM dump
-#>1 byte 0xDB  Sega Master System/Game Gear ROM dump
-#>1 byte 0xAF  Sega Master System/Game Gear ROM dump
-#>1 byte 0xC3  Sega Master System/Game Gear ROM dump
-
-#------------------------------------------------------------------------------
-# dreamcast:  file(1) uncertain magic for the Sega Dreamcast VMU image format
-#
-0 belong 0x21068028   Sega Dreamcast VMU game image
-0 string LCDi         Dream Animator file
-
-#------------------------------------------------------------------------------
-# v64: file(1) uncertain magic for the V64 format N64 ROM dumps
-#
-0 belong 0x37804012    V64 Nintendo 64 ROM dump
-
-#------------------------------------------------------------------------------
-# msx: file(1) magic for MSX game cartridge dumps
-# Too simple - MPi
-#0 beshort 0x4142 MSX game cartridge dump 
-
-#------------------------------------------------------------------------------
-# Sony Playstation executables (Adam Sjoegren <asjo@diku.dk>) :
-0      string  PS-X\ EXE       Sony Playstation executable
-#  Area:
->113   string  x               (%s)
-
-#------------------------------------------------------------------------------
-# Microsoft Xbox executables .xbe (Esa Hyytiä <ehyytia@cc.hut.fi>)
-0       string          XBEH            XBE, Microsoft Xbox executable
-# probabilistic checks whether signed or not
->0x0004 ulelong =0x0
->>&2    ulelong =0x0
->>>&2   ulelong =0x0  \b, not signed
->0x0004 ulelong >0
->>&2    ulelong >0
->>>&2   ulelong >0    \b, signed
-# expect base address of 0x10000
->0x0104               ulelong =0x10000
->>(0x0118-0x0FF60)    ulelong&0x80000007  0x80000007 \b, all regions
->>(0x0118-0x0FF60)    ulelong&0x80000007  !0x80000007
->>>(0x0118-0x0FF60)   ulelong >0           (regions:
->>>>(0x0118-0x0FF60)  ulelong &0x00000001  NA
->>>>(0x0118-0x0FF60)  ulelong &0x00000002  Japan
->>>>(0x0118-0x0FF60)  ulelong &0x00000004  Rest_of_World
->>>>(0x0118-0x0FF60)  ulelong &0x80000000  Manufacturer
->>>(0x0118-0x0FF60)   ulelong >0           \b)
-
-# --------------------------------
-# Microsoft Xbox data file formats
-0       string          XIP0            XIP, Microsoft Xbox data
-0       string          XTF0            XTF, Microsoft Xbox data
-
-# Atari Lynx cartridge dump (EXE/BLL header)
-# From: "Stefan A. Haubenthal" <polluks@web.de>
-
-0      beshort         0x8008          Lynx cartridge,
->2     beshort         x               RAM start $%04x
->6     string          BS93
-
-#------------------------------------------------------------------------------
-# Z-machine:  file(1) magic for Z-machine binaries.
-#
-# This will match ${TEX_BASE}/texmf/omega/ocp/char2uni/inbig5.ocp which
-# appears to be a version-0 Z-machine binary.
-#
-# The (false match) message is to correct that behavior.  Perhaps it is
-# not needed.
-#
->16    belong&0xfe00f0f0       0x3030  Infocom game data
->0     ubyte                   0       (false match)
->0     ubyte                   >0      (Z-machine %d,
->>2    ubeshort                x       Release %d /
->>18   string                  >\0     Serial %.6s)
-
-#------------------------------------------------------------------------------
-# Glulx:  file(1) magic for Glulx binaries.
-#
-# I haven't checked for false matches yet.
-#
-0      string                  Glul    Glulx game data
-
-
-
-# These go at the end of the iff rules
-#
-# I don't see why these might collide with anything else.
-#
-# Interactive Fiction related formats
-#
->8     string          IFRS            \b, Blorb Interactive Fiction
->>24   string          Exec            with executable chunk
->8     string          IFZS            \b, Z-machine or Glulx saved game file (Quetzal)
-
-#------------------------------------------------------------------------------
-# DEC SRC Virtual Paper: Lectern files
-# Karl M. Hegbloom <karlheg@inetarena.com>
-0      string  lect    DEC SRC Virtual Paper Lectern file
-
-#------------------------------------------------------------------------------
-# visx:  file(1) magic for Visx format files
-#
-0      short           0x5555          VISX image file
->2     byte            0               (zero)
->2     byte            1               (unsigned char)
->2     byte            2               (short integer)
->2     byte            3               (float 32)
->2     byte            4               (float 64)
->2     byte            5               (signed char)
->2     byte            6               (bit-plane)
->2     byte            7               (classes)
->2     byte            8               (statistics)
->2     byte            10              (ascii text)
->2     byte            15              (image segments)
->2     byte            100             (image set)
->2     byte            101             (unsigned char vector)
->2     byte            102             (short integer vector)
->2     byte            103             (float 32 vector)
->2     byte            104             (float 64 vector)
->2     byte            105             (signed char vector)
->2     byte            106             (bit plane vector)
->2     byte            121             (feature vector)
->2     byte            122             (feature vector library)
->2     byte            124             (chain code)
->2     byte            126             (bit vector)
->2     byte            130             (graph)
->2     byte            131             (adjacency graph)
->2     byte            132             (adjacency graph library)
->2     string          .VISIX          (ascii text)
-#------------------------------------------------------------------------------
-# varied.script:  file(1) magic for various interpreter scripts
-
-0      string          #!\ /                   a
->3     string          >\0                     %s script text executable
-0      string          #!\     /               a
->3     string          >\0                     %s script text executable
-0      string          #!/                     a
->2     string          >\0                     %s script text executable
-0      string          #!\                     script text executable
->3     string          >\0                     for %s
-
-# ------------------------------------------------------------------------
-# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.
-#
-# From: Ryan McGuire (rmcguire@freenet.columbus.oh.us).
-#
-# Update: Romain Lievin (roms@lpg.ticalc.org).
-#
-# NOTE: This list is not complete.
-# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the
-# program/group magic numbers in here because I cannot find any.
-0              string          **TI80**        TI-80 Graphing Calculator File.
-0              string          **TI81**        TI-81 Graphing Calculator File.
-#
-# Magic Numbers for the TI-73
-#
-0              string          **TI73**        TI-73 Graphing Calculator
->0x00003B      byte            0x00            (real number)
->0x00003B      byte            0x01            (list)
->0x00003B      byte            0x02            (matrix)
->0x00003B      byte            0x03            (equation)
->0x00003B      byte            0x04            (string)
->0x00003B      byte            0x05            (program)
->0x00003B      byte            0x06            (assembly program)
->0x00003B      byte            0x07            (picture)
->0x00003B      byte            0x08            (gdb)
->0x00003B      byte            0x0C            (complex number)
->0x00003B      byte            0x0F            (window settings)
->0x00003B      byte            0x10            (zoom)
->0x00003B      byte            0x11            (table setup)
->0x00003B      byte            0x13            (backup)
-
-# Magic Numbers for the TI-82
-#
-0              string          **TI82**        TI-82 Graphing Calculator
->0x00003B      byte            0x00            (real)
->0x00003B      byte            0x01            (list)
->0x00003B      byte            0x02            (matrix)
->0x00003B      byte            0x03            (Y-variable)
->0x00003B      byte            0x05            (program)
->0x00003B      byte            0x06            (protected prgm)
->0x00003B      byte            0x07            (picture)
->0x00003B      byte            0x08            (gdb)
->0x00003B      byte            0x0B            (window settings)
->0x00003B      byte            0x0C            (window settings)
->0x00003B      byte            0x0D            (table setup)
->0x00003B      byte            0x0E            (screenshot)
->0x00003B      byte            0x0F            (backup)
-#
-# Magic Numbers for the TI-83
-#
-0              string          **TI83**        TI-83 Graphing Calculator
->0x00003B      byte            0x00            (real)
->0x00003B      byte            0x01            (list)
->0x00003B      byte            0x02            (matrix)
->0x00003B      byte            0x03            (Y-variable)
->0x00003B      byte            0x04            (string)
->0x00003B      byte            0x05            (program)
->0x00003B      byte            0x06            (protected prgm)
->0x00003B      byte            0x07            (picture)
->0x00003B      byte            0x08            (gdb)
->0x00003B      byte            0x0B            (window settings)
->0x00003B      byte            0x0C            (window settings)
->0x00003B      byte            0x0D            (table setup)
->0x00003B      byte            0x0E            (screenshot)
->0x00003B      byte            0x13            (backup)
-#
-# Magic Numbers for the TI-83+
-#
-0              string          **TI83F*        TI-83+ Graphing Calculator
->0x00003B      byte            0x00            (real number)
->0x00003B      byte            0x01            (list)
->0x00003B      byte            0x02            (matrix)
->0x00003B      byte            0x03            (equation)
->0x00003B      byte            0x04            (string)
->0x00003B      byte            0x05            (program)
->0x00003B      byte            0x06            (assembly program)
->0x00003B      byte            0x07            (picture)
->0x00003B      byte            0x08            (gdb)
->0x00003B      byte            0x0C            (complex number)
->0x00003B      byte            0x0F            (window settings)
->0x00003B      byte            0x10            (zoom)
->0x00003B      byte            0x11            (table setup)
->0x00003B      byte            0x13            (backup)
->0x00003B      byte            0x15            (application variable)
->0x00003B      byte            0x17            (group of variable)
-
-#
-# Magic Numbers for the TI-85
-#
-0              string          **TI85**        TI-85 Graphing Calculator
->0x00003B      byte            0x00            (real number)
->0x00003B      byte            0x01            (complex number)
->0x00003B      byte            0x02            (real vector)
->0x00003B      byte            0x03            (complex vector)
->0x00003B      byte            0x04            (real list)
->0x00003B      byte            0x05            (complex list)
->0x00003B      byte            0x06            (real matrix)
->0x00003B      byte            0x07            (complex matrix)
->0x00003B      byte            0x08            (real constant)
->0x00003B      byte            0x09            (complex constant)
->0x00003B      byte            0x0A            (equation)
->0x00003B      byte            0x0C            (string)
->0x00003B      byte            0x0D            (function GDB)
->0x00003B      byte            0x0E            (polar GDB)
->0x00003B      byte            0x0F            (parametric GDB)
->0x00003B      byte            0x10            (diffeq GDB)
->0x00003B      byte            0x11            (picture)
->0x00003B      byte            0x12            (program)
->0x00003B      byte            0x13            (range)
->0x00003B      byte            0x17            (window settings)
->0x00003B      byte            0x18            (window settings)
->0x00003B      byte            0x19            (window settings)
->0x00003B      byte            0x1A            (window settings)
->0x00003B      byte            0x1B            (zoom)
->0x00003B      byte            0x1D            (backup)
->0x00003B      byte            0x1E            (unknown)
->0x00003B      byte            0x2A            (equation)
->0x000032      string          ZS4             - ZShell Version 4 File.
->0x000032      string          ZS3             - ZShell Version 3 File.
-#
-# Magic Numbers for the TI-86
-#
-0              string          **TI86**        TI-86 Graphing Calculator
->0x00003B      byte            0x00            (real number)
->0x00003B      byte            0x01            (complex number)
->0x00003B      byte            0x02            (real vector)
->0x00003B      byte            0x03            (complex vector)
->0x00003B      byte            0x04            (real list)
->0x00003B      byte            0x05            (complex list)
->0x00003B      byte            0x06            (real matrix)
->0x00003B      byte            0x07            (complex matrix)
->0x00003B      byte            0x08            (real constant)
->0x00003B      byte            0x09            (complex constant)
->0x00003B      byte            0x0A            (equation)
->0x00003B      byte            0x0C            (string)
->0x00003B      byte            0x0D            (function GDB)
->0x00003B      byte            0x0E            (polar GDB)
->0x00003B      byte            0x0F            (parametric GDB)
->0x00003B      byte            0x10            (diffeq GDB)
->0x00003B      byte            0x11            (picture)
->0x00003B      byte            0x12            (program)
->0x00003B      byte            0x13            (range)
->0x00003B      byte            0x17            (window settings)
->0x00003B      byte            0x18            (window settings)
->0x00003B      byte            0x19            (window settings)
->0x00003B      byte            0x1A            (window settings)
->0x00003B      byte            0x1B            (zoom)
->0x00003B      byte            0x1D            (backup)
->0x00003B      byte            0x1E            (unknown)
->0x00003B      byte            0x2A            (equation)
-#
-# Magic Numbers for the TI-89
-#
-0              string          **TI89**        TI-89 Graphing Calculator
->0x000048      byte            0x00            (expression)
->0x000048      byte            0x04            (list)
->0x000048      byte            0x06            (matrix)
->0x000048      byte            0x0A            (data)
->0x000048      byte            0x0B            (text)
->0x000048      byte            0x0C            (string)
->0x000048      byte            0x0D            (graphic data base)
->0x000048      byte            0x0E            (figure)
->0x000048      byte            0x10            (picture)
->0x000048      byte            0x12            (program)
->0x000048      byte            0x13            (function)
->0x000048      byte            0x14            (macro)
->0x000048      byte            0x1C            (zipped)
->0x000048      byte            0x21            (assembler)
-#
-# Magic Numbers for the TI-92
-#
-0              string          **TI92**        TI-92 Graphing Calculator
->0x000048      byte            0x00            (expression)
->0x000048      byte            0x04            (list)
->0x000048      byte            0x06            (matrix)
->0x000048      byte            0x0A            (data)
->0x000048      byte            0x0B            (text)
->0x000048      byte            0x0C            (string)
->0x000048      byte            0x0D            (graphic data base)
->0x000048      byte            0x0E            (figure)
->0x000048      byte            0x10            (picture)
->0x000048      byte            0x12            (program)
->0x000048      byte            0x13            (function)
->0x000048      byte            0x14            (macro)
->0x000048      byte            0x1D            (backup)
-#
-# Magic Numbers for the TI-92+/V200
-#
-0              string          **TI92P*        TI-92+/V200 Graphing Calculator
->0x000048      byte            0x00            (expression)
->0x000048      byte            0x04            (list)
->0x000048      byte            0x06            (matrix)
->0x000048      byte            0x0A            (data)
->0x000048      byte            0x0B            (text)
->0x000048      byte            0x0C            (string)
->0x000048      byte            0x0D            (graphic data base)
->0x000048      byte            0x0E            (figure)
->0x000048      byte            0x10            (picture)
->0x000048      byte            0x12            (program)
->0x000048      byte            0x13            (function)
->0x000048      byte            0x14            (macro)
->0x000048      byte            0x1C            (zipped)
->0x000048      byte            0x21            (assembler)
-#
-# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades
-#
-0x0000016      string          Advanced        TI-XX Graphing Calculator (FLASH)
-0              string          **TIFL**        TI-XX Graphing Calculator (FLASH)
->8             byte            >0              - Revision %d
->>9            byte            x               \b.%d,
->12            byte            >0              Revision date %02x
->>13           byte            x               \b/%02x
->>14           beshort         x               \b/%04x,
->17            string          >/0             name: '%s',
->48            byte            0x74            device: TI-73,
->48            byte            0x73            device: TI-83+,
->48            byte            0x98            device: TI-89,
->48            byte            0x88            device: TI-92+,
->49            byte            0x23            type: OS upgrade,
->49            byte            0x24            type: application,
->49            byte            0x25            type: certificate,
->49            byte            0x3e            type: license,
->74            lelong          >0              size: %ld bytes
-
-# VTi & TiEmu skins (TI Graphing Calculators).
-# From: Romain Lievin (roms@lpg.ticalc.org).
-# Magic Numbers for the VTi skins
-0               string          VTI            Virtual TI skin
->3             string          v               - Version
->>4            byte            >0              \b %c
->>6            byte            x               \b.%c
-# Magic Numbers for the TiEmu skins
-0              string          TiEmu           TiEmu skin
->6              string          v               - Version
->>7             byte            >0              \b %c
->>9             byte            x               \b.%c
->>10           byte            x               \b%c
-
-#------------------------------------------------------------------------------
-# c-lang:  file(1) magic for C programs (or REXX)
-#
-
-# XPM icons (Greg Roelofs, newt@uchicago.edu)
-# if you uncomment "/*" for C/REXX below, also uncomment this entry
-#0     string          /*\ XPM\ */     X pixmap image data
-
-# this first will upset you if you're a PL/1 shop...
-# in which case rm it; ascmagic will catch real C programs
-#0     string          /*              C or REXX program text
-#0     string          //              C++ program text
-
-# From: Mikhail Teterin <mi@aldan.algebra.com> 
-0      string          cscope          cscope reference data
->7     string          x               version %.2s
-# We skip the path here, because it is often long (so file will
-# truncate it) and mostly redundant.
-# The inverted index functionality was added some time betwen
-# versions 11 and 15, so look for -q if version is above 14:
->7     string          >14
->>10   regex           .+\ -q\         with inverted index
->10    regex           .+\ -c\         text (non-compressed)
-#  Digital UNIX - Info
-#
-0      string  !<arch>\n________64E    Alpha archive
->22    string  X                       -- out of date
-#
-# Alpha COFF Based Executables
-# The stripped stuff really needs to be an 8 byte (64 bit) compare,
-# but this works
-0      leshort         0x183           COFF format alpha
->22    leshort&020000  &010000         sharable library,
->22    leshort&020000  ^010000         dynamically linked,
->24    leshort         0410            pure
->24    leshort         0413            demand paged
->8     lelong          >0              executable or object module, not stripped
->8     lelong          0
->>12   lelong          0               executable or object module, stripped
->>12   lelong          >0              executable or object module, not stripped
->27     byte            >0              - version %d.
->26     byte            >0              %d-
->28     leshort         >0              %d
-#
-# The next is incomplete, we could tell more about this format,
-# but its not worth it.
-0      leshort         0x188   Alpha compressed COFF
-0      leshort         0x18f   Alpha u-code object
-#
-#
-# Some other interesting Digital formats,
-0      string  \377\377\177            ddis/ddif
-0      string  \377\377\174            ddis/dots archive
-0      string  \377\377\176            ddis/dtif table data
-0      string  \033c\033               LN03 output
-0      long    04553207                X image
-#
-0      string  !<PDF>!\n               profiling data file
-#
-# Locale data tables (MIPS and Alpha).
-#
-0      short           0x0501          locale data table
->6     short           0x24            for MIPS
->6     short           0x40            for Alpha
-# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka@gmx.at>
-# from http://www.atsc.org/standards/a_52a.pdf
-# corrections, additions, etc. are always welcome!
-#
-# syncword
-0       beshort         0x0b77  ATSC A/52 aka AC-3 aka Dolby Digital stream,
-# fscod
->4      byte&0xc0       0x00    48 kHz,
->4      byte&0xc0       0x40    44.1 kHz,
->4      byte&0xc0       0x80    32 kHz,
-# is this one used for 96 kHz?
->4      byte&0xc0       0xc0    reserved frequency,
-#
->5     byte&7 = 0              \b, complete main (CM)
->5     byte&7 = 1              \b, music and effects (ME)
->5     byte&7 = 2              \b, visually impaired (VI)
->5     byte&7 = 3              \b, hearing impaired (HI)
->5     byte&7 = 4              \b, dialogue (D)
->5     byte&7 = 5              \b, commentary (C)
->5     byte&7 = 6              \b, emergency (E)
-# acmod
->6      byte&0xe0       0x00    1+1 front,
->6      byte&0xe0       0x20    1 front/0 rear,
->6      byte&0xe0       0x40    2 front/0 rear,
->6      byte&0xe0       0x60    3 front/0 rear,
->6      byte&0xe0       0x80    2 front/1 rear,
->6      byte&0xe0       0xa0    3 front/1 rear,
->6      byte&0xe0       0xc0    2 front/2 rear,
->6      byte&0xe0       0xe0    3 front/2 rear,
-# lfeon (these may be incorrect)
->7      byte&0x40       0x00    LFE off,
->7      byte&0x40       0x40    LFE on,
-#
->4     byte&0x3e = 0x00        \b, 32 kbit/s
->4     byte&0x3e = 0x02        \b, 40 kbit/s
->4     byte&0x3e = 0x04        \b, 48 kbit/s
->4     byte&0x3e = 0x06        \b, 56 kbit/s
->4     byte&0x3e = 0x08        \b, 64 kbit/s
->4     byte&0x3e = 0x0a        \b, 80 kbit/s
->4     byte&0x3e = 0x0c        \b, 96 kbit/s
->4     byte&0x3e = 0x0e        \b, 112 kbit/s
->4     byte&0x3e = 0x10        \b, 128 kbit/s
->4     byte&0x3e = 0x12        \b, 160 kbit/s
->4     byte&0x3e = 0x14        \b, 192 kbit/s
->4     byte&0x3e = 0x16        \b, 224 kbit/s
->4     byte&0x3e = 0x18        \b, 256 kbit/s
->4     byte&0x3e = 0x1a        \b, 320 kbit/s
->4     byte&0x3e = 0x1c        \b, 384 kbit/s
->4     byte&0x3e = 0x1e        \b, 448 kbit/s
->4     byte&0x3e = 0x20        \b, 512 kbit/s
->4     byte&0x3e = 0x22        \b, 576 kbit/s
->4     byte&0x3e = 0x24        \b, 640 kbit/s
-# dsurmod (these may be incorrect)
->6      beshort&0x0180  0x0000  Dolby Surround not indicated
->6      beshort&0x0180  0x0080  not Dolby Surround encoded
->6      beshort&0x0180  0x0100  Dolby Surround encoded
->6      beshort&0x0180  0x0180  reserved Dolby Surround mode
-
-#------------------------------------------------------------------------------
-# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
-#
-# ACE/gr binary
-0      string  \000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003             old ACE/gr binary file
->39    byte    >0                      - version %c
-# ACE/gr ascii
-0      string  #\ xvgr\ parameter\ file        ACE/gr ascii file
-0      string  #\ xmgr\ parameter\ file        ACE/gr ascii file
-0      string  #\ ACE/gr\ parameter\ file      ACE/gr ascii file
-# Grace projects
-0      string  #\ Grace\ project\ file         Grace project file
->23    string  @version\                       (version
->>32   byte    >0                              %c
->>33   string  >\0                             \b.%.2s
->>35   string  >\0                             \b.%.2s)
-# ACE/gr fit description files
-0      string  #\ ACE/gr\ fit\ description\    ACE/gr fit description file
-# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
-
-#------------------------------------------------------------------------------
-# ibm370:  file(1) magic for IBM 370 and compatibles.
-#
-# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
-# What the heck *is* "USS/370"?
-# AIX 4.1's "/etc/magic" has
-#
-#      0       short           0535            370 sysV executable 
-#      >12     long            >0              not stripped
-#      >22     short           >0              - version %d
-#      >30     long            >0              - 5.2 format
-#      0       short           0530            370 sysV pure executable 
-#      >12     long            >0              not stripped
-#      >22     short           >0              - version %d
-#      >30     long            >0              - 5.2 format
-#
-# instead of the "USS/370" versions of the same magic numbers.
-#
-0      beshort         0537            370 XA sysV executable 
->12    belong          >0              not stripped
->22    beshort         >0              - version %d
->30    belong          >0              - 5.2 format
-0      beshort         0532            370 XA sysV pure executable 
->12    belong          >0              not stripped
->22    beshort         >0              - version %d
->30    belong          >0              - 5.2 format
-0      beshort         054001          370 sysV pure executable
->12    belong          >0              not stripped
-0      beshort         055001          370 XA sysV pure executable
->12    belong          >0              not stripped
-0      beshort         056401          370 sysV executable
->12    belong          >0              not stripped
-0      beshort         057401          370 XA sysV executable
->12    belong          >0              not stripped
-0       beshort                0531            SVR2 executable (Amdahl-UTS)
->12    belong          >0              not stripped
->24     belong         >0              - version %ld
-0      beshort         0534            SVR2 pure executable (Amdahl-UTS)
->12    belong          >0              not stripped
->24    belong          >0              - version %ld
-0      beshort         0530            SVR2 pure executable (USS/370)
->12    belong          >0              not stripped
->24    belong          >0              - version %ld
-0      beshort         0535            SVR2 executable (USS/370)
->12    belong          >0              not stripped
->24    belong          >0              - version %ld
-
-#------------------------------------------------------------------------------
-# images:  file(1) magic for image formats (see also "iff")
-#
-# originally from jef@helios.ee.lbl.gov (Jef Poskanzer),
-# additions by janl@ifi.uio.no as well as others. Jan also suggested
-# merging several one- and two-line files into here.
-#
-# little magic: PCX (first byte is 0x0a)
-
-# Targa - matches `povray', `ppmtotga' and `xv' outputs
-# by Philippe De Muyter <phdm@macqel.be>
-# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11
-# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise
-# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs
-# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)
-# `tgatoppm' recognizes a superset (Index may be anything)
-1      belong&0xfff7ffff       0x01010000      Targa image data - Map
->2     byte&8                  8               - RLE
->12    leshort                 >0              %hd x
->14    leshort                 >0              %hd
-1      belong&0xfff7ffff       0x00020000      Targa image data - RGB
->2     byte&8                  8               - RLE
->12    leshort                 >0              %hd x
->14    leshort                 >0              %hd
-1      belong&0xfff7ffff       0x00030000      Targa image data - Mono
->2     byte&8                  8               - RLE
->12    leshort                 >0              %hd x
->14    leshort                 >0              %hd
-
-# PBMPLUS images
-# The next byte following the magic is always whitespace.
-0      string          P1              Netpbm PBM image text
-0      string          P2              Netpbm PGM image text
-0      string          P3              Netpbm PPM image text
-0      string          P4              Netpbm PBM "rawbits" image data
-0      string          P5              Netpbm PGM "rawbits" image data
-0      string          P6              Netpbm PPM "rawbits" image data
-0      string          P7              Netpbm PAM image file
-
-# From: bryanh@giraffe-data.com (Bryan Henderson)
-0      string          \117\072        Solitaire Image Recorder format
->4     string          \013            MGI Type 11
->4     string          \021            MGI Type 17
-0      string          .MDA            MicroDesign data
->21    byte            48              version 2
->21    byte            51              version 3
-0      string          .MDP            MicroDesign page data
->21    byte            48              version 2
->21    byte            51              version 3
-
-# NIFF (Navy Interchange File Format, a modification of TIFF) images
-0      string          IIN1            NIFF image data
-
-# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
-# The second word of TIFF files is the TIFF version number, 42, which has
-# never changed.  The TIFF specification recommends testing for it.
-0      string          MM\x00\x2a      TIFF image data, big-endian
-0      string          II\x2a\x00      TIFF image data, little-endian
-
-# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
-# (Greg Roelofs, newt@uchicago.edu)
-# (Albert Cahalan, acahalan@cs.uml.edu)
-#
-# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
-#
-0      string          \x89PNG         PNG image data,
->4     belong          !0x0d0a1a0a     CORRUPTED,
->4     belong          0x0d0a1a0a
->>16   belong          x               %ld x
->>20   belong          x               %ld,
->>24   byte            x               %d-bit
->>25   byte            0               grayscale,
->>25   byte            2               \b/color RGB,
->>25   byte            3               colormap,
->>25   byte            4               gray+alpha,
->>25   byte            6               \b/color RGBA,
-#>>26  byte            0               deflate/32K,
->>28   byte            0               non-interlaced
->>28   byte            1               interlaced
-1      string          PNG             PNG image data, CORRUPTED
-
-# GIF
-0      string          GIF8            GIF image data
->4     string          7a              \b, version 8%s,
->4     string          9a              \b, version 8%s,
->6     leshort         >0              %hd x
->8     leshort         >0              %hd
-#>10   byte            &0x80           color mapped,
-#>10   byte&0x07       =0x00           2 colors
-#>10   byte&0x07       =0x01           4 colors
-#>10   byte&0x07       =0x02           8 colors
-#>10   byte&0x07       =0x03           16 colors
-#>10   byte&0x07       =0x04           32 colors
-#>10   byte&0x07       =0x05           64 colors
-#>10   byte&0x07       =0x06           128 colors
-#>10   byte&0x07       =0x07           256 colors
-
-# ITC (CMU WM) raster files.  It is essentially a byte-reversed Sun raster,
-# 1 plane, no encoding.
-0      string          \361\0\100\273  CMU window manager raster image data
->4     lelong          >0              %d x
->8     lelong          >0              %d,
->12    lelong          >0              %d-bit
-
-# Magick Image File Format
-0      string          id=ImageMagick  MIFF image data
-
-# Artisan
-0      long            1123028772      Artisan image data
->4     long            1               \b, rectangular 24-bit
->4     long            2               \b, rectangular 8-bit with colormap
->4     long            3               \b, rectangular 32-bit (24-bit with matte)
-
-# FIG (Facility for Interactive Generation of figures), an object-based format
-0      string          #FIG            FIG image text
->5     string          x               \b, version %.3s
-
-# PHIGS
-0      string          ARF_BEGARF              PHIGS clear text archive
-0      string          @(#)SunPHIGS            SunPHIGS
-# version number follows, in the form m.n
->40    string          SunBin                  binary
->32    string          archive                 archive
-
-# GKS (Graphics Kernel System)
-0      string          GKSM            GKS Metafile
->24    string          SunGKS          \b, SunGKS
-
-# CGM image files
-0      string          BEGMF           clear text Computer Graphics Metafile
-# XXX - questionable magic
-0      beshort&0xffe0  0x0020          binary Computer Graphics Metafile
-0      beshort         0x3020          character Computer Graphics Metafile
-
-# MGR bitmaps  (Michael Haardt, u31b3hs@pool.informatik.rwth-aachen.de)
-0      string  yz      MGR bitmap, modern format, 8-bit aligned
-0      string  zz      MGR bitmap, old format, 1-bit deep, 16-bit aligned
-0      string  xz      MGR bitmap, old format, 1-bit deep, 32-bit aligned
-0      string  yx      MGR bitmap, modern format, squeezed
-
-# Fuzzy Bitmap (FBM) images
-0      string          %bitmap\0       FBM image data
->30    long            0x31            \b, mono
->30    long            0x33            \b, color
-
-# facsimile data
-1      string          PC\ Research,\ Inc      group 3 fax data
->29    byte            0               \b, normal resolution (204x98 DPI)
->29    byte            1               \b, fine resolution (204x196 DPI)
-# From: Herbert Rosmanith <herp@wildsau.idv.uni.linz.at>
-0      string          Sfff            structured fax file
-
-
-# PC bitmaps (OS/2, Windoze BMP files)  (Greg Roelofs, newt@uchicago.edu)
-0      string          BM              PC bitmap data
->14    leshort         12              \b, OS/2 1.x format
->>18   leshort         x               \b, %d x
->>20   leshort         x               %d
->14    leshort         64              \b, OS/2 2.x format
->>18   leshort         x               \b, %d x
->>20   leshort         x               %d
->14    leshort         40              \b, Windows 3.x format
->>18   lelong          x               \b, %d x
->>22   lelong          x               %d x
->>28   leshort         x               %d
-# Too simple - MPi
-#0     string          IC              PC icon data
-#0     string          PI              PC pointer image data
-#0     string          CI              PC color icon data
-#0     string          CP              PC color pointer image data
-# Conflicts with other entries [BABYL]
-#0     string          BA              PC bitmap array data
-
-# XPM icons (Greg Roelofs, newt@uchicago.edu)
-# note possible collision with C/REXX entry in c-lang; currently commented out
-0      string          /*\ XPM\ */     X pixmap image text
-
-# Utah Raster Toolkit RLE images (janl@ifi.uio.no)
-0      leshort         0xcc52          RLE image data,
->6     leshort         x               %d x
->8     leshort         x               %d
->2     leshort         >0              \b, lower left corner: %d
->4     leshort         >0              \b, lower right corner: %d
->10    byte&0x1        =0x1            \b, clear first
->10    byte&0x2        =0x2            \b, no background
->10    byte&0x4        =0x4            \b, alpha channel
->10    byte&0x8        =0x8            \b, comment
->11    byte            >0              \b, %d color channels
->12    byte            >0              \b, %d bits per pixel
->13    byte            >0              \b, %d color map channels
-
-# image file format (Robert Potter, potter@cs.rochester.edu)
-0      string          Imagefile\ version-     iff image data
-# this adds the whole header (inc. version number), informative but longish
->10    string          >\0             %s
-
-# Sun raster images, from Daniel Quinlan (quinlan@yggdrasil.com)
-0      belong          0x59a66a95      Sun raster image data
->4     belong          >0              \b, %d x
->8     belong          >0              %d,
->12    belong          >0              %d-bit,
-#>16   belong          >0              %d bytes long,
->20    belong          0               old format,
-#>20   belong          1               standard,
->20    belong          2               compressed,
->20    belong          3               RGB,
->20    belong          4               TIFF,
->20    belong          5               IFF,
->20    belong          0xffff          reserved for testing,
->24    belong          0               no colormap
->24    belong          1               RGB colormap
->24    belong          2               raw colormap
-#>28   belong          >0              colormap is %d bytes long
-
-# SGI image file format, from Daniel Quinlan (quinlan@yggdrasil.com)
-#
-# See
-#      http://reality.sgi.com/grafica/sgiimage.html
-#
-0      beshort         474             SGI image data
-#>2    byte            0               \b, verbatim
->2     byte            1               \b, RLE
-#>3    byte            1               \b, normal precision
->3     byte            2               \b, high precision
->4     beshort         x               \b, %d-D
->6     beshort         x               \b, %d x
->8     beshort         x               %d
->10    beshort         x               \b, %d channel
->10    beshort         !1              \bs
->80    string          >0              \b, "%s"
-
-0      string          IT01            FIT image data
->4     belong          x               \b, %d x
->8     belong          x               %d x
->12    belong          x               %d
-#
-0      string          IT02            FIT image data
->4     belong          x               \b, %d x
->8     belong          x               %d x
->12    belong          x               %d
-#
-2048   string          PCD_IPI         Kodak Photo CD image pack file
->0xe02 byte&0x03       0x00            , landscape mode
->0xe02 byte&0x03       0x01            , portrait mode
->0xe02 byte&0x03       0x02            , landscape mode
->0xe02 byte&0x03       0x03            , portrait mode
-0      string          PCD_OPA         Kodak Photo CD overview pack file
-
-# FITS format.  Jeff Uphoff <juphoff@tarsier.cv.nrao.edu>
-# FITS is the Flexible Image Transport System, the de facto standard for
-# data and image transfer, storage, etc., for the astronomical community.
-# (FITS floating point formats are big-endian.)
-0      string  SIMPLE\ \ =     FITS image data
->109   string  8               \b, 8-bit, character or unsigned binary integer
->108   string  16              \b, 16-bit, two's complement binary integer
->107   string  \ 32            \b, 32-bit, two's complement binary integer
->107   string  -32             \b, 32-bit, floating point, single precision
->107   string  -64             \b, 64-bit, floating point, double precision
-
-# other images
-0      string  This\ is\ a\ BitMap\ file       Lisp Machine bit-array-file
-0      string          !!              Bennet Yee's "face" format
-
-# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image
-# stuff.
-#
-0      beshort         0x1010          PEX Binary Archive
-
-# Visio drawings
-03000  string  Visio\ (TM)\ Drawing    %s
-
-# Tgif files
-0      string  \%TGIF\ x               Tgif file version %s
-
-# DICOM medical imaging data
-128    string  DICM                    DICOM medical imaging data
-
-# XWD - X Window Dump file.
-#   As described in /usr/X11R6/include/X11/XWDFile.h
-#   used by the xwd program.
-#   Bradford Castalia, idaeim, 1/01
-4      belong  7                       XWD X Window Dump image data
->100   string  >\0                     \b, "%s"
->16    belong  x                       \b, %dx
->20    belong  x                       \b%dx
->12    belong  x                       \b%d
-
-# PDS - Planetary Data System
-#   These files use Parameter Value Language in the header section.
-#   Unfortunately, there is no certain magic, but the following
-#   strings have been found to be most likely.
-0      string  NJPL1I00                PDS (JPL) image data
-2      string  NJPL1I                  PDS (JPL) image data
-0      string  CCSD3ZF                 PDS (CCSD) image data
-2      string  CCSD3Z                  PDS (CCSD) image data
-0      string  PDS_                    PDS image data
-0      string  LBLSIZE=                PDS (VICAR) image data
-
-# pM8x: ATARI STAD compressed bitmap format
-#
-# from Oskar Schirmer <schirmer@scara.com> Feb 2, 2001
-# p M 8 5/6 xx yy zz data...
-# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
-# bytes either run horizontally (pM85) or vertically (pM86). yy is the
-# most frequent byte, xx and zz are runlength escape codes, where xx is
-# used for runs of yy.
-#
-0      string  pM85            Atari ST STAD bitmap image data (hor)
->5     byte    0x00            (white background)
->5     byte    0xFF            (black background)
-0      string  pM86            Atari ST STAD bitmap image data (vert)
->5     byte    0x00            (white background)
->5     byte    0xFF            (black background)
-
-# XXX:
-# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
-# magic.
-# SGI RICE image file <mpruett@sgi.com>
-#0     beshort 0x5249          RICE image
-#>2    beshort x               v%d
-#>4    beshort x               (%d x
-#>6    beshort x               %d)
-#>8    beshort 0               8 bit
-#>8    beshort 1               10 bit
-#>8    beshort 2               12 bit
-#>8    beshort 3               13 bit
-#>10   beshort 0               4:2:2
-#>10   beshort 1               4:2:2:4
-#>10   beshort 2               4:4:4
-#>10   beshort 3               4:4:4:4
-#>12   beshort 1               RGB
-#>12   beshort 2               CCIR601
-#>12   beshort 3               RP175
-#>12   beshort 4               YUV
-
-#------------------------------------------------------------------------------
-#
-# Marco Schmidt (marcoschmidt@users.sourceforge.net) -- an image  file format
-# for the EPOC operating system, which is used with PDAs like those from Psion
-#
-# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description
-# of various EPOC file formats
-
-0      string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file
-
-# PCX image files
-# From: Dan Fandrich <dan@coneharvesters.com>
-0      beshort         0x0a00  PCX ver. 2.5 image data
-0      beshort         0x0a02  PCX ver. 2.8 image data, with palette
-0      beshort         0x0a03  PCX ver. 2.8 image data, without palette
-0      beshort         0x0a04  PCX for Windows image data
-0      beshort         0x0a05  PCX ver. 3.0 image data
->4     leshort         x      bounding box [%hd,
->6     leshort         x      %hd] -
->8     leshort         x      [%hd,
->10    leshort         x      %hd],
->65    byte            >1      %d planes each of
->3     byte            x       %hhd-bit
->68    byte            0       image,
->68    byte            1       colour,
->68    byte            2       grayscale,
->68    byte            >2      image,
->68    byte            <0      image,
->12    leshort         >0      %hd x
->>14   leshort         x      %hd dpi,
->2     byte            0       uncompressed
->2     byte            1       RLE compressed
-
-# Adobe Photoshop
-0      string          8BPS Adobe Photoshop Image
-
-# XV thumbnail indicator (ThMO)
-0      string          P7\ 332         XV thumbnail image data
-
-# NITF is defined by United States MIL-STD-2500A
-0      string  NITF    National Imagery Transmission Format
->25    string  >\0     dated %.14s
-
-# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff)
-0      belong          0x00010008      GEM Image data
->12    beshort         x               %d x
->14    beshort         x               %d,
->4     beshort         x               %d planes,
->8     beshort         x               %d x
->10    beshort         x               %d pixelsize
-
-# GEM Metafile (Wolfram Kleff)
-0      lelong          0x0018FFFF      GEM Metafile data
->4     leshort         x               version %d
-
-#
-# SMJPEG. A custom Motion JPEG format used by Loki Entertainment
-# Software Torbjorn Andersson <d91tan@Update.UU.SE>.
-#
-0      string  \0\nSMJPEG      SMJPEG
->8     belong  x               %d.x data
-# According to the specification you could find any number of _TXT
-# headers here, but I can't think of any way of handling that. None of
-# the SMJPEG files I tried it on used this feature. Even if such a
-# file is encountered the output should still be reasonable.
->16    string  _SND            \b,
->>24   beshort >0              %d Hz
->>26   byte    8               8-bit
->>26   byte    16              16-bit
->>28   string  NONE            uncompressed
-# >>28 string  APCM            ADPCM compressed
->>27   byte    1               mono
->>28   byte    2               stereo
-# Help! Isn't there any way to avoid writing this part twice?
->>32   string  _VID            \b,
-# >>>48        string  JFIF            JPEG
->>>40  belong  >0              %d frames
->>>44  beshort >0              (%d x
->>>46  beshort >0              %d)
->16    string  _VID            \b,
-# >>32 string  JFIF            JPEG
->>24   belong  >0              %d frames
->>28   beshort >0              (%d x
->>30   beshort >0              %d)
-
-0      string  Paint\ Shop\ Pro\ Image\ File   Paint Shop Pro Image File
-
-# "thumbnail file" (icon)
-# descended from "xv", but in use by other applications as well (Wolfram Kleff)
-0       string          P7\ 332         XV "thumbnail file" (icon) data
-
-# taken from fkiss: (<yav@mte.biglobe.ne.jp> ?)
-0       string          KiSS            KISS/GS
->4      byte            16              color
->>5     byte            x               %d bit
->>8     leshort         x               %d colors
->>10    leshort         x               %d groups
->4      byte            32              cell
->>5     byte            x               %d bit
->>8     leshort         x               %d x
->>10    leshort         x               %d
->>12    leshort         x               +%d
->>14    leshort         x               +%d
-
-# Webshots (www.webshots.com), by John Harrison
-0       string          C\253\221g\230\0\0\0 Webshots Desktop .wbz file
-
-# Hercules DASD image files
-# From Jan Jaeger <jj@septa.nl>
-0       string  CKD_P370        Hercules CKD DASD image file
->8      long    x               \b, %d heads per cylinder
->12     long    x               \b, track size %d bytes
->16     byte    x               \b, device type 33%2.2X
-
-0       string  CKD_C370        Hercules compressed CKD DASD image file
->8      long    x               \b, %d heads per cylinder
->12     long    x               \b, track size %d bytes
->16     byte    x               \b, device type 33%2.2X
-
-0       string  CKD_S370        Hercules CKD DASD shadow file
->8      long    x               \b, %d heads per cylinder
->12     long    x               \b, track size %d bytes
->16     byte    x               \b, device type 33%2.2X
-
-# Squeak images and - etoffi@softhome.net
-0 string \146\031\0\0  Squeak image data
-0 string 'From\040Squeak  Squeak program text
-
-# partimage: file(1) magic for PartImage files (experimental, incomplete)
-# Author: Hans-Joachim Baader <hjb@pro-linux.de>
-0              string  PaRtImAgE-VoLuMe        PartImage
->0x0020                string  0.6.1           file version %s
->>0x0060       lelong  >-1             volume %ld
-#>>0x0064 8 byte identifier
-#>>0x007c reserved
->>0x0200       string  >\0             type %s
->>0x1400       string  >\0             device %s,
->>0x1600       string  >\0             original filename %s,
-# Some fields omitted
->>0x2744       lelong  0               not compressed
->>0x2744       lelong  1               gzip compressed
->>0x2744       lelong  2               bzip2 compressed
->>0x2744       lelong  >2              compressed with unknown algorithm
->0x0020                string  >0.6.1          file version %s
->0x0020                string  <0.6.1          file version %s
-
-# DCX is multi-page PCX, using a simple header of up to 1024
-# offsets for the respective PCX components.
-# From: Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de>
-0      lelong  987654321       DCX multi-page PCX image data
-
-# Simon Walton <simonw@matteworld.com>
-# Kodak Cineon format for scanned negatives
-# http://www.kodak.com/US/en/motion/support/dlad/
-0      lelong  0xd75f2a80      Cineon image data
->200   belong  >0              \b, %ld x
->204   belong  >0              %ld
-
-
-# Bio-Rad .PIC is an image format used by microscope control systems
-# and related image processing software used by biologists.
-# From: Vebjorn Ljosa <vebjorn@ljosa.com>
-54     leshort 12345           Bio-Rad .PIC Image File
->0     leshort >0              %hd x
->2     leshort >0              %hd,
->4     leshort =1              1 image in file
->4     leshort >1              %hd images in file
-
-# From Jan "Yenya" Kasprzak <kas@fi.muni.cz>
-# The description of *.mrw format can be found at
-# http://www.dalibor.cz/minolta/raw_file_format.htm
-0      string  \000MRM                 Minolta Dimage camera raw image data
-
-# From: stephane.loeuillet@tiscali.f
-# http://www.djvuzone.org/
-0      string  AT&TFORM                DjVu Image file
-
-# From: Jason Bacon <bacon@smithers.neuro.mcw.edu>
-0      beshort 0x3020                  character Computer Graphics Metafile
-
-
-
-# From: Tom Hilinski <tom.hilinski@comcast.net>
-# http://www.unidata.ucar.edu/packages/netcdf/
-0      string  CDF\001                 netcdf file
-#
-#------------------------------------------------------------------------------
-# tuxedo:      file(1) magic for BEA TUXEDO data files
-#
-# from Ian Springer <ispringer@hotmail.com>
-#
-0      string          \0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0      BEA TUXEDO DES mask data
-
-#------------------------------------------------------------------------------
-# timezone:  file(1) magic for timezone data
-#
-# from Daniel Quinlan (quinlan@yggdrasil.com)
-# this should work on Linux, SunOS, and maybe others
-# Added new official magic number for recent versions of the Olson code
-0      string  TZif    timezone data
-0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0      old timezone data
-0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0      old timezone data
-0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0      old timezone data
-0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0      old timezone data
-0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0      old timezone data
-0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0      old timezone data
-
-#------------------------------------------------------------------------------
-# project:  file(1) magic for Project management
-# 
-# Magic strings for ftnchek project files. Alexander Mai
-0      string  FTNCHEK_\ P     project file for ftnchek
->10    string  1               version 2.7
->10    string  2               version 2.8 to 2.10
->10    string  3               version 2.11 or later
-#------------------------------------------------------------------------------
-# cisco:  file(1) magic for cisco Systems routers
-#
-# Most cisco file-formats are covered by the generic elf code
-#
-# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.
-0      belong&0xffffff00       0x85011400  cisco IOS microcode
->7     string          >\0                 for '%s'
-0      belong&0xffffff00       0x8501cb00  cisco IOS experimental microcode
->7     string          >\0                 for '%s'
-#------------------------------------------------------------------------------
-# mach file description
-#
-0      belong          0xcafebabe      Mach-O fat file
->4     belong          1               with 1 architecture
->4     belong          >1
->>4    belong          x               with %ld architectures          
-#
-0      belong          0xfeedface      Mach-O
->12    belong          1               object
->12    belong          2               executable
->12    belong          3               shared library
->12    belong          4               core
->12    belong          5               preload executable
->12    belong          6               dynamically linked shared library
->12    belong          7               dynamic linker
->12    belong          8               bundle
->12    belong          >8
->>12   belong          x               filetype=%ld
->4     belong          <0
->>4    belong          x               architecture=%ld
->4     belong          1               vax
->4     belong          2               romp
->4     belong          3               architecture=3
->4     belong          4               ns32032
->4     belong          5               ns32332
->4     belong          6               for m68k architecture
-# from NeXTstep 3.0 <mach/machine.h>
-# i.e. mc680x0_all, ignore
-# >>8  belong          1               (mc68030)
->>8    belong          2               (mc68040)
->>8    belong          3               (mc68030 only)
->4     belong          7               i386
->4     belong          8               mips
->4     belong          9               ns32532
->4     belong          10              architecture=10
->4     belong          11              hp pa-risc
->4     belong          12              acorn
->4     belong          13              m88k
->4     belong          14              sparc
->4     belong          15              i860-big
->4     belong          16              i860
->4     belong          17              rs6000
->4     belong          18              ppc
->4     belong          >18
->>4    belong          x               architecture=%ld
-
-#------------------------------------------------------------------------------
-# mkid:  file(1) magic for mkid(1) databases
-#
-# ID is the binary tags database produced by mkid(1).
-#
-# XXX - byte order?
-#
-0      string          \311\304        ID tags data
->2     short           >0              version %d
-
-#------------------------------------------------------------------------------
-# pgp:  file(1) magic for Pretty Good Privacy
-#
-0       beshort         0x9900                  PGP key public ring
-0       beshort         0x9501                  PGP key security ring
-0       beshort         0x9500                  PGP key security ring
-0      beshort         0xa600                  PGP encrypted data
-0       string          -----BEGIN\040PGP       PGP armored data
->15     string          PUBLIC\040KEY\040BLOCK- public key block
->15     string          MESSAGE-                message
->15     string          SIGNED\040MESSAGE-      signed message
->15     string          PGP\040SIGNATURE-       signature
-
-#------------------------------------------------------------------------------
-# terminfo:  file(1) magic for terminfo
-#
-# XXX - byte order for screen images?
-#
-0      string          \032\001        Compiled terminfo entry
-0      short           0433            Curses screen image
-0      short           0434            Curses screen image
-
-#------------------------------------------------------------------------------
-# printer:  file(1) magic for printer-formatted files
-#
-
-# PostScript, updated by Daniel Quinlan (quinlan@yggdrasil.com)
-0      string          %!              PostScript document text
->2     string          PS-Adobe-       conforming
->>11   string          >\0             at level %.3s
->>>15  string          EPS             - type %s
->>>15  string          Query           - type %s
->>>15  string          ExitServer      - type %s
-# Some PCs have the annoying habit of adding a ^D as a document separator
-0      string          \004%!          PostScript document text
->3     string          PS-Adobe-       conforming
->>12   string          >\0             at level %.3s
->>>16  string          EPS             - type %s
->>>16  string          Query           - type %s
->>>16  string          ExitServer      - type %s
-0      string          \033%-12345X%!PS        PostScript document
-
-
-# DOS EPS Binary File Header
-# From: Ed Sznyter <ews@Black.Market.NET>
-0       belong          0xC5D0D3C6      DOS EPS Binary File
->4      long            >0              Postscript starts at byte %d
->>8     long            >0              length %d
->>>12   long            >0              Metafile starts at byte %d
->>>>16  long            >0              length %d
->>>20   long            >0              TIFF starts at byte %d
->>>>24  long            >0              length %d
-
-# Adobe's PostScript Printer Description (PPD) files
-#       Yves Arrouye <arrouye@marin.fdn.fr>
-#
-0      string          *PPD-Adobe:    PPD file
->13    string          x              \b, ve
-
-# HP Printer Job Language
-0      string          \033%-12345X@PJL        HP Printer Job Language data
-# HP Printer Job Language
-# The header found on Win95 HP plot files is the "Silliest Thing possible" 
-# (TM)
-# Every driver puts the language at some random position, with random case
-# (LANGUAGE and Language)
-# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10
-# From: Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>
-# 
-0      string          \033%-12345X@PJL        HP Printer Job Language data
->&0    string          >\0                     %s                      
->>&0   string          >\0                     %s                      
->>>&0  string          >\0                     %s              
->>>>&0 string          >\0                     %s              
-#>15   string          \ ENTER\ LANGUAGE\ =
-#>31   string          PostScript              PostScript
-
-# HP Printer Control Language, Daniel Quinlan (quinlan@yggdrasil.com)
-0      string          \033E\033       HP PCL printer data
->3     string          \&l0A           - default page size
->3     string          \&l1A           - US executive page size
->3     string          \&l2A           - US letter page size
->3     string          \&l3A           - US legal page size
->3     string          \&l26A          - A4 page size
->3     string          \&l80A          - Monarch envelope size
->3     string          \&l81A          - No. 10 envelope size
->3     string          \&l90A          - Intl. DL envelope size
->3     string          \&l91A          - Intl. C5 envelope size
->3     string          \&l100A         - Intl. B5 envelope size
->3     string          \&l-81A         - No. 10 envelope size (landscape)
->3     string          \&l-90A         - Intl. DL envelope size (landscape)
-
-# IMAGEN printer-ready files:
-0      string  @document(              Imagen printer
-# this only works if "language xxx" is first item in Imagen header.
->10    string  language\ impress       (imPRESS data)
->10    string  language\ daisy         (daisywheel text)
->10    string  language\ diablo        (daisywheel text)
->10    string  language\ printer       (line printer emulation)
->10    string  language\ tektronix     (Tektronix 4014 emulation)
-# Add any other languages that your Imagen uses - remember
-# to keep the word `text' if the file is human-readable.
-# [GRR 950115:  missing "postscript" or "ultrascript" (whatever it was called)]
-#
-# Now magic for IMAGEN font files...
-0      string          Rast            RST-format raster font data
->45    string          >0              face %s
-# From Jukka Ukkonen
-0      string          \033[K\002\0\0\017\033(a\001\0\001\033(g        Canon Bubble Jet BJC formatted data
-
-# From <mike@flyn.org>
-# These are the /etc/magic entries to decode data sent to an Epson printer.
-0       string          \x1B\x40\x1B\x28\x52\x08\x00\x00REMOTE1P        Epson Stylus Color 460 data
-
-
-#------------------------------------------------------------------------------
-# zenographics:  file(1) magic for Zenographics ZjStream printer data
-# Rick Richardson  rickr@mn.rr.com
-0      string          JZJZ
->0x12  string          ZZ              Zenographics ZjStream printer data (big-endian)
-0      string          ZJZJ
->0x12  string          ZZ              Zenographics ZjStream printer data (little-endian)
-
-
-#------------------------------------------------------------------------------
-# Oak Technologies printer stream
-# Rick Richardson <rickr@mn.rr.com>
-0       string          OAK
->0x07  byte            0
->0x0b  byte            0       Oak Technologies printer stream
-
-# This would otherwise be recognized as PostScript - nick@debian.org
-0      string          %!VMF           SunClock's Vector Map Format data
-
-#------------------------------------------------------------------------------
-# HP LaserJet 1000 series downloadable firmware file
-0      string  \xbe\xefABCDEFGH        HP LaserJet 1000 series downloadable firmware   
-
-#------------------------------------------------------------------------------
-# apple:  file(1) magic for Apple file formats
-#
-0      string          FiLeStArTfIlEsTaRt      binscii (apple ][) text
-0      string          \x0aGL                  Binary II (apple ][) data
-0      string          \x76\xff                Squeezed (apple ][) data
-0      string          NuFile                  NuFile archive (apple ][) data
-0      string          N\xf5F\xe9l\xe5         NuFile archive (apple ][) data
-0      belong          0x00051600              AppleSingle encoded Macintosh file
-0      belong          0x00051607              AppleDouble encoded Macintosh file
-
-# magic for Newton PDA package formats
-# from Ruda Moura <ruda@helllabs.org>
-0      string  package0        Newton package, NOS 1.x,
->12    belong  &0x80000000     AutoRemove,
->12    belong  &0x40000000     CopyProtect,
->12    belong  &0x10000000     NoCompression,
->12    belong  &0x04000000     Relocation,
->12    belong  &0x02000000     UseFasterCompression,
->16    belong  x               version %d
-
-0      string  package1        Newton package, NOS 2.x,
->12    belong  &0x80000000     AutoRemove,
->12    belong  &0x40000000     CopyProtect,
->12    belong  &0x10000000     NoCompression,
->12    belong  &0x04000000     Relocation,
->12    belong  &0x02000000     UseFasterCompression,
->16    belong  x               version %d
-
-0      string  package4        Newton package,
->8     byte    8               NOS 1.x,
->8     byte    9               NOS 2.x,
->12    belong  &0x80000000     AutoRemove,
->12    belong  &0x40000000     CopyProtect,
->12    belong  &0x10000000     NoCompression,
-
-# The following entries for the Apple II are for files that have
-# been transferred as raw binary data from an Apple, without having
-# been encapsulated by any of the above archivers.
-#
-# In general, Apple II formats are hard to identify because Apple DOS
-# and especially Apple ProDOS have strong typing in the file system and
-# therefore programmers never felt much need to include type information
-# in the files themselves.
-#
-# Eric Fischer <enf@pobox.com>
-
-# AppleWorks word processor:
-#
-# This matches the standard tab stops for an AppleWorks file, but if
-# a file has a tab stop set in the first four columns this will fail.
-#
-# The "O" is really the magic number, but that's so common that it's
-# necessary to check the tab stops that follow it to avoid false positives.
-
-4       string          O====   AppleWorks word processor data
->85     byte&0x01       >0      \b, zoomed
->90     byte&0x01       >0      \b, paginated
->92     byte&0x01       >0      \b, with mail merge
-#>91    byte            x       \b, left margin %d
-
-# AppleWorks database:
-#
-# This isn't really a magic number, but it's the closest thing to one
-# that I could find.  The 1 and 2 really mean "order in which you defined
-# categories" and "left to right, top to bottom," respectively; the D and R
-# mean that the cursor should move either down or right when you press Return.
-
-#30    string          \x01D   AppleWorks database data
-#30    string          \x02D   AppleWorks database data
-#30    string          \x01R   AppleWorks database data
-#30    string          \x02R   AppleWorks database data
-
-# AppleWorks spreadsheet:
-#
-# Likewise, this isn't really meant as a magic number.  The R or C means
-# row- or column-order recalculation; the A or M means automatic or manual
-# recalculation.
-
-#131   string          RA      AppleWorks spreadsheet data
-#131   string          RM      AppleWorks spreadsheet data
-#131   string          CA      AppleWorks spreadsheet data
-#131   string          CM      AppleWorks spreadsheet data
-
-# Applesoft BASIC:
-#
-# This is incredibly sloppy, but will be true if the program was
-# written at its usual memory location of 2048 and its first line
-# number is less than 256.  Yuck.
-
-0       belong&0xff00ff 0x80000 Applesoft BASIC program data
-#>2     leshort         x       \b, first line number %d
-
-# ORCA/EZ assembler:
-# 
-# This will not identify ORCA/M source files, since those have
-# some sort of date code instead of the two zero bytes at 6 and 7
-# XXX Conflicts with ELF
-#4       belong&0xff00ffff       0x01000000      ORCA/EZ assembler source data
-#>5      byte                    x               \b, build number %d
-
-# Broderbund Fantavision
-#
-# I don't know what these values really mean, but they seem to recur.
-# Will they cause too many conflicts?
-
-# Probably :-)
-#2     belong&0xFF00FF         0x040008        Fantavision movie data
-
-# Some attempts at images.
-#
-# These are actually just bit-for-bit dumps of the frame buffer, so
-# there's really no reasonably way to distinguish them except for their
-# address (if preserved) -- 8192 or 16384 -- and their length -- 8192
-# or, occasionally, 8184.
-#
-# Nevertheless this will manage to catch a lot of images that happen
-# to have a solid-colored line at the bottom of the screen.
-
-8144   string  \x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F        Apple II image with white background
-8144   string  \x55\x2A\x55\x2A\x55\x2A\x55\x2A        Apple II image with purple background
-8144   string  \x2A\x55\x2A\x55\x2A\x55\x2A\x55        Apple II image with green background
-8144   string  \xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA        Apple II image with blue background
-8144   string  \xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5        Apple II image with orange background
-
-# Beagle Bros. Apple Mechanic fonts
-
-0      belong&0xFF00FFFF       0x6400D000      Apple Mechanic font
-
-# Apple Universal Disk Image Format (UDIF) - dmg files.
-# From Johan Gade.
-# These entries are disabled for now until we fix the following issues.
-#
-# Note there might be some problems with the "VAX COFF executable" 
-# entry. Note this entry should be placed before the mac filesystem section, 
-# particularly the "Apple Partition data" entry.
-#
-# The intended meaning of these tests is, that the file is only of the 
-# specified type if both of the lines are correct - i.e. if the first
-# line matches and the second doesn't then it is not of that type.
-#
-#0     long    0x7801730d
-#>4    long    0x62626060      UDIF read-only zlib-compressed image (UDZO)
-#
-# Note that this entry is recognized correctly by the "Apple Partition 
-# data" entry - however since this entry is more specific - this
-# information seems to be more useful.
-#0     long    0x45520200
-#>0x410        string  disk\ image     UDIF read/write image (UDRW)
-
-#------------------------------------------------------------------------------
-# applix:  file(1) magic for Applixware
-# From: Peter Soos <sp@osb.hu>
-#
-0      string          *BEGIN          Applixware
->7     string          WORDS                   Words Document
->7     string          GRAPHICS                Graphic
->7     string          RASTER                  Bitmap
->7     string          SPREADSHEETS            Spreadsheet
->7     string          MACRO                   Macro
->7     string          BUILDER                 Builder Object
-
-#------------------------------------------------------------------------------
-# interleaf:  file(1) magic for InterLeaf TPS:
-#
-0      string          =\210OPS        Interleaf saved data
-0      string          =<!OPS          Interleaf document text
->5     string          ,\ Version\ =   \b, version
->>17   string          >\0             %.3s
-
-#------------------------------------------------------------------------------
-# lisp:  file(1) magic for lisp programs
-#
-# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
-
-# This is a guess, but a good one.
-0      string  ;;                      Lisp/Scheme program text
-
-# Emacs 18 - this is always correct, but not very magical.
-0      string  \012(                   Emacs v18 byte-compiled Lisp data
-# Emacs 19+ - ver. recognition added by Ian Springer
-# Also applies to XEmacs 19+ .elc files; could tell them apart if we had regexp
-# support or similar - Chris Chittleborough <cchittleborough@yahoo.com.au>
-0      string  ;ELC                    
->4     byte    >19                     
->4     byte    <32                     Emacs/XEmacs v%d byte-compiled Lisp data
-
-# Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr>
-0      string  (SYSTEM::VERSION\040'   CLISP byte-compiled Lisp program text
-0      long    0x70768BD2              CLISP memory image data
-0      long    0xD28B7670              CLISP memory image data, other endian
-
-# Files produced by GNU gettext
-0      long    0xDE120495              GNU-format message catalog data
-0      long    0x950412DE              GNU-format message catalog data
-
-#.com and .bin for MIT scheme 
-0      string  \372\372\372\372        MIT scheme (library?)
-
-# From: David Allouche <david@allouche.net>
-0      string  \<TeXmacs|      TeXmacs document text
-
-#------------------------------------------------------------------------------
-# spec:  file(1) magic for SPEC raw results (*.raw, *.rsf)
-#
-# Cloyce D. Spradling <cloyce@headgear.org>
-
-0      string  spec                    SPEC
->4     string  .cpu                    CPU
->>8    string  <:                      \b%.4s
->>12   string  .                       raw result text
-
-17     string  version=SPECjbb         SPECjbb
->32    string  <:                      \b%.4s
->>37   string  <:                      v%.4s raw result text
-
-0      string  BEGIN\040SPECWEB        SPECweb
->13    string  <:                      \b%.2s
->>15   string  _SSL                    \b_SSL
->>>20  string  <:                      v%.4s raw result text
->>16   string  <:                      v%.4s raw result text
-
-#------------------------------------------------------------------------------
-# sniffer:  file(1) magic for packet capture files
-#
-# From: guy@alum.mit.edu (Guy Harris)
-#
-
-#
-# Microsoft Network Monitor 1.x capture files.
-#
-0      string          RTSS            NetMon capture file
->5     byte            x               - version %d
->4     byte            x               \b.%d
->6     leshort         0               (Unknown)
->6     leshort         1               (Ethernet)
->6     leshort         2               (Token Ring)
->6     leshort         3               (FDDI)
->6     leshort         4               (ATM)
-
-#
-# Microsoft Network Monitor 2.x capture files.
-#
-0      string          GMBU            NetMon capture file
->5     byte            x               - version %d
->4     byte            x               \b.%d
->6     leshort         0               (Unknown)
->6     leshort         1               (Ethernet)
->6     leshort         2               (Token Ring)
->6     leshort         3               (FDDI)
->6     leshort         4               (ATM)
-
-#
-# Network General Sniffer capture files.
-# Sorry, make that "Network Associates Sniffer capture files."
-# Sorry, make that "Network General old DOS Sniffer capture files."
-#
-0      string          TRSNIFF\ data\ \ \ \ \032       Sniffer capture file
->33    byte            2               (compressed)
->23    leshort         x               - version %d
->25    leshort         x               \b.%d
->32    byte            0               (Token Ring)
->32    byte            1               (Ethernet)
->32    byte            2               (ARCNET)
->32    byte            3               (StarLAN)
->32    byte            4               (PC Network broadband)
->32    byte            5               (LocalTalk)
->32    byte            6               (Znet)
->32    byte            7               (Internetwork Analyzer)
->32    byte            9               (FDDI)
->32    byte            10              (ATM)
-
-#
-# Cinco Networks NetXRay capture files.
-# Sorry, make that "Network General Sniffer Basic capture files."
-# Sorry, make that "Network Associates Sniffer Basic capture files."
-# Sorry, make that "Network Associates Sniffer Basic, and Windows
-# Sniffer Pro", capture files."
-# Sorry, make that "Network General Sniffer capture files."
-#
-0      string          XCP\0           NetXRay capture file
->4     string          >\0             - version %s
->44    leshort         0               (Ethernet)
->44    leshort         1               (Token Ring)
->44    leshort         2               (FDDI)
->44    leshort         3               (WAN)
->44    leshort         8               (ATM)
->44    leshort         9               (802.11)
-
-#
-# "libpcap" capture files.
-# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
-# the main program that uses that format, but there are other programs
-# that use "libpcap", or that use the same capture file format.)
-#
-0      ubelong         0xa1b2c3d4      tcpdump capture file (big-endian)
->4     beshort         x               - version %d
->6     beshort         x               \b.%d
->20    belong          0               (No link-layer encapsulation
->20    belong          1               (Ethernet
->20    belong          2               (3Mb Ethernet
->20    belong          3               (AX.25
->20    belong          4               (ProNET
->20    belong          5               (CHAOS
->20    belong          6               (Token Ring
->20    belong          7               (BSD ARCNET
->20    belong          8               (SLIP
->20    belong          9               (PPP
->20    belong          10              (FDDI
->20    belong          11              (RFC 1483 ATM
->20    belong          12              (raw IP
->20    belong          13              (BSD/OS SLIP
->20    belong          14              (BSD/OS PPP
->20    belong          19              (Linux ATM Classical IP
->20    belong          50              (PPP or Cisco HDLC
->20    belong          51              (PPP-over-Ethernet
->20    belong          99              (Symantec Enterprise Firewall
->20    belong          100             (RFC 1483 ATM
->20    belong          101             (raw IP
->20    belong          102             (BSD/OS SLIP
->20    belong          103             (BSD/OS PPP
->20    belong          104             (BSD/OS Cisco HDLC
->20    belong          105             (802.11
->20    belong          106             (Linux Classical IP over ATM
->20    belong          107             (Frame Relay
->20    belong          108             (OpenBSD loopback
->20    belong          109             (OpenBSD IPsec encrypted
->20    belong          112             (Cisco HDLC
->20    belong          113             (Linux "cooked"
->20    belong          114             (LocalTalk
->20    belong          117             (OpenBSD PFLOG
->20    belong          119             (802.11 with Prism header
->20    belong          122             (RFC 2625 IP over Fibre Channel
->20    belong          123             (SunATM
->20    belong          127             (802.11 with radiotap header
->20    belong          129             (Linux ARCNET
->20    belong          138             (Apple IP over IEEE 1394
->20    belong          140             (MTP2
->20    belong          141             (MTP3
->20    belong          143             (DOCSIS
->20    belong          144             (IrDA
->20    belong          147             (Private use 0
->20    belong          148             (Private use 1
->20    belong          149             (Private use 2
->20    belong          150             (Private use 3
->20    belong          151             (Private use 4
->20    belong          152             (Private use 5
->20    belong          153             (Private use 6
->20    belong          154             (Private use 7
->20    belong          155             (Private use 8
->20    belong          156             (Private use 9
->20    belong          157             (Private use 10
->20    belong          158             (Private use 11
->20    belong          159             (Private use 12
->20    belong          160             (Private use 13
->20    belong          161             (Private use 14
->20    belong          162             (Private use 15
->20    belong          163             (802.11 with AVS header
->16    belong          x               \b, capture length %d)
-0      ulelong         0xa1b2c3d4      tcpdump capture file (little-endian)
->4     leshort         x               - version %d
->6     leshort         x               \b.%d
->20    lelong          0               (No link-layer encapsulation
->20    lelong          1               (Ethernet
->20    lelong          2               (3Mb Ethernet
->20    lelong          3               (AX.25
->20    lelong          4               (ProNET
->20    lelong          5               (CHAOS
->20    lelong          6               (Token Ring
->20    lelong          7               (ARCNET
->20    lelong          8               (SLIP
->20    lelong          9               (PPP
->20    lelong          10              (FDDI
->20    lelong          11              (RFC 1483 ATM
->20    lelong          12              (raw IP
->20    lelong          13              (BSD/OS SLIP
->20    lelong          14              (BSD/OS PPP
->20    lelong          19              (Linux ATM Classical IP
->20    lelong          50              (PPP or Cisco HDLC
->20    lelong          51              (PPP-over-Ethernet
->20    lelong          99              (Symantec Enterprise Firewall
->20    lelong          100             (RFC 1483 ATM
->20    lelong          101             (raw IP
->20    lelong          102             (BSD/OS SLIP
->20    lelong          103             (BSD/OS PPP
->20    lelong          104             (BSD/OS Cisco HDLC
->20    lelong          105             (802.11
->20    lelong          106             (Linux Classical IP over ATM
->20    lelong          107             (Frame Relay
->20    lelong          108             (OpenBSD loopback
->20    lelong          109             (OpenBSD IPsec encrypted
->20    lelong          112             (Cisco HDLC
->20    lelong          113             (Linux "cooked"
->20    lelong          114             (LocalTalk
->20    lelong          117             (OpenBSD PFLOG
->20    lelong          119             (802.11 with Prism header
->20    lelong          122             (RFC 2625 IP over Fibre Channel
->20    lelong          123             (SunATM
->20    lelong          127             (802.11 with radiotap header
->20    lelong          129             (Linux ARCNET
->20    lelong          138             (Apple IP over IEEE 1394
->20    lelong          140             (MTP2
->20    lelong          141             (MTP3
->20    lelong          143             (DOCSIS
->20    lelong          144             (IrDA
->20    lelong          147             (Private use 0
->20    lelong          148             (Private use 1
->20    lelong          149             (Private use 2
->20    lelong          150             (Private use 3
->20    lelong          151             (Private use 4
->20    lelong          152             (Private use 5
->20    lelong          153             (Private use 6
->20    lelong          154             (Private use 7
->20    lelong          155             (Private use 8
->20    lelong          156             (Private use 9
->20    lelong          157             (Private use 10
->20    lelong          158             (Private use 11
->20    lelong          159             (Private use 12
->20    lelong          160             (Private use 13
->20    lelong          161             (Private use 14
->20    lelong          162             (Private use 15
->20    lelong          163             (802.11 with AVS header
->16    lelong          x               \b, capture length %d)
-
-#
-# "libpcap"-with-Alexey-Kuznetsov's-patches capture files.
-# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
-# the main program that uses that format, but there are other programs
-# that use "libpcap", or that use the same capture file format.)
-#
-0      ubelong         0xa1b2cd34      extended tcpdump capture file (big-endian)
->4     beshort         x               - version %d
->6     beshort         x               \b.%d
->20    belong          0               (No link-layer encapsulation
->20    belong          1               (Ethernet
->20    belong          2               (3Mb Ethernet
->20    belong          3               (AX.25
->20    belong          4               (ProNET
->20    belong          5               (CHAOS
->20    belong          6               (Token Ring
->20    belong          7               (ARCNET
->20    belong          8               (SLIP
->20    belong          9               (PPP
->20    belong          10              (FDDI
->20    belong          11              (RFC 1483 ATM
->20    belong          12              (raw IP
->20    belong          13              (BSD/OS SLIP
->20    belong          14              (BSD/OS PPP
->16    belong          x               \b, capture length %d)
-0      ulelong         0xa1b2cd34      extended tcpdump capture file (little-endian)
->4     leshort         x               - version %d
->6     leshort         x               \b.%d
->20    lelong          0               (No link-layer encapsulation
->20    lelong          1               (Ethernet
->20    lelong          2               (3Mb Ethernet
->20    lelong          3               (AX.25
->20    lelong          4               (ProNET
->20    lelong          5               (CHAOS
->20    lelong          6               (Token Ring
->20    lelong          7               (ARCNET
->20    lelong          8               (SLIP
->20    lelong          9               (PPP
->20    lelong          10              (FDDI
->20    lelong          11              (RFC 1483 ATM
->20    lelong          12              (raw IP
->20    lelong          13              (BSD/OS SLIP
->20    lelong          14              (BSD/OS PPP
->16    lelong          x               \b, capture length %d)
-
-#
-# AIX "iptrace" capture files.
-#
-0      string          iptrace\ 1.0    "iptrace" capture file
-0      string          iptrace\ 2.0    "iptrace" capture file
-
-#
-# Novell LANalyzer capture files.
-#
-0      leshort         0x1001          LANalyzer capture file
-0      leshort         0x1007          LANalyzer capture file
-
-#
-# HP-UX "nettl" capture files.
-#
-0      string          \x54\x52\x00\x64\x00    "nettl" capture file
-
-#
-# RADCOM WAN/LAN Analyzer capture files.
-#
-0      string          \x42\xd2\x00\x34\x12\x66\x22\x88        RADCOM WAN/LAN Analyzer capture file
-
-#
-# NetStumbler log files.  Not really packets, per se, but about as
-# close as you can get.  These are log files from NetStumbler, a
-# Windows program, that scans for 802.11b networks.
-#
-0      string          NetS            NetStumbler log file
->8     lelong          x               \b, %d stations found
-
-#
-# EtherPeek/AiroPeek "version 9" capture files.
-#
-0      string          \177ver         EtherPeek/AiroPeek capture file
-
-#
-# Visual Networks traffic capture files.
-#
-0      string          \x05VNF         Visual Networks traffic capture file
-
-#
-# Network Instruments Observer capture files.
-#
-0      string          ObserverPktBuffe        Network Instruments Observer capture file
-
-#
-# Files from Accellent Group's 5View products.
-#
-0      string          \xaa\xaa\xaa\xaa        5View capture file
-
-#------------------------------------------------------------------------------
-# file(1) magic for revision control files
-# From Hendrik Scholz <hendrik@scholz.net>
-0   string /1\ :pserver:    cvs password text file
-#------------------------------------------------------------------------------
-# amigaos:  file(1) magic for AmigaOS binary formats:
-
-#
-# From ignatios@cs.uni-bonn.de (Ignatios Souvatzis)
-#
-0      belong          0x000003fa      AmigaOS shared library
-0      belong          0x000003f3      AmigaOS loadseg()ble executable/binary
-0      belong          0x000003e7      AmigaOS object/library data
-#
-0      beshort         0xe310          Amiga Workbench
->2     beshort         1               
->>48   byte            1               disk icon
->>48   byte            2               drawer icon
->>48   byte            3               tool icon
->>48   byte            4               project icon
->>48   byte            5               garbage icon
->>48   byte            6               device icon
->>48   byte            7               kickstart icon
->>48   byte            8               workbench application icon
->2     beshort         >1              icon, vers. %d
-#
-# various sound formats from the Amiga
-# G=F6tz Waschk <waschk@informatik.uni-rostock.de>
-#
-0      string          FC14            Future Composer 1.4 Module sound file
-0      string          SMOD            Future Composer 1.3 Module sound file
-0      string          AON4artofnoise  Art Of Noise Module sound file
-1      string          MUGICIAN/SOFTEYES Mugician Module sound file
-58     string          SIDMON\ II\ -\ THE      Sidmon 2.0 Module sound file
-0      string          Synth4.0        Synthesis Module sound file
-0      string          ARP.            The Holy Noise Module sound file
-0      string          BeEp\0          JamCracker Module sound file
-0      string          COSO\0          Hippel-COSO Module sound file
-# Too simple (short, pure ASCII, deep), MPi
-#26    string          V.3             Brian Postma's Soundmon Module sound file v3
-#26    string          BPSM            Brian Postma's Soundmon Module sound file v3
-#26    string          V.2             Brian Postma's Soundmon Module sound file v2
-
-# The following are from: "Stefan A. Haubenthal" <polluks@web.de>
-0      beshort         0x0f00          AmigaOS bitmap font
-0      beshort         0x0f03          AmigaOS outline font
-0      belong          0x80001001      AmigaOS outline tag
-0      string          ##\ version     catalog translation
-
-# Amiga disk types
-# 
-0      string          RDSK            Rigid Disk Block
->160   string          x               on %.24s
-0      string          DOS\0           Amiga DOS disk
-0      string          DOS\1           Amiga FFS disk
-0      string          DOS\2           Amiga Inter DOS disk
-0      string          DOS\3           Amiga Inter FFS disk
-0      string          DOS\4           Amiga Fastdir DOS disk
-0      string          DOS\5           Amiga Fastdir FFS disk
-0      string          KICK            Kickstart disk
-
-#------------------------------------------------------------------------------
-# database:  file(1) magic for various databases
-#
-# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
-#
-#
-# GDBM magic numbers
-#  Will be maintained as part of the GDBM distribution in the future.
-#  <downsj@teeny.org>
-0      belong  0x13579ace      GNU dbm 1.x or ndbm database, big endian
-0      lelong  0x13579ace      GNU dbm 1.x or ndbm database, little endian
-0      string  GDBM            GNU dbm 2.x database
-#
-# Berkeley DB
-#
-# Ian Darwin's file /etc/magic files: big/little-endian version.
-#
-# Hash 1.85/1.86 databases store metadata in network byte order.
-# Btree 1.85/1.86 databases store the metadata in host byte order.
-# Hash and Btree 2.X and later databases store the metadata in host byte order.
-
-0      long    0x00061561      Berkeley DB
->8     belong  4321
->>4    belong  >2              1.86
->>4    belong  <3              1.85
->>4    belong  >0              (Hash, version %d, native byte-order)
->8     belong  1234
->>4    belong  >2              1.86
->>4    belong  <3              1.85
->>4    belong  >0              (Hash, version %d, little-endian)
-
-0      belong  0x00061561      Berkeley DB
->8     belong  4321
->>4    belong  >2              1.86
->>4    belong  <3              1.85
->>4    belong  >0              (Hash, version %d, big-endian)
->8     belong  1234
->>4    belong  >2              1.86
->>4    belong  <3              1.85
->>4    belong  >0              (Hash, version %d, native byte-order)
-
-0      long    0x00053162      Berkeley DB 1.85/1.86
->4     long    >0              (Btree, version %d, native byte-order)
-0      belong  0x00053162      Berkeley DB 1.85/1.86
->4     belong  >0              (Btree, version %d, big-endian)
-0      lelong  0x00053162      Berkeley DB 1.85/1.86
->4     lelong  >0              (Btree, version %d, little-endian)
-
-12     long    0x00061561      Berkeley DB
->16    long    >0              (Hash, version %d, native byte-order)
-12     belong  0x00061561      Berkeley DB
->16    belong  >0              (Hash, version %d, big-endian)
-12     lelong  0x00061561      Berkeley DB
->16    lelong  >0              (Hash, version %d, little-endian)
-
-12     long    0x00053162      Berkeley DB
->16    long    >0              (Btree, version %d, native byte-order)
-12     belong  0x00053162      Berkeley DB
->16    belong  >0              (Btree, version %d, big-endian)
-12     lelong  0x00053162      Berkeley DB
->16    lelong  >0              (Btree, version %d, little-endian)
-
-12     long    0x00042253      Berkeley DB
->16    long    >0              (Queue, version %d, native byte-order)
-12     belong  0x00042253      Berkeley DB
->16    belong  >0              (Queue, version %d, big-endian)
-12     lelong  0x00042253      Berkeley DB
->16    lelong  >0              (Queue, version %d, little-endian)
-#
-#
-# Round Robin Database Tool by Tobias Oetiker <oetiker@ee.ethz.ch>
-0      string  RRD             RRDTool DB
->4     string  x               version %s
-#----------------------------------------------------------------------
-# ROOT: file(1) magic for ROOT databases
-#
-0       string  root\0  ROOT file
->4      belong  x       Version %d
->33     belong  x       (Compression: %d)
-
-# XXX: Weak magic.
-# Alex Ott <ott@jet.msk.su>
-## Paradox file formats
-#2       leshort       0x0800  Paradox 
-#>0x39   byte          3       v. 3.0 
-#>0x39   byte          4       v. 3.5 
-#>0x39   byte          9       v. 4.x 
-#>0x39   byte          10      v. 5.x 
-#>0x39   byte          11      v. 5.x 
-#>0x39   byte          12      v. 7.x 
-#>>0x04          byte          0       indexed .DB data file 
-#>>0x04          byte          1       primary index .PX file 
-#>>0x04          byte          2       non-indexed .DB data file 
-#>>0x04          byte          3       non-incrementing secondary index .Xnn file 
-#>>0x04          byte          4       secondary index .Ynn file 
-#>>0x04          byte          5       incrementing secondary index .Xnn file 
-#>>0x04          byte          6       non-incrementing secondary index .XGn file 
-#>>0x04          byte          7       secondary index .YGn file 
-#>>>0x04         byte          8       incrementing secondary index .XGn file 
-## XBase database files
-#0      byte       0x02        
-#>8     leshort          >0
-#>>12   leshort    0   FoxBase 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x03        
-#>8     leshort          >0
-#>>12   leshort    0   FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x04        
-#>8     leshort          >0
-#>>12   leshort    0   dBASE IV no memo file 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x05        
-#>8     leshort          >0
-#>>12   leshort    0   dBASE V no memo file 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x30
-#>8     leshort          >0
-#>>12   leshort    0   Visual FoxPro 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x43
-#>8     leshort          >0
-#>>12   leshort    0   FlagShip with memo var size 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x7b
-#>8     leshort          >0
-#>>12   leshort    0   dBASEIV with memo 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x83        
-#>8     leshort          >0
-#>>12   leshort    0   FoxBase+, dBaseIII+ with memo 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x8b
-#>8     leshort          >0
-#>>12   leshort    0   dBaseIV with memo 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0x8e        
-#>8     leshort          >0
-#>>12   leshort    0   dBaseIV with SQL Table 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0xb3
-#>8     leshort          >0
-#>>12   leshort    0   FlagShip with .dbt memo 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0      byte       0xf5
-#>8     leshort          >0
-#>>12   leshort    0   FoxPro with memo 
-#>>>0x04       lelong          0               (no records)
-#>>>0x04       lelong          >0              (%ld records)
-#
-#0     leshort         0x0006          DBase 3 index file
-
-# MS Access database
-4        string        Standard\ Jet\ DB       Microsoft Access Database
-
-# TDB database from Samba et al - Martin Pool <mbp@samba.org>
-0      string  TDB\ file               TDB database
->32    lelong  0x2601196D              version 6, little-endian
->>36   lelong  x                       hash size %d bytes
-
-# SE Linux policy database
-0       lelong  0xf97cff8c      SE Linux policy
->16     lelong  x               v%d
->20     lelong  1      MLS
->24     lelong  x       %d symbols
->28     lelong  x       %d ocons
-
-# ICE authority file data (Wolfram Kleff)
-2      string          ICE             ICE authority data
-
-# X11 Xauthority file (Wolfram Kleff)
-10     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-11     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-12     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-13     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-14     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-15     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-16     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-17     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-18     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
-
-#------------------------------------------------------------------------------
-# gringotts:  file(1) magic for Gringotts
-# http://devel.pluto.linux.it/projects/Gringotts/
-# author: Germano Rizzo <mano@pluto.linux.it>
-#GRG3????Y
-0      string  GRG             Gringotts data file
-#file format 1
->3     string          1               v.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9
-#file format 2
->3     string          2               v.2, MCRYPT S2K, 
->>8    byte&0x70       0x00            RIJNDAEL-128 crypt,
->>8    byte&0x70       0x10            SERPENT crypt,
->>8    byte&0x70       0x20            TWOFISH crypt, 
->>8    byte&0x70       0x30            CAST-256 crypt,
->>8    byte&0x70       0x40            SAFER+ crypt,
->>8    byte&0x70       0x50            LOKI97 crypt,
->>8    byte&0x70       0x60            3DES crypt,
->>8    byte&0x70       0x70            RIJNDAEL-256 crypt,
->>8    byte&0x08       0x00            SHA1 hash,
->>8    byte&0x08       0x08            RIPEMD-160 hash,
->>8    byte&0x04       0x00            ZLib
->>8    byte&0x04       0x04            BZip2
->>8    byte&0x03       0x00            lvl.0
->>8    byte&0x03       0x01            lvl.3
->>8    byte&0x03       0x02            lvl.6
->>8    byte&0x03       0x03            lvl.9
-#file format 3
->3     string          3               v.3, OpenPGP S2K, 
->>8    byte&0x70       0x00            RIJNDAEL-128 crypt,
->>8    byte&0x70       0x10            SERPENT crypt,
->>8    byte&0x70       0x20            TWOFISH crypt, 
->>8    byte&0x70       0x30            CAST-256 crypt,
->>8    byte&0x70       0x40            SAFER+ crypt,
->>8    byte&0x70       0x50            LOKI97 crypt,
->>8    byte&0x70       0x60            3DES crypt,
->>8    byte&0x70       0x70            RIJNDAEL-256 crypt,
->>8    byte&0x08       0x00            SHA1 hash,
->>8    byte&0x08       0x08            RIPEMD-160 hash,
->>8    byte&0x04       0x00            ZLib
->>8    byte&0x04       0x04            BZip2
->>8    byte&0x03       0x00            lvl.0
->>8    byte&0x03       0x01            lvl.3
->>8    byte&0x03       0x02            lvl.6
->>8    byte&0x03       0x03            lvl.9
-#file format >3
->3     string          >3              v.%.1s (unknown details)
-
-#------------------------------------------------------------------------------
-# pbm:  file(1) magic for Portable Bitmap files
-#
-# XXX - byte order?
-#
-0      short   0x2a17  "compact bitmap" format (Poskanzer)
-
-#------------------------------------------------------------------------------
-# plus5:  file(1) magic for Plus Five's UNIX MUMPS
-#
-# XXX - byte order?  Paging Hokey....
-#
-0      short           0x259           mumps avl global
->2     byte            >0              (V%d)
->6     byte            >0              with %d byte name
->7     byte            >0              and %d byte data cells
-0      short           0x25a           mumps blt global
->2     byte            >0              (V%d)
->8     short           >0              - %d byte blocks
->15    byte            0x00            - P/D format
->15    byte            0x01            - P/K/D format
->15    byte            0x02            - K/D format
->15    byte            >0x02           - Bad Flags
-
-#------------------------------------------------------------------------------
-# vms:  file(1) magic for VMS executables (experimental)
-#
-# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt@uchicago.edu)
-
-# GRR 950122:  I'm just guessing on these, based on inspection of the headers
-# of three executables each for Alpha and VAX architectures.  The VAX files
-# all had headers similar to this:
-#
-#   00000  b0 00 30 00 44 00 60 00  00 00 00 00 30 32 30 35  ..0.D.`.....0205
-#   00010  01 01 00 00 ff ff ff ff  ff ff ff ff 00 00 00 00  ................
-#
-0      string  \xb0\0\x30\0    VMS VAX executable
->44032 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
-#
-# The AXP files all looked like this, except that the byte at offset 0x22
-# was 06 in some of them and 07 in others:
-#
-#   00000  03 00 00 00 00 00 00 00  ec 02 00 00 10 01 00 00  ................
-#   00010  68 00 00 00 98 00 00 00  b8 00 00 00 00 00 00 00  h...............
-#   00020  00 00 07 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
-#   00030  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  ................
-#   00040  00 00 00 00 ff ff ff ff  ff ff ff ff 02 00 00 00  ................
-#
-0      belong  0x03000000      VMS Alpha executable
->75264 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
-
-#------------------------------------------------------------------------------
-# python:  file(1) magic for python
-#
-# From: David Necas <yeti@physics.muni.cz>
-# often the module starts with a multiline string
-0      string          """     a python script text executable
-# MAGIC as specified in Python/import.c (1.5 to 2.3.0a)
-# 20121  ( YEAR - 1995 ) + MONTH  + DAY (little endian followed by "\r\n"
-0      belong          0x994e0d0a      python 1.5/1.6 byte-compiled
-0      belong          0x87c60d0a      python 2.0 byte-compiled
-0      belong          0x2aeb0d0a      python 2.1 byte-compiled
-0      belong          0x2ded0d0a      python 2.2 byte-compiled
-0      belong          0x3bf20d0a      python 2.3 byte-compiled
-
-#------------------------------------------------------------------------------
-# chord: file(1) magic for Chord music sheet typesetting utility input files
-#
-# From Philippe De Muyter <phdm@macqel.be>
-# File format is actually free, but many distributed files begin with `{title'
-#
-0      string          {title          Chord text file
-
-
-# ----------------------------------------------------------------------------
-# ctags:  file (1) magic for Exuberant Ctags files
-# From: Alexander Mai <mai@migdal.ikp.physik.tu-darmstadt.de>
-0       string  !_TAG   Exuberant Ctags tag file text
-
-#------------------------------------------------------------------------------
-# human68k:  file(1) magic for Human68k (X680x0 DOS) binary formats
-# Magic too short!
-#0             string  HU              Human68k
-#>68           string  LZX             LZX compressed
-#>>72          string  >\0             (version %s)
-#>(8.L+74)     string  LZX             LZX compressed
-#>>(8.L+78)    string  >\0             (version %s)
-#>60           belong  >0              binded
-#>(8.L+66)     string  #HUPAIR         hupair
-#>0            string  HU              X executable
-#>(8.L+74)     string  #LIBCV1         - linked PD LIBC ver 1
-#>4            belong  >0              - base address 0x%x
-#>28           belong  >0              not stripped
-#>32           belong  >0              with debug information
-#0             beshort 0x601a          Human68k Z executable
-#0             beshort 0x6000          Human68k object file
-#0             belong  0xd1000000      Human68k ar binary archive
-#0             belong  0xd1010000      Human68k ar ascii archive
-#0             beshort 0x0068          Human68k lib archive
-#4             string  LZX             Human68k LZX compressed
-#>8            string  >\0             (version %s)
-#>4            string  LZX             R executable
-#2             string  #HUPAIR         Human68k hupair R executable
-
-#------------------------------------------------------------------------------
-# pdp:  file(1) magic for PDP-11 executable/object and APL workspace
-#
-0      lelong          0101555         PDP-11 single precision APL workspace
-0      lelong          0101554         PDP-11 double precision APL workspace
-#
-# PDP-11 a.out
-#
-0      leshort         0407            PDP-11 executable
->8     leshort         >0              not stripped
->15    byte            >0              - version %ld
-
-0      leshort         0401            PDP-11 UNIX/RT ldp
-0      leshort         0405            PDP-11 old overlay
-
-0      leshort         0410            PDP-11 pure executable
->8     leshort         >0              not stripped
->15    byte            >0              - version %ld
-
-0      leshort         0411            PDP-11 separate I&D executable
->8     leshort         >0              not stripped
->15    byte            >0              - version %ld
-
-0      leshort         0437            PDP-11 kernel overlay
-
-# These last three are derived from 2.11BSD file(1)
-0      leshort         0413            PDP-11 demand-paged pure executable
->8     leshort         >0              not stripped
-
-0      leshort         0430            PDP-11 overlaid pure executable
->8     leshort         >0              not stripped
-
-0      leshort         0431            PDP-11 overlaid separate executable
->8     leshort         >0              not stripped
-
-#------------------------------------------------------------------------
-# file(1) magic for sharc files
-#
-# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by 
-# FutureGroove Music (dsp@futuregroove.de)
-
-#------------------------------------------------------------------------
-0      string                  Draw            RiscOS Drawfile
-0      string                  PACK            RiscOS PackdDir archive
-
-#------------------------------------------------------------------------
-# SHARC DSP stuff (based on the FGM SHARC DSP SDK)
-
-0      string                  !               Assembler source
-0      string                  Analog          ADi asm listing file
-0      string                  .SYSTEM         SHARC architecture file
-0      string                  .system         SHARC architecture file
-
-0      leshort                 0x521C          SHARC COFF binary
->2     leshort                 >1              , %hd sections
->>12   lelong                  >0              , not stripped
-
-#------------------------------------------------------------------------------
-# pulsar:  file(1) magic for Pulsar POP3 daemon binary files
-#
-# http://pulsar.sourceforge.net
-# mailto:rok.papez@lugos.si
-#
-
-0      belong  0x1ee7f11e      Pulsar POP3 daemon mailbox cache file.
->4     ubelong x               Version: %d.
->8     ubelong x               \b%d
-
-
-#------------------------------------------------------------------------------
-# apl:  file(1) magic for APL (see also "pdp" and "vax" for other APL
-#       workspaces)
-#
-0      long            0100554         APL workspace (Ken's original?)
-
-#----------------------------------------------------------------------------
-# communication
-
-# TTCN is the Tree and Tabular Combined Notation described in ISO 9646-3.
-# It is used for conformance testing of communication protocols.
-# Added by W. Borgert <debacle@debian.org>.
-0      string          $Suite                  TTCN Abstract Test Suite
->&1    string          $SuiteId
->>&1   string          >\n                     %s
->&2    string          $SuiteId
->>&1   string          >\n                     %s
->&3    string          $SuiteId
->>&1   string          >\n                     %s
-
-# MSC (message sequence charts) are a formal description technique,
-# described in ITU-T Z.120, mainly used for communication protocols.
-# Added by W. Borgert <debacle@debian.org>.
-0      string          mscdocument     Message Sequence Chart (document)
-0      string          msc             Message Sequence Chart (chart)
-0      string          submsc          Message Sequence Chart (subchart)
-
-#------------------------------------------------------------------------------
-# ncr:  file(1) magic for NCR Tower objects
-#
-# contributed by
-# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne@ford-vax.arpa
-# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne@fmsrl7.UUCP
-#
-0      beshort         000610  Tower/XP rel 2 object
->12       belong               >0      not stripped
->20       beshort              0407    executable
->20       beshort              0410    pure executable
->22       beshort              >0      - version %ld
-0      beshort         000615  Tower/XP rel 2 object
->12       belong               >0      not stripped
->20       beshort              0407    executable
->20       beshort              0410    pure executable
->22       beshort              >0      - version %ld
-0      beshort         000620  Tower/XP rel 3 object
->12       belong               >0      not stripped
->20       beshort              0407    executable
->20       beshort              0410    pure executable
->22       beshort              >0      - version %ld
-0      beshort         000625  Tower/XP rel 3 object
->12       belong               >0      not stripped
->20       beshort              0407    executable
->20       beshort              0410    pure executable
->22       beshort              >0      - version %ld
-0      beshort         000630  Tower32/600/400 68020 object
->12       belong               >0      not stripped
->20       beshort              0407    executable
->20       beshort              0410    pure executable
->22       beshort              >0      - version %ld
-0      beshort         000640  Tower32/800 68020
->18       beshort              &020000 w/68881 object
->18       beshort              &040000 compatible object
->18       beshort              &~060000        object
->20       beshort              0407    executable
->20       beshort              0413    pure executable
->12       belong               >0      not stripped
->22       beshort              >0      - version %ld
-0      beshort         000645  Tower32/800 68010
->18       beshort              &040000 compatible object
->18       beshort              &~060000 object
->20       beshort              0407    executable
->20       beshort              0413    pure executable
->12       belong               >0      not stripped
->22       beshort              >0      - version %ld
-#------------------------------------------------------------------------------
-# alpha architecture description
-#
-
-0      leshort         0603            COFF format alpha
->22    leshort&030000  !020000         executable
->24    leshort         0410            pure
->24    leshort         0413            paged
->22    leshort&020000  !0              dynamically linked
->16    lelong          !0              not stripped
->16    lelong          0               stripped
->22    leshort&030000  020000          shared library
->24    leshort         0407            object
->27    byte            x               - version %d
->26    byte            x               \b.%d
->28    byte            x               \b-%d
-
-# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike@opac.bl.uk>
-#
-# The actual magic number is just "Core", followed by a 2-byte version
-# number; however, treating any file that begins with "Core" as a Digital
-# UNIX core dump file may produce too many false hits, so we include one
-# byte of the version number as well; DU 5.0 appears only to be up to
-# version 2.
-#
-0      string          Core\001        Alpha COFF format core dump (Digital UNIX)
->24    string          >\0             \b, from '%s'
-0      string          Core\002        Alpha COFF format core dump (Digital UNIX)
->24    string          >\0             \b, from '%s'
-
-
-#------------------------------------------------------------------------------
-# asterix:  file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character
-# strings as "long" - we assume they're just strings:
-# From: guy@netapp.com (Guy Harris)
-#
-0      string          *STA            Aster*x
->7     string          WORD                    Words Document
->7     string          GRAP                    Graphic
->7     string          SPRE                    Spreadsheet
->7     string          MACR                    Macro
-0      string          2278            Aster*x Version 2
->29    byte            0x36                    Words Document
->29    byte            0x35                    Graphic
->29    byte            0x32                    Spreadsheet
->29    byte            0x38                    Macro
-
-#------------------------------------------------------------------------------
-# blender: file(1) magic for Blender 3D data files
-#
-# Coded by Guillermo S. Romero <gsromero@alumnos.euitt.upm.es> using the
-# data from Ton Roosendaal <ton@blender.nl>. Ton or his company do not
-# support the rule, so mail GSR if problems with it. Rule version: 1.1.
-# You can get latest version with comments and details about the format
-# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender
-
-0      string  =BLENDER        Blender3D,
->7     string  =_              saved as 32-bits
->7      string =-              saved as 64-bits
->8     string  =v              little endian
->8     string  =V              big endian
->9     byte    x               with version %c.
->10    byte    x               \b%c
->11    byte    x               \b%c
-
-#------------------------------------------------------------------------------
-# sendmail:  file(1) magic for sendmail config files
-#
-# XXX - byte order?
-#
-0      byte    046       Sendmail frozen configuration 
->16    string  >\0       - version %s
-0      short   0x271c    Sendmail frozen configuration
->16    string  >\0       - version %s
-
-#------------------------------------------------------------------------------
-# sendmail:  file(1) magic for sendmail m4(1) files
-#
-# From Hendrik Scholz <hendrik@scholz.net>
-# i.e. files in /usr/share/sendmail/cf/
-#
-0   string  divert(-1)\n    sendmail m4 text file
-
-
-#------------------------------------------------------------------------------
-# alliant:  file(1) magic for Alliant FX series a.out files
-#
-# If the FX series is the one that had a processor with a 68K-derived
-# instruction set, the "short" should probably become "beshort" and the
-# "long" should probably become "belong".
-# If it's the i860-based one, they should probably become either the
-# big-endian or little-endian versions, depending on the mode they ran
-# the 860 in....
-#
-0      short           0420            0420 Alliant virtual executable
->2     short           &0x0020         common library
->16    long            >0              not stripped
-0      short           0421            0421 Alliant compact executable
->2     short           &0x0020         common library
->16    long            >0              not stripped
-
-#------------------------------------------------------------------------------
-# CDDB: file(1) magic for CDDB(tm) format CD text data files
-#
-# From <steve@gracenote.com>
-#
-# This is the /etc/magic entry to decode datafiles as used by
-# CDDB-enabled CD player applications.
-#
-
-0       string/b        #\040xmcd               CDDB(tm) format CD text data
-
-#------------------------------------------------------------------------------
-# elf:  file(1) magic for ELF executables
-#
-# We have to check the byte order flag to see what byte order all the
-# other stuff in the header is in.
-#
-# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
-#
-# updated by Daniel Quinlan (quinlan@yggdrasil.com)
-0      string          \177ELF         ELF
->4     byte            0               invalid class
->4     byte            1               32-bit
-# only for MIPS - in the future, the ABI field of e_flags should be used.
->>18   leshort         8
->>>36  lelong          &0x20           N32
->>18   leshort         10
->>>36  lelong          &0x20           N32
->>18   beshort         8
->>>36  belong          &0x20           N32
->>18   beshort         10
->>>36  belong          &0x20           N32
->4     byte            2               64-bit
->5     byte            0               invalid byte order
->5     byte            1               LSB
-# The official e_machine number for MIPS is now #8, regardless of endianness.
-# The second number (#10) will be deprecated later. For now, we still
-# say something if #10 is encountered, but only gory details for #8.
->>18    leshort                8
-# only for 32-bit
->>>4   byte            1
->>>>36  lelong&0xf0000000      0x00000000      MIPS-I
->>>>36  lelong&0xf0000000      0x10000000      MIPS-II
->>>>36  lelong&0xf0000000      0x20000000      MIPS-III
->>>>36  lelong&0xf0000000      0x30000000      MIPS-IV
->>>>36  lelong&0xf0000000      0x40000000      MIPS-V
->>>>36  lelong&0xf0000000      0x60000000      MIPS32
->>>>36  lelong&0xf0000000      0x70000000      MIPS64
->>>>36  lelong&0xf0000000      0x80000000      MIPS32 rel2
->>>>36  lelong&0xf0000000      0x90000000      MIPS64 rel2
-# only for 64-bit
->>>4   byte            2
->>>>48  lelong&0xf0000000      0x00000000      MIPS-I
->>>>48  lelong&0xf0000000      0x10000000      MIPS-II
->>>>48  lelong&0xf0000000      0x20000000      MIPS-III
->>>>48  lelong&0xf0000000      0x30000000      MIPS-IV
->>>>48  lelong&0xf0000000      0x40000000      MIPS-V
->>>>48  lelong&0xf0000000      0x60000000      MIPS32
->>>>48  lelong&0xf0000000      0x70000000      MIPS64 
->>>>48  lelong&0xf0000000      0x80000000      MIPS32 rel2
->>>>48  lelong&0xf0000000      0x90000000      MIPS64 rel2
->>16   leshort         0               no file type,
->>16   leshort         1               relocatable,
->>16   leshort         2               executable,
->>16   leshort         3               shared object,
-# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
-# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
->>16   leshort         4               core file
-# Core file detection is not reliable.
-#>>>(0x38+0xcc) string >\0             of '%s'
-#>>>(0x38+0x10) lelong >0              (signal %d),
->>16   leshort         &0xff00         processor-specific,
->>18   leshort         0               no machine,
->>18   leshort         1               AT&T WE32100 - invalid byte order,
->>18   leshort         2               SPARC - invalid byte order,
->>18   leshort         3               Intel 80386,
->>18   leshort         4               Motorola
->>>36  lelong          &0x01000000     68000 - invalid byte order,
->>>36  lelong          &0x00810000     CPU32 - invalid byte order,
->>>36  lelong          0               68020 - invalid byte order,
->>18   leshort         5               Motorola 88000 - invalid byte order,
->>18   leshort         6               Intel 80486,
->>18   leshort         7               Intel 80860,
->>18   leshort         8               MIPS,
->>18   leshort         9               Amdahl - invalid byte order,
->>18   leshort         10              MIPS (deprecated),
->>18   leshort         11              RS6000 - invalid byte order,
->>18   leshort         15              PA-RISC - invalid byte order,
->>>50  leshort         0x0214          2.0
->>>48  leshort         &0x0008         (LP64),
->>18   leshort         16              nCUBE,
->>18   leshort         17              Fujitsu VPP500,
->>18   leshort         18              SPARC32PLUS,
->>18   leshort         20              PowerPC,
->>18   leshort         22              IBM S/390,
->>18   leshort         36              NEC V800,
->>18   leshort         37              Fujitsu FR20,
->>18   leshort         38              TRW RH-32,
->>18   leshort         39              Motorola RCE,
->>18   leshort         40              ARM,
->>18   leshort         41              Alpha,
->>18   leshort         0xa390          IBM S/390 (obsolete),
->>18   leshort         42              Hitachi SH,
->>18   leshort         43              SPARC V9 - invalid byte order,
->>18   leshort         44              Siemens Tricore Embedded Processor,
->>18   leshort         45              Argonaut RISC Core, Argonaut Technologies Inc.,
->>18   leshort         46              Hitachi H8/300,
->>18   leshort         47              Hitachi H8/300H,
->>18   leshort         48              Hitachi H8S,
->>18   leshort         49              Hitachi H8/500,
->>18   leshort         50              IA-64 (Intel 64 bit architecture)
->>18   leshort         51              Stanford MIPS-X,
->>18   leshort         52              Motorola Coldfire,
->>18   leshort         53              Motorola M68HC12,
->>18   leshort         62              AMD x86-64,
->>18   leshort         75              Digital VAX,
->>18   leshort         88              Renesas M32R,
->>18   leshort         97              NatSemi 32k,
->>18   leshort         0x9026          Alpha (unofficial),
->>20   lelong          0               invalid version
->>20   lelong          1               version 1
->>36   lelong          1               MathCoPro/FPU/MAU Required
->5     byte            2               MSB
-# only for MIPS - see comment in little-endian section above.
->>18    beshort                8
-# only for 32-bit
->>>4   byte            1
->>>>36  belong&0xf0000000      0x00000000      MIPS-I
->>>>36  belong&0xf0000000      0x10000000      MIPS-II
->>>>36  belong&0xf0000000      0x20000000      MIPS-III
->>>>36  belong&0xf0000000      0x30000000      MIPS-IV
->>>>36  belong&0xf0000000      0x40000000      MIPS-V
->>>>36  belong&0xf0000000      0x60000000      MIPS32
->>>>36  belong&0xf0000000      0x70000000      MIPS64
->>>>36  belong&0xf0000000      0x80000000      MIPS32 rel2
->>>>36  belong&0xf0000000      0x90000000      MIPS64 rel2
-# only for 64-bit
->>>4   byte            2
->>>>48 belong&0xf0000000       0x00000000      MIPS-I
->>>>48 belong&0xf0000000       0x10000000      MIPS-II
->>>>48 belong&0xf0000000       0x20000000      MIPS-III
->>>>48 belong&0xf0000000       0x30000000      MIPS-IV
->>>>48 belong&0xf0000000       0x40000000      MIPS-V
->>>>48 belong&0xf0000000       0x60000000      MIPS32
->>>>48 belong&0xf0000000       0x70000000      MIPS64 
->>>>48 belong&0xf0000000       0x80000000      MIPS32 rel2
->>>>48 belong&0xf0000000       0x90000000      MIPS64 rel2
->>16   beshort         0               no file type,
->>16   beshort         1               relocatable,
->>16   beshort         2               executable,
->>16   beshort         3               shared object,
->>16   beshort         4               core file,
-#>>>(0x38+0xcc) string >\0             of '%s'
-#>>>(0x38+0x10) belong >0              (signal %d),
->>16   beshort         &0xff00         processor-specific,
->>18   beshort         0               no machine,
->>18   beshort         1               AT&T WE32100,
->>18   beshort         2               SPARC,
->>18   beshort         3               Intel 80386 - invalid byte order,
->>18   beshort         4               Motorola
->>>36  belong          &0x01000000     68000,
->>>36  belong          &0x00810000     CPU32,
->>>36  belong          0               68020,
->>18   beshort         5               Motorola 88000,
->>18   beshort         6               Intel 80486 - invalid byte order,
->>18   beshort         7               Intel 80860,
->>18   beshort         8               MIPS,
->>18   beshort         9               Amdahl,
->>18   beshort         10              MIPS (deprecated),
->>18   beshort         11              RS6000,
->>18   beshort         15              PA-RISC
->>>50  beshort         0x0214          2.0
->>>48  beshort         &0x0008         (LP64)
->>18   beshort         16              nCUBE,
->>18   beshort         17              Fujitsu VPP500,
->>18   beshort         18              SPARC32PLUS,
->>>36  belong&0xffff00 &0x000100       V8+ Required,
->>>36  belong&0xffff00 &0x000200       Sun UltraSPARC1 Extensions Required,
->>>36  belong&0xffff00 &0x000400       HaL R1 Extensions Required,
->>>36  belong&0xffff00 &0x000800       Sun UltraSPARC3 Extensions Required,
->>18   beshort         20              PowerPC or cisco 4500,
->>18   beshort         21              cisco 7500,
->>18   beshort         22              IBM S/390,
->>18   beshort         24              cisco SVIP,
->>18   beshort         25              cisco 7200,
->>18   beshort         36              NEC V800 or cisco 12000,
->>18   beshort         37              Fujitsu FR20,
->>18   beshort         38              TRW RH-32,
->>18   beshort         39              Motorola RCE,
->>18   beshort         40              ARM,
->>18   beshort         41              Alpha,
->>18   beshort         42              Hitachi SH,
->>18   beshort         43              SPARC V9,
->>18   beshort         44              Siemens Tricore Embedded Processor,
->>18   beshort         45              Argonaut RISC Core, Argonaut Technologies Inc.,
->>18   beshort         46              Hitachi H8/300,
->>18   beshort         47              Hitachi H8/300H,
->>18   beshort         48              Hitachi H8S,
->>18   beshort         49              Hitachi H8/500,
->>18   beshort         50              Intel Merced Processor,
->>18   beshort         51              Stanford MIPS-X,
->>18   beshort         52              Motorola Coldfire,
->>18   beshort         53              Motorola M68HC12,
->>18   beshort         73              Cray NV1,
->>18   beshort         75              Digital VAX,
->>18   beshort         88              Renesas M32R,
->>18   beshort         97              NatSemi 32k,
->>18   beshort         0x9026          Alpha (unofficial),
->>18   beshort         0xa390          IBM S/390 (obsolete),
->>20   belong          0               invalid version
->>20   belong          1               version 1
->>36   belong          1               MathCoPro/FPU/MAU Required
-# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
-# like proper ELF, but extracting the string had bad results.
->4      byte            <0x80
->>8    string          >\0             (%s)
->8     string          \0
->>7    byte            0               (SYSV)
->>7    byte            1               (HP-UX)
->>7    byte            2               (NetBSD)
->>7    byte            3               (GNU/Linux)
->>7    byte            4               (GNU/Hurd)
->>7    byte            5               (86Open)
->>7    byte            6               (Solaris)
->>7    byte            7               (Monterey)
->>7    byte            8               (IRIX)
->>7    byte            9               (FreeBSD)
->>7    byte            10              (Tru64)
->>7    byte            11              (Novell Modesto)
->>7    byte            12              (OpenBSD)
->>7    byte            97              (ARM)
->>7    byte            255             (embedded)
-
-#------------------------------------------------------------------------------
-# Epoc 32 : file(1) magic for Epoc Documents [psion/osaris
-# Stefan Praszalowicz (hpicollo@worldnet.fr)
-#0     lelong          0x10000037      Epoc32
->4     lelong          0x1000006D
->>8    lelong          0x1000007F      Word
->>8    lelong          0x10000088      Sheet
->>8    lelong          0x1000007D      Sketch
->>8    lelong          0x10000085      TextEd
-
-#------------------------------------------------------------------------------
-# ispell:  file(1) magic for ispell
-#
-# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602.  This magic
-# will match 0x9600 through 0x9603 in *both* little endian and big endian.
-# (No other current magic entries collide.)
-#
-# Updated by Daniel Quinlan (quinlan@yggdrasil.com)
-#
-0      leshort&0xFFFC  0x9600          little endian ispell
->0     byte            0               hash file (?),
->0     byte            1               3.0 hash file,
->0     byte            2               3.1 hash file,
->0     byte            3               hash file (?),
->2     leshort         0x00            8-bit, no capitalization, 26 flags
->2     leshort         0x01            7-bit, no capitalization, 26 flags
->2     leshort         0x02            8-bit, capitalization, 26 flags
->2     leshort         0x03            7-bit, capitalization, 26 flags
->2     leshort         0x04            8-bit, no capitalization, 52 flags
->2     leshort         0x05            7-bit, no capitalization, 52 flags
->2     leshort         0x06            8-bit, capitalization, 52 flags
->2     leshort         0x07            7-bit, capitalization, 52 flags
->2     leshort         0x08            8-bit, no capitalization, 128 flags
->2     leshort         0x09            7-bit, no capitalization, 128 flags
->2     leshort         0x0A            8-bit, capitalization, 128 flags
->2     leshort         0x0B            7-bit, capitalization, 128 flags
->2     leshort         0x0C            8-bit, no capitalization, 256 flags
->2     leshort         0x0D            7-bit, no capitalization, 256 flags
->2     leshort         0x0E            8-bit, capitalization, 256 flags
->2     leshort         0x0F            7-bit, capitalization, 256 flags
->4     leshort         >0              and %d string characters
-0      beshort&0xFFFC  0x9600          big endian ispell
->1     byte            0               hash file (?),
->1     byte            1               3.0 hash file,
->1     byte            2               3.1 hash file,
->1     byte            3               hash file (?),
->2     beshort         0x00            8-bit, no capitalization, 26 flags
->2     beshort         0x01            7-bit, no capitalization, 26 flags
->2     beshort         0x02            8-bit, capitalization, 26 flags
->2     beshort         0x03            7-bit, capitalization, 26 flags
->2     beshort         0x04            8-bit, no capitalization, 52 flags
->2     beshort         0x05            7-bit, no capitalization, 52 flags
->2     beshort         0x06            8-bit, capitalization, 52 flags
->2     beshort         0x07            7-bit, capitalization, 52 flags
->2     beshort         0x08            8-bit, no capitalization, 128 flags
->2     beshort         0x09            7-bit, no capitalization, 128 flags
->2     beshort         0x0A            8-bit, capitalization, 128 flags
->2     beshort         0x0B            7-bit, capitalization, 128 flags
->2     beshort         0x0C            8-bit, no capitalization, 256 flags
->2     beshort         0x0D            7-bit, no capitalization, 256 flags
->2     beshort         0x0E            8-bit, capitalization, 256 flags
->2     beshort         0x0F            7-bit, capitalization, 256 flags
->4     beshort         >0              and %d string characters
-# ispell 4.0 hash files  kromJx <kromJx@crosswinds.net>
-# Ispell 4.0
-0       string          ISPL            ispell
->4      long            x               hash file version %d,
->8      long            x               lexletters %d,
->12     long            x               lexsize %d,
->16     long            x               hashsize %d,
->20     long            x               stblsize %d
-
-#------------------------------------------------------------------------------
-# lex:  file(1) magic for lex
-#
-#      derived empirically, your offsets may vary!
-53     string          yyprevious      C program text (from lex)
->3     string          >\0              for %s
-# C program text from GNU flex, from Daniel Quinlan <quinlan@yggdrasil.com>
-21     string          generated\ by\ flex     C program text (from flex)
-# lex description file, from Daniel Quinlan <quinlan@yggdrasil.com>
-0      string          %{              lex description text
-
-#------------------------------------------------------------------------------
-# mips:  file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)
-#                         Dec Ultrix (MIPS)
-# all of SGI's *current* machines and OSes run in big-endian mode on the
-# MIPS machines, as far as I know.
-#
-# XXX - what is the blank "-" line?
-#
-# kbd file definitions
-0      string  kbd!map         kbd map file
->8     byte    >0              Ver %d:
->10    short   >0              with %d table(s)
-0      belong  0407            old SGI 68020 executable
-0      belong  0410            old SGI 68020 pure executable
-0      beshort 0x8765          disk quotas file
-0      beshort 0x0506          IRIS Showcase file
->2     byte    0x49            -
->3     byte    x               - version %ld
-0      beshort 0x0226          IRIS Showcase template
->2     byte    0x63            -
->3     byte    x               - version %ld
-0      belong  0x5343464d      IRIS Showcase file
->4     byte    x               - version %ld
-0      belong  0x5443464d      IRIS Showcase template
->4     byte    x               - version %ld
-0      belong  0xdeadbabe      IRIX Parallel Arena
->8     belong  >0              - version %ld
-#
-0      beshort 0x0160          MIPSEB ECOFF executable
->20    beshort 0407            (impure)
->20    beshort 0410            (swapped)
->20    beshort 0413            (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->22    byte    x               - version %ld
->23    byte    x               \b.%ld
-#
-0      beshort 0x0162          MIPSEL-BE ECOFF executable
->20    beshort 0407            (impure)
->20    beshort 0410            (swapped)
->20    beshort 0413            (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %d
->22    byte    x               \b.%ld
-#
-0      beshort 0x6001          MIPSEB-LE ECOFF executable
->20    beshort 03401           (impure)
->20    beshort 04001           (swapped)
->20    beshort 05401           (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %d
->22    byte    x               \b.%ld
-#
-0      beshort 0x6201          MIPSEL ECOFF executable
->20    beshort 03401           (impure)
->20    beshort 04001           (swapped)
->20    beshort 05401           (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %ld
->22    byte    x               \b.%ld
-#
-# MIPS 2 additions
-#
-0      beshort 0x0163          MIPSEB MIPS-II ECOFF executable
->20    beshort 0407            (impure)
->20    beshort 0410            (swapped)
->20    beshort 0413            (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->22    byte    x               - version %ld
->23    byte    x               \b.%ld
-#
-0      beshort 0x0166          MIPSEL-BE MIPS-II ECOFF executable
->20    beshort 0407            (impure)
->20    beshort 0410            (swapped)
->20    beshort 0413            (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->22    byte    x               - version %ld
->23    byte    x               \b.%ld
-#
-0      beshort 0x6301          MIPSEB-LE MIPS-II ECOFF executable
->20    beshort 03401           (impure)
->20    beshort 04001           (swapped)
->20    beshort 05401           (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %ld
->22    byte    x               \b.%ld
-#
-0      beshort 0x6601          MIPSEL MIPS-II ECOFF executable
->20    beshort 03401           (impure)
->20    beshort 04001           (swapped)
->20    beshort 05401           (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %ld
->22    byte    x               \b.%ld
-#
-# MIPS 3 additions
-#
-0      beshort 0x0140          MIPSEB MIPS-III ECOFF executable
->20    beshort 0407            (impure)
->20    beshort 0410            (swapped)
->20    beshort 0413            (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->22    byte    x               - version %ld
->23    byte    x               \b.%ld
-#
-0      beshort 0x0142          MIPSEL-BE MIPS-III ECOFF executable
->20    beshort 0407            (impure)
->20    beshort 0410            (swapped)
->20    beshort 0413            (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->22    byte    x               - version %ld
->23    byte    x               \b.%ld
-#
-0      beshort 0x4001          MIPSEB-LE MIPS-III ECOFF executable
->20    beshort 03401           (impure)
->20    beshort 04001           (swapped)
->20    beshort 05401           (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %ld
->22    byte    x               \b.%ld
-#
-0      beshort 0x4201          MIPSEL MIPS-III ECOFF executable
->20    beshort 03401           (impure)
->20    beshort 04001           (swapped)
->20    beshort 05401           (paged)
->8     belong  >0              not stripped
->8     belong  0               stripped
->23    byte    x               - version %ld
->22    byte    x               \b.%ld
-#
-0      beshort 0x180           MIPSEB Ucode
-0      beshort 0x182           MIPSEL-BE Ucode
-# 32bit core file
-0      belong  0xdeadadb0      IRIX core dump
->4     belong  1               of
->16    string  >\0             '%s'
-# 64bit core file
-0      belong  0xdeadad40      IRIX 64-bit core dump
->4     belong  1               of
->16    string  >\0             '%s'
-# N32bit core file
-0       belong 0xbabec0bb      IRIX N32 core dump
->4      belong 1               of
->16     string >\0             '%s'
-# New style crash dump file
-0      string  \x43\x72\x73\x68\x44\x75\x6d\x70        IRIX vmcore dump of
->36    string  >\0                                     '%s'
-# Trusted IRIX info
-0      string  SGIAUDIT        SGI Audit file
->8     byte    x               - version %d
->9     byte    x               \b.%ld
-#
-0      string  WNGZWZSC        Wingz compiled script
-0      string  WNGZWZSS        Wingz spreadsheet
-0      string  WNGZWZHP        Wingz help file
-#
-0      string  \#Inventor V    IRIS Inventor 1.0 file
-0      string  \#Inventor V2   Open Inventor 2.0 file
-# GLF is OpenGL stream encoding
-0      string  glfHeadMagic();         GLF_TEXT
-4      belong  0x7d000000              GLF_BINARY_LSB_FIRST
-4      belong  0x0000007d              GLF_BINARY_MSB_FIRST
-# GLS is OpenGL stream encoding; GLS is the successor of GLF
-0      string  glsBeginGLS(            GLS_TEXT
-4      belong  0x10000000              GLS_BINARY_LSB_FIRST
-4      belong  0x00000010              GLS_BINARY_MSB_FIRST
diff --git a/program/lib/rc_mail_mime.inc b/program/lib/rc_mail_mime.inc
deleted file mode 100644 (file)
index ca4d0bf..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/lib/rc_mime.inc                                               |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Extend PEAR:Mail_mime class and override encodeHeaders method       |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: sendmail.inc 506 2007-03-14 00:39:51Z thomasb $
-
-*/
-
-// require Mail_mime class 1.4.0
-require_once('Mail/mime.php');
-
-
-class rc_mail_mime extends Mail_mime
-{
-  /**
-   * Set build parameters
-   */
-  function setParam($param)
-  {
-    if (is_array($param))
-      $this->_build_params = array_merge($this->_build_params, $param);
-  }
-  
-  /**
-   * Adds an image to the list of embedded images.
-   *
-   * @param  string  $file       The image file name OR image data itself
-   * @param  string  $c_type     The content type
-   * @param  string  $name       The filename of the image.
-   *                             Only use if $file is the image data
-   * @param  bool    $isfilename Whether $file is a filename or not
-   *                             Defaults to true
-   * @param  string  $contentid  Desired Content-ID of MIME part
-   *                             Defaults to generated unique ID
-   * @return mixed   true on success or PEAR_Error object
-   * @access public
-   */
-  function addHTMLImage($file, $c_type='application/octet-stream', $name = '', $isfilename = true, $contentid = '')
-  {
-    $filedata = ($isfilename === true) ? $this->_file2str($file) : $file;
-    if ($isfilename === true)
-      $filename = ($name == '' ? $file : $name);
-    else
-      $filename = $name;
-
-    if (PEAR::isError($filedata))
-        return $filedata;
-
-    if ($contentid == '')
-       $contentid = md5(uniqid(time()));
-
-    $this->_html_images[] = array(
-      'body'   => $filedata,
-      'name'   => $filename,
-      'c_type' => $c_type,
-      'cid'    => $contentid
-    );
-
-    return true;
-  }
-  
-  
-  /**
-  * returns the HTML body portion of the message
-  * @return string HTML body of the message
-  * @access public
-  */
-  function getHTMLBody()
-  {
-     return $this->_htmlbody;
-  }
-  
-  
-  /**
-   * Creates a new mimePart object, using multipart/mixed as
-   * the initial content-type and returns it during the
-   * build process.
-   *
-   * @return object  The multipart/mixed mimePart object
-   * @access private
-   */
-  function &_addMixedPart()
-  {
-    $params['content_type'] = $this->_headers['Content-Type'] ? $this->_headers['Content-Type'] : 'multipart/mixed';
-    $ret = new Mail_mimePart('', $params);
-    return $ret;
-  }
-  
-  
-  /**
-   * Encodes a header as per RFC2047
-   *
-   * @param  array $input The header data to encode
-   * @param  array $params Extra build parameters
-   * @return array Encoded data
-   * @access private
-   * @override
-   */
-  function _encodeHeaders($input, $params = array())
-  {
-    $maxlen = 73;
-    $params += $this->_build_params;
-    
-    foreach ($input as $hdr_name => $hdr_value)
-    {
-      // if header contains e-mail addresses
-      if (preg_match('/\s<.+@[a-z0-9\-\.]+\.[a-z]+>/U', $hdr_value))
-        $chunks = $this->_explode_quoted_string(',', $hdr_value);
-      else
-        $chunks = array($hdr_value);
-
-      $hdr_value = '';
-      $line_len = 0;
-
-      foreach ($chunks as $i => $value)
-      {
-        $value = trim($value);
-
-        //This header contains non ASCII chars and should be encoded.
-        if (preg_match('#[\x80-\xFF]{1}#', $value))
-        {
-          $suffix = '';
-          // Don't encode e-mail address
-          if (preg_match('/(.+)\s(<.+@[a-z0-9\-\.]+>)$/Ui', $value, $matches))
-          {
-            $value = $matches[1];
-            $suffix = ' '.$matches[2];
-          }
-
-          switch ($params['head_encoding'])
-          {
-            case 'base64':
-            // Base64 encoding has been selected.
-            $mode = 'B';
-            $encoded = base64_encode($value);
-            break;
-
-            case 'quoted-printable':
-            default:
-            // quoted-printable encoding has been selected
-            $mode = 'Q';
-            $encoded = preg_replace('/([\x2C\x3F\x80-\xFF])/e', "'='.sprintf('%02X', ord('\\1'))", $value);
-            // replace spaces with _
-            $encoded = str_replace(' ', '_', $encoded);
-          }
-
-          $value = '=?' . $params['head_charset'] . '?' . $mode . '?' . $encoded . '?=' . $suffix;
-        }
-
-        // add chunk to output string by regarding the header maxlen
-        $len = strlen($value);
-        if ($i == 0 || $line_len + $len < $maxlen)
-        {
-          $hdr_value .= ($i>0?', ':'') . $value;
-          $line_len += $len + ($i>0?2:0);
-        }
-        else
-        {
-          $hdr_value .= ($i>0?', ':'') . "\n " . $value;
-          $line_len = $len;
-        }
-      }
-
-      $input[$hdr_name] = $hdr_value;
-    }
-
-    return $input;
-  }
-
-
-  function _explode_quoted_string($delimiter, $string)
-  {
-    $result = array();
-    $strlen = strlen($string);
-    for ($q=$p=$i=0; $i < $strlen; $i++)
-    {
-      if ($string{$i} == "\"" && $string{$i-1} != "\\")
-        $q = $q ? false : true;
-      else if (!$q && $string{$i} == $delimiter)
-      {
-        $result[] = substr($string, $p, $i - $p);
-        $p = $i + 1;
-      }
-    }
-    
-    $result[] = substr($string, $p);
-    return $result;
-  }
-
-}
-
-?>
\ No newline at end of file
diff --git a/program/lib/washtml.php b/program/lib/washtml.php
new file mode 100644 (file)
index 0000000..73a02c6
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+/*                Washtml, a HTML sanityzer.
+ *
+ * Copyright (c) 2007 Frederic Motte <fmotte@ubixis.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* Please send me your comments about this code if you have some, thanks, Fred. */
+
+/* OVERVIEW:
+ *
+ * Wahstml take an untrusted HTML and return a safe html string.
+ *
+ * SYNOPSIS:
+ *
+ * washtml::wash($html, $config, $full);
+ * It return a sanityzed string of the $html parameter without html and head tags.
+ * $html is a string containing the html code to wash.
+ * $config is an array containing options:
+ *   $config['allow_remote'] is a boolean to allow link to remote images.
+ *   $config['blocked_src'] string with image-src to be used for blocked remote images
+ *   $config['show_washed'] is a boolean to include washed out attributes as x-washed
+ *   $config['cid_map'] is an array where cid urls index urls to replace them.
+ *   $config['charset'] is a string containing the charset of the HTML document if it is not defined in it.
+ * $full is a reference to a boolean that is set to true if no remote images are removed. (FE: show remote images link)
+ *
+ * INTERNALS:
+ *
+ * Only tags and attributes in the globals $html_elements and $html_attributes
+ * are kept, inline styles are also filtered: all style identifiers matching
+ * /[a-z\-]/i are allowed. Values matching colors, sizes, /[a-z\-]/i and safe
+ * urls if allowed and cid urls if mapped are kept.
+ *
+ * BUGS: It MUST be safe !
+ *  - Check regexp
+ *  - urlencode URLs instead of htmlspecials
+ *  - Check is a 3 bytes utf8 first char can eat '">'
+ *  - Update PCRE: CVE-2007-1659 - CVE-2007-1660 - CVE-2007-1661 - CVE-2007-1662 
+ *                 CVE-2007-4766 - CVE-2007-4767 - CVE-2007-4768  
+ *    http://lists.debian.org/debian-security-announce/debian-security-announce-2007/msg00177.html 
+ *  - ...
+ *
+ * MISSING:
+ *  - relative links, can be implemented by prefixing an absolute path, ask me
+ *    if you need it...
+ *  - ...
+ *
+ * Dont be a fool:
+ *  - Dont alter data on a GET: '<img src="http://yourhost/mail?action=delete&uid=3267" />'
+ *  - ...
+ */
+
+class washtml
+{
+
+  /* Allowed HTML elements */
+  static $html_elements = array('a', 'abbr', 'acronym', 'address', 'area', 'b', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', 'font', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'label', 'legend', 'li', 'map', 'menu', 'ol', 'p', 'pre', 'q', 's', 'samp', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'u', 'ul', 'var', 'img');
+
+  /* Allowed HTML attributes */
+  static $html_attribs = array('name', 'class', 'title', 'alt', 'width', 'height', 'align', 'nowrap', 'col', 'row', 'id', 'rowspan', 'colspan', 'cellspacing', 'cellpadding', 'valign', 'bgcolor', 'color', 'border', 'bordercolorlight', 'bordercolordark', 'face', 'marginwidth', 'marginheight', 'axis', 'border', 'abbr', 'char', 'charoff', 'clear', 'compact', 'coords', 'vspace', 'hspace', 'cellborder', 'size', 'lang', 'dir');
+
+  /* Check CSS style */
+  static function wash_style($style, $config, &$full) {
+    $s = '';
+
+    foreach(explode(';', $style) as $declaration) {
+      if(preg_match('/^\s*([a-z\-]+)\s*:\s*(.*)\s*$/i', $declaration, $match)) {
+        $cssid = $match[1];
+        $str = $match[2];
+        $value = '';
+        while(sizeof($str) > 0 &&
+          preg_match('/^(url\(\s*[\'"]?([^\'"\)]*)[\'"]?\s*\)'./*1,2*/
+                 '|rgb\(\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[0-9]+\s*\)'.
+                 '|-?[0-9.]+\s*(em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)?'.
+                 '|#[0-9a-f]{3,6}|[a-z0-9\-]+'.
+                 ')\s*/i', $str, $match)) {
+          if($match[2]) {
+            if(preg_match('/^(http|https|ftp):.*$/i', $match[2], $url)) {
+              if($config['allow_remote'])
+                $value .= ' url(\''.htmlspecialchars($url[0], ENT_QUOTES).'\')';
+              else
+                $full = false;
+            } else if(preg_match('/^cid:(.*)$/i', $match[2], $cid))
+              $value .= ' url(\''.htmlspecialchars($config['cid_map']['cid:'.$cid[1]], ENT_QUOTES) . '\')';
+          } else if($match[0] != 'url' && $match[0] != 'rbg')//whitelist ?
+            $value .= ' ' . $match[0];
+          $str = substr($str, strlen($match[0]));
+        }
+        if($value)
+          $s .= ($s?' ':'') . $cssid . ':' . $value . ';';
+      }
+    }
+    return $s;
+  }
+
+  /* Take a node and return allowed attributes and check values */
+  static function wash_attribs($node, $config, &$full) {
+    $t = '';
+    $washed;
+
+    foreach($node->attributes as $key => $plop) {
+      $key = strtolower($key);
+      $value = $node->getAttribute($key);
+      if((in_array($key, self::$html_attribs)) ||
+         ($key == 'href' && preg_match('/^(http|https|ftp|mailto):.*/i', $value)))
+        $t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"';
+      else if($key == 'style' && ($style = self::wash_style($value, $config, $full)))
+        $t .= ' style="' . $style . '"';
+      else if($key == 'src' && strtolower($node->tagName) == 'img') { //check tagName anyway
+        if(preg_match('/^(http|https|ftp):.*/i', $value)) {
+          if($config['allow_remote'])
+            $t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"';
+          else {
+            $full = false;
+            if ($config['blocked_src'])
+              $t .= ' src="' . htmlspecialchars($config['blocked_src'], ENT_QUOTES) . '"';
+          }
+        } else if(preg_match('/^cid:(.*)$/i', $value, $cid))
+          $t .= ' ' . $key . '="' . htmlspecialchars($config['cid_map']['cid:'.$cid[1]], ENT_QUOTES) . '"';
+      } else
+        $washed .= ($washed?' ':'') . $key;
+    }
+    return $t . ($washed && $config['show_washed']?' x-washed="'.$washed.'"':'');
+  }
+
+  /* The main loop that recurse on a node tree.
+   * It output only allowed tags with allowed attributes
+   * and allowed inline styles */
+  static function dumpHtml($node, $config, &$full) {
+    if(!$node->hasChildNodes())
+      return '';
+
+    $node = $node->firstChild;
+    $dump = '';
+
+    do {
+      switch($node->nodeType) {
+      case XML_ELEMENT_NODE: //Check element
+        $tagName = strtolower($node->tagName);
+        if(in_array($tagName, self::$html_elements)) {
+          $content = self::dumpHtml($node, $config, $full);
+          $dump .= '<' . $tagName . self::wash_attribs($node, $config, $full) .
+            ($content?">$content</$tagName>":' />');
+        } else if($tagName == 'html' || $tagName == 'body') {
+          $dump .= self::dumpHtml($node, $config, $full); //Just ignored
+        } else
+          $dump .= '<!-- ' . htmlspecialchars($tagName, ENT_QUOTES) . ' not allowed -->';
+        break;
+      case XML_TEXT_NODE:
+        $dump .= htmlspecialchars($node->nodeValue);
+        break;
+      case XML_HTML_DOCUMENT_NODE:
+        $dump .= self::dumpHtml($node, $config, $full);
+        break;
+      case XML_DOCUMENT_TYPE_NODE: break;
+      default:
+      }
+    } while($node = $node->nextSibling);
+
+    return $dump;
+  }
+
+  /* Main function, give it untrusted HTML, tell it if you allow loading
+   * remote images and give it a map to convert "cid:" urls. */
+  static function wash($html, $config=array(), &$full=true) {
+    $config += array('show_washed'=>true, 'allow_remote'=>false, 'cid_map'=>array());
+    //Charset seems to be ignored (probably if defined in the HTML document)
+    $node = new DOMDocument('1.0', $config['charset']);
+    $full = true;
+    @$node->loadHTML($html);
+    return self::dumpHtml($node, $config, $full);
+  }
+
+}
+
+?>
\ No newline at end of file
diff --git a/program/localization/am/labels.inc b/program/localization/am/labels.inc
deleted file mode 100644 (file)
index 04d4987..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/am/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Vahan Yerkanian <vahan@arminco.com>                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
-
-*/
-
-$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'] = 'Cc';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Reply-To';
-$labels['date'] = 'Ամսաթիվ';
-$labels['size'] = 'Չափ';
-$labels['priority'] = 'Առավելություն';
-$labels['organization'] = 'Կազմակերպություն';
-$labels['reply-to'] = '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['movemessagetotrash'] = 'Գցել աղբարկղը';
-$labels['printmessage'] = 'Տպել';
-$labels['previousmessage'] = 'Ցուցադրել նախորդ նամակը';
-$labels['previousmessages'] = 'Ցուցադրել նախորդ նամակները';
-$labels['firstmessage'] = 'Ցուցադրել առաջին նամակը';
-$labels['firstmessages'] = 'Ցուցադրել առաջին էջը';
-$labels['nextmessage'] = 'Ցուցադրել հաջորդ նամակը';
-$labels['nextmessages'] = 'Ցուցադրել հաջորդ նամակները';
-$labels['lastmessage'] = 'Ցուցադրել վերջին նամակը';
-$labels['lastmessages'] = 'Ցուցադրել վերջին էջը';
-$labels['backtolist'] = 'Վերադառնալ նամակների ցուցակ';
-$labels['viewsource'] = 'Ցուցադրել նամակի կոդը';
-$labels['markmessages'] = 'Նշել նամակները';
-$labels['markread'] = 'որպես կարդացած';
-$labels['markunread'] = 'որպես չկարդացած';
-$labels['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['savemessage'] = 'Հիշել որպես սևագիր';
-$labels['sendmessage'] = 'Ուղարկել';
-$labels['addattachment'] = 'Կցել ֆայլ';
-$labels['charset'] = 'Տառաշար';
-$labels['editortype'] = 'Խմբագրի տիպը';
-$labels['returnreceipt'] = 'Ստացման հավաստագիր';
-$labels['checkspelling'] = 'Ստուգել ուղագրությունը';
-$labels['resumeediting'] = 'Շարունակել խմբագրումը';
-$labels['revertto'] = 'Վերականգնել';
-$labels['attachments'] = 'Կցումներ';
-$labels['upload'] = 'Բեռնել';
-$labels['close'] = 'Փակել';
-$labels['low'] = 'Ցածր';
-$labels['lowest'] = 'Նվազագույն';
-$labels['normal'] = 'Նորմալ';
-$labels['high'] = 'Կարևոր';
-$labels['highest'] = 'Կարևորագույն';
-$labels['nosubject'] = '(առանց վերնագրի)';
-$labels['showimages'] = 'Ցուցադրել նկարները';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Պարզ տեքստ';
-$labels['addcc'] = 'Ավելացնել Cc';
-$labels['addbcc'] = 'Ավելացնել Bcc';
-$labels['addreplyto'] = 'Ավելացնել Reply-To';
-$labels['mdnrequest'] = 'Նամակի հեղինակը խնդրել է նամակը կարդալուն պես տեղեկացնել իրեն։ Ցանկանում էք Տեղեկացնե՞լ։';
-$labels['receiptread'] = 'Նամակի ընթերցման ծանուցագիր';
-$labels['yourmessage'] = 'Սա Ձեր նամակի ընթերցման ծանուցագիրն է';
-$labels['receiptnote'] = 'Նշում՝ Այս ծանուցագիրը ընդամենը տեղեկացնում է, որ նամակը ցուցադրվել է հասցեատիրոջ համակարչով։ Չկա որևիցե երաշխիք, որ հասցեատերը իսկապես կարդացել է նամակը։';
-$labels['name'] = 'Մականուն';
-$labels['firstname'] = 'Անուն';
-$labels['surname'] = 'Ազգանուն';
-$labels['email'] = 'Էկ–փոստ';
-$labels['addcontact'] = 'Գրանցել նշած հասցեն';
-$labels['editcontact'] = 'Խմբագրել հասցեն';
-$labels['edit'] = 'Խմբագրել';
-$labels['cancel'] = 'Թարգել';
-$labels['save'] = 'Հիշել';
-$labels['delete'] = 'Ջնջել';
-$labels['newcontact'] = 'Ստեղծել նոր հասցեքարտ';
-$labels['deletecontact'] = 'Ջնջել նշած նամակները';
-$labels['composeto'] = 'Գրել նամակ';
-$labels['contactsfromto'] = 'Հասցեներ $from–ից $to–ը եղած $count–ից';
-$labels['print'] = 'Տպել';
-$labels['export'] = 'Արտահանել';
-$labels['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['messagecount'] = 'Նամակներ';
-$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/am/messages.inc b/program/localization/am/messages.inc
deleted file mode 100644 (file)
index af16e8f..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/am/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Vahan Yerkanian <vahan@arminco.com>                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Մուտքը ձախողվեց';
-$messages['cookiesdisabled'] = 'Сookies–ների ապահովվումը բացակայում է';
-$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'] = 'Նամակը տեղափոխվում է…';
-$messages['receiptsent'] = 'Նամակի ընթերցման ծանուցագիրն ուղարկված է';
-$messages['errorsendingreceipt'] = 'Ծանուցագրի ուղարկումը ձախողվեց';
-$messages['nodeletelastidentity'] = 'Անհնար է ջնջել վերջին տարբերակը';
-$messages['addsubfolderhint'] = 'Այս դարակը կստեղծվի որպես նշվածի ենթադարակ';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ar/labels.inc b/program/localization/ar/labels.inc
deleted file mode 100644 (file)
index 984aca7..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ar/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Ossama Khayat <okhayat@yahoo.com>                             |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
-
-*/
-
-$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['movemessagetotrash'] = 'انقل الرسالة إلى سلة المهملات';
-$labels['printmessage'] = 'طباعة هذه الرسالة';
-$labels['previousmessage'] = 'عرض الرسالة السابقة';
-$labels['previousmessages'] = 'عرض المجموعة السابقة من الرسائل';
-$labels['firstmessage'] = 'عرض الرسالة الأولى';
-$labels['firstmessages'] = 'عرض مجموعة الرسائل الأولى';
-$labels['nextmessage'] = 'عرض الرسالة التالية';
-$labels['nextmessages'] = 'عرض المجموعة التالية من الرسائل';
-$labels['lastmessage'] = 'عرض الرسالة الأخيرة';
-$labels['lastmessages'] = 'عرض مجموعة الرسائل الأخيرة';
-$labels['backtolist'] = 'العودة إلى لائحة الرسائل';
-$labels['viewsource'] = 'إظهار المصدر';
-$labels['markmessages'] = 'وسم الرسالة';
-$labels['markread'] = 'كمقروءة';
-$labels['markunread'] = 'كغير مقروءة';
-$labels['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['savemessage'] = 'حفظ هذه المسودة';
-$labels['sendmessage'] = 'إرسال الرسالة الآن';
-$labels['addattachment'] = 'إرفاق ملف';
-$labels['charset'] = 'مجموعة المحارف';
-$labels['editortype'] = 'نوع المُحرّر';
-$labels['returnreceipt'] = 'ايصال استلام';
-$labels['checkspelling'] = 'التدقيق الإملائي';
-$labels['resumeediting'] = 'متابعة التحرير';
-$labels['revertto'] = 'استعادة إلى';
-$labels['attachments'] = 'مرفقات';
-$labels['upload'] = 'تحميل';
-$labels['close'] = 'إغلاق';
-$labels['low'] = 'منخض';
-$labels['lowest'] = 'الأقل';
-$labels['normal'] = 'عادي';
-$labels['high'] = 'مرتفع';
-$labels['highest'] = 'الأعلى';
-$labels['nosubject'] = '(دون موضوع)';
-$labels['showimages'] = 'إظهار الصور';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'نص مجرد';
-$labels['addcc'] = 'أضف CC';
-$labels['addbcc'] = 'أضف BCC';
-$labels['addreplyto'] = 'أضيف Reply-To';
-$labels['mdnrequest'] = 'طلب المرسل إعلامه عند قراءتك لرسالته. هل تود إعلام المرسل؟';
-$labels['receiptread'] = 'إيصال الاستلام )بالقراءة)';
-$labels['yourmessage'] = 'هذا إيصال بقراءة رسالتك';
-$labels['receiptnote'] = 'ملاحظة: يُعلمك هذا الإيصال بأن رسالتك قد ظهرت على جهاز المستقبِل. ليست هناك أية ضمانات أن المستقبل قد قرأ أو فهم محتويات الرسالة.';
-$labels['name'] = 'اسم العرض';
-$labels['firstname'] = 'الإسم الأول';
-$labels['surname'] = 'الإسم الأخير';
-$labels['email'] = 'البريد الإلكتروني';
-$labels['addcontact'] = 'إضافة المراسل المحدد إلى دفتر عناويني';
-$labels['editcontact'] = 'تحرير بيانات المراسل';
-$labels['edit'] = 'تحرير';
-$labels['cancel'] = 'إلغاء';
-$labels['save'] = 'حفظ';
-$labels['delete'] = 'حذف';
-$labels['newcontact'] = 'إنشاء بطاقة مراسل جديدة';
-$labels['deletecontact'] = 'حذف المراسلين المحددين';
-$labels['composeto'] = 'إنشاء رسالة إليه';
-$labels['contactsfromto'] = 'المراسلون $from إلى $to من $count';
-$labels['print'] = 'طباعة';
-$labels['export'] = 'تصدير';
-$labels['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['messagecount'] = 'الرسائل';
-$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
deleted file mode 100644 (file)
index 68b36a9..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ar/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Ossama Khayat <okhayat@yahoo.com>                             |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
-
-*/
-
-$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'] = 'جاري نقل الرسالة...';
-$messages['receiptsent'] = 'أرسل إيصال الاستلام بنجاح';
-$messages['errorsendingreceipt'] = 'تعذر إرسال إيصال الاستلام';
-$messages['nodeletelastidentity'] = 'لا يمكن حذف هذا السجل حيث أنه الوحيد المتبقي.';
-$messages['addsubfolderhint'] = 'سيتم إنشاء هذا المجلد كمجلد فرعي للمحدد.';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ar_SA/labels.inc b/program/localization/ar_SA/labels.inc
new file mode 100644 (file)
index 0000000..f4a330b
--- /dev/null
@@ -0,0 +1,227 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/ar/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Ossama Khayat <okhayat@yahoo.com>                             |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 1474 2008-06-05 06:55:51Z yllar $
+
+*/
+
+$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['jan'] = 'ينا';
+$labels['feb'] = 'فبر';
+$labels['mar'] = 'مار';
+$labels['apr'] = 'أبر';
+$labels['may'] = 'ماي';
+$labels['jun'] = 'يون';
+$labels['jul'] = 'يول';
+$labels['aug'] = 'أغس';
+$labels['sep'] = 'سبت';
+$labels['oct'] = 'أكت';
+$labels['nov'] = 'نوف';
+$labels['dec'] = 'ديس';
+$labels['longjan'] = 'يناير';
+$labels['longfeb'] = 'فبراير';
+$labels['longmar'] = 'مارس';
+$labels['longapr'] = 'أبريل';
+$labels['longmay'] = 'مايو';
+$labels['longjun'] = 'يونيو';
+$labels['longjul'] = 'يوليو';
+$labels['longaug'] = 'أغسطس';
+$labels['longsep'] = 'سبتمبر';
+$labels['longoct'] = 'أكتوبر';
+$labels['longnov'] = 'نوفمبر';
+$labels['longdec'] = 'ديسمبر';
+$labels['today'] = 'اليوم';
+$labels['checkmail'] = 'التحقق من وجود رسائل جديدة';
+$labels['writenewmessage'] = 'إنشاء رسالة جديدة';
+$labels['replytomessage'] = 'الرد على الرسالة';
+$labels['replytoallmessage'] = 'الرد على المرسل وجميع مستقبلي الرسالة';
+$labels['forwardmessage'] = 'تمرير الرسالة';
+$labels['deletemessage'] = 'حذف الرسالة إلى المهملات';
+$labels['movemessagetotrash'] = 'انقل الرسالة إلى سلة المهملات';
+$labels['printmessage'] = 'طباعة هذه الرسالة';
+$labels['previousmessage'] = 'عرض الرسالة السابقة';
+$labels['previousmessages'] = 'عرض المجموعة السابقة من الرسائل';
+$labels['firstmessage'] = 'عرض الرسالة الأولى';
+$labels['firstmessages'] = 'عرض مجموعة الرسائل الأولى';
+$labels['nextmessage'] = 'عرض الرسالة التالية';
+$labels['nextmessages'] = 'عرض المجموعة التالية من الرسائل';
+$labels['lastmessage'] = 'عرض الرسالة الأخيرة';
+$labels['lastmessages'] = 'عرض مجموعة الرسائل الأخيرة';
+$labels['backtolist'] = 'العودة إلى لائحة الرسائل';
+$labels['viewsource'] = 'إظهار المصدر';
+$labels['markmessages'] = 'وسم الرسالة';
+$labels['markread'] = 'كمقروءة';
+$labels['markunread'] = 'كغير مقروءة';
+$labels['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['savemessage'] = 'حفظ هذه المسودة';
+$labels['sendmessage'] = 'إرسال الرسالة الآن';
+$labels['addattachment'] = 'إرفاق ملف';
+$labels['charset'] = 'مجموعة المحارف';
+$labels['editortype'] = 'نوع المُحرّر';
+$labels['returnreceipt'] = 'ايصال استلام';
+$labels['checkspelling'] = 'التدقيق الإملائي';
+$labels['resumeediting'] = 'متابعة التحرير';
+$labels['revertto'] = 'استعادة إلى';
+$labels['attachments'] = 'مرفقات';
+$labels['upload'] = 'تحميل';
+$labels['close'] = 'إغلاق';
+$labels['low'] = 'منخض';
+$labels['lowest'] = 'الأقل';
+$labels['normal'] = 'عادي';
+$labels['high'] = 'مرتفع';
+$labels['highest'] = 'الأعلى';
+$labels['nosubject'] = '(دون موضوع)';
+$labels['showimages'] = 'إظهار الصور';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'نص مجرد';
+$labels['addcc'] = 'أضف CC';
+$labels['addbcc'] = 'أضف BCC';
+$labels['addreplyto'] = 'أضيف Reply-To';
+$labels['mdnrequest'] = 'طلب المرسل إعلامه عند قراءتك لرسالته. هل تود إعلام المرسل؟';
+$labels['receiptread'] = 'إيصال الاستلام )بالقراءة)';
+$labels['yourmessage'] = 'هذا إيصال بقراءة رسالتك';
+$labels['receiptnote'] = 'ملاحظة: يُعلمك هذا الإيصال بأن رسالتك قد ظهرت على جهاز المستقبِل. ليست هناك أية ضمانات أن المستقبل قد قرأ أو فهم محتويات الرسالة.';
+$labels['name'] = 'اسم العرض';
+$labels['firstname'] = 'الإسم الأول';
+$labels['surname'] = 'الإسم الأخير';
+$labels['email'] = 'البريد الإلكتروني';
+$labels['addcontact'] = 'إضافة المراسل المحدد إلى دفتر عناويني';
+$labels['editcontact'] = 'تحرير بيانات المراسل';
+$labels['edit'] = 'تحرير';
+$labels['cancel'] = 'إلغاء';
+$labels['save'] = 'حفظ';
+$labels['delete'] = 'حذف';
+$labels['newcontact'] = 'إنشاء بطاقة مراسل جديدة';
+$labels['deletecontact'] = 'حذف المراسلين المحددين';
+$labels['composeto'] = 'إنشاء رسالة إليه';
+$labels['contactsfromto'] = 'المراسلون $from إلى $to من $count';
+$labels['print'] = 'طباعة';
+$labels['export'] = 'تصدير';
+$labels['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['logoutclear'] = 'أفرغ المحذوفات عند الخروج';
+$labels['logoutcompact'] = 'اضغط الوارد عن الخروج';
+$labels['uisettings'] = 'واجهة المستخدم';
+$labels['serversettings'] = 'إعدادات الخادم';
+$labels['mailboxview'] = 'مظهر صندوق البريد';
+$labels['mdnrequests'] = 'تنويهات المُرسِل';
+$labels['askuser'] = 'اسأل المستخدم';
+$labels['autosend'] = 'أأرسلها تلقائياً';
+$labels['ignore'] = 'تجاهلها';
+$labels['readwhendeleted'] = 'حدد الرسالة كمقروءة عند حذفها';
+$labels['flagfordeletion'] = 'ضع علامة على الرسالة لحذفها بدلاً من حذفها';
+$labels['autosavedraft'] = 'حفظ المسودة تلقائياً';
+$labels['everynminutes'] = 'كل $n دقيقة';
+$labels['never'] = 'أبداً';
+$labels['folder'] = 'مجلد';
+$labels['folders'] = 'مجلدات';
+$labels['foldername'] = 'اسم المجلد';
+$labels['subscribed'] = 'مشترك';
+$labels['messagecount'] = 'الرسائل';
+$labels['create'] = 'إنشاء';
+$labels['createfolder'] = 'إنشاء مجلد جديد';
+$labels['rename'] = 'إعادة التسمية';
+$labels['renamefolder'] = 'إعادة تسمية المجلد';
+$labels['deletefolder'] = 'حذف المجلد';
+$labels['managefolders'] = 'إدارة المجلدات';
+$labels['sortby'] = 'ترتيب بحسب';
+$labels['sortasc'] = 'ترتيب تصاعدي';
+$labels['sortdesc'] = 'ترتيب تنازلي';
+
+?>
diff --git a/program/localization/ar_SA/messages.inc b/program/localization/ar_SA/messages.inc
new file mode 100644 (file)
index 0000000..5992363
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/ar/messages.inc                                              |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Ossama Khayat <okhayat@yahoo.com>                             |
++-----------------------------------------------------------------------+
+
+@version $Id: messages.inc 1474 2008-06-05 06:55:51Z yllar $
+
+*/
+
+$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'] = 'جاري نقل الرسالة...';
+$messages['receiptsent'] = 'أرسل إيصال الاستلام بنجاح';
+$messages['errorsendingreceipt'] = 'تعذر إرسال إيصال الاستلام';
+$messages['nodeletelastidentity'] = 'لا يمكن حذف هذا السجل حيث أنه الوحيد المتبقي.';
+$messages['addsubfolderhint'] = 'سيتم إنشاء هذا المجلد كمجلد فرعي للمحدد.';
+$messages['forbiddencharacter'] = 'اسم المجلّد يحتوي حروفاً ممنوعة';
+
+?>
diff --git a/program/localization/bg/labels.inc b/program/localization/bg/labels.inc
deleted file mode 100644 (file)
index 16c8428..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/bg/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$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['movemessagetotrash'] = 'Премести писмото в кошчето';
-$labels['printmessage'] = 'Разпечатай писмото';
-$labels['previousmessage'] = 'Предно писмо';
-$labels['previousmessages'] = 'Предна страница';
-$labels['firstmessage'] = 'Първо писмо';
-$labels['firstmessages'] = 'Първа страница';
-$labels['nextmessage'] = 'Следващо писмо';
-$labels['nextmessages'] = 'Следваща страница';
-$labels['lastmessage'] = 'Последно писмо';
-$labels['lastmessages'] = 'Последна страница';
-$labels['backtolist'] = 'Обратно към списъка';
-$labels['viewsource'] = 'Виж кода';
-$labels['markmessages'] = 'Маркирай писмата';
-$labels['markread'] = 'Като прочетени';
-$labels['markunread'] = 'Като нови';
-$labels['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['savemessage'] = 'Запиши в Чернови';
-$labels['sendmessage'] = 'Изпрати писмото';
-$labels['addattachment'] = 'Прикачи файл';
-$labels['charset'] = 'Кодировка';
-$labels['editortype'] = 'Вид редактор';
-$labels['returnreceipt'] = 'Обратна разписка';
-$labels['checkspelling'] = 'Провери правописа';
-$labels['resumeediting'] = 'Продължи черновата';
-$labels['revertto'] = 'Върни се към';
-$labels['attachments'] = 'Прикачени файлове';
-$labels['upload'] = 'Качи';
-$labels['close'] = 'Затвори';
-$labels['low'] = '**';
-$labels['lowest'] = '*';
-$labels['normal'] = '***';
-$labels['high'] = '****';
-$labels['highest'] = '*****';
-$labels['nosubject'] = '(няма заглавие)';
-$labels['showimages'] = 'Виж изображенията';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'текстов';
-$labels['addcc'] = 'Копие до';
-$labels['addbcc'] = 'Скрито копие до';
-$labels['addreplyto'] = 'Отговор на';
-$labels['mdnrequest'] = 'Подателят на писмото е пожелал да бъде уведомен, че сте го прочели. Желаете ли да изпратите обратна разписка?';
-$labels['receiptread'] = 'Обратна разписка (прочетено)';
-$labels['yourmessage'] = 'Това е обратна разписка за писмото Ви';
-$labels['receiptnote'] = 'Забележка: Тази разписка потвърждава само, че писмото е било показано на компютъра на получателят. Няма никаква гаранция, че получателят е прочел и/или разбрал съдържанието на писмото.';
-$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'] = 'Лични адреси';
-$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['messagecount'] = 'Писма';
-$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/bg/messages.inc b/program/localization/bg/messages.inc
deleted file mode 100644 (file)
index 75d1904..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/bg/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$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'] = 'Контакт с този 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'] = 'Моля, въведете валиден e-mail адрес';
-$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'] = 'Грешка при записването на адреса';
-$messages['movingmessage'] = 'Преместване на писмото...';
-$messages['receiptsent'] = 'Обратната разписка е изпратена.';
-$messages['errorsendingreceipt'] = 'Грешка при изпращането на обратна разписка.';
-$messages['nodeletelastidentity'] = 'Не можете да изтриете тази самоличност, трябва да имате поне една.';
-$messages['addsubfolderhint'] = 'Тази папка ще бъде създадена като подпапка на текущо избраната';
-
-?>
\ No newline at end of file
diff --git a/program/localization/bg_BG/labels.inc b/program/localization/bg_BG/labels.inc
new file mode 100644 (file)
index 0000000..16c8428
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/bg/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$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['movemessagetotrash'] = 'Премести писмото в кошчето';
+$labels['printmessage'] = 'Разпечатай писмото';
+$labels['previousmessage'] = 'Предно писмо';
+$labels['previousmessages'] = 'Предна страница';
+$labels['firstmessage'] = 'Първо писмо';
+$labels['firstmessages'] = 'Първа страница';
+$labels['nextmessage'] = 'Следващо писмо';
+$labels['nextmessages'] = 'Следваща страница';
+$labels['lastmessage'] = 'Последно писмо';
+$labels['lastmessages'] = 'Последна страница';
+$labels['backtolist'] = 'Обратно към списъка';
+$labels['viewsource'] = 'Виж кода';
+$labels['markmessages'] = 'Маркирай писмата';
+$labels['markread'] = 'Като прочетени';
+$labels['markunread'] = 'Като нови';
+$labels['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['savemessage'] = 'Запиши в Чернови';
+$labels['sendmessage'] = 'Изпрати писмото';
+$labels['addattachment'] = 'Прикачи файл';
+$labels['charset'] = 'Кодировка';
+$labels['editortype'] = 'Вид редактор';
+$labels['returnreceipt'] = 'Обратна разписка';
+$labels['checkspelling'] = 'Провери правописа';
+$labels['resumeediting'] = 'Продължи черновата';
+$labels['revertto'] = 'Върни се към';
+$labels['attachments'] = 'Прикачени файлове';
+$labels['upload'] = 'Качи';
+$labels['close'] = 'Затвори';
+$labels['low'] = '**';
+$labels['lowest'] = '*';
+$labels['normal'] = '***';
+$labels['high'] = '****';
+$labels['highest'] = '*****';
+$labels['nosubject'] = '(няма заглавие)';
+$labels['showimages'] = 'Виж изображенията';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'текстов';
+$labels['addcc'] = 'Копие до';
+$labels['addbcc'] = 'Скрито копие до';
+$labels['addreplyto'] = 'Отговор на';
+$labels['mdnrequest'] = 'Подателят на писмото е пожелал да бъде уведомен, че сте го прочели. Желаете ли да изпратите обратна разписка?';
+$labels['receiptread'] = 'Обратна разписка (прочетено)';
+$labels['yourmessage'] = 'Това е обратна разписка за писмото Ви';
+$labels['receiptnote'] = 'Забележка: Тази разписка потвърждава само, че писмото е било показано на компютъра на получателят. Няма никаква гаранция, че получателят е прочел и/или разбрал съдържанието на писмото.';
+$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'] = 'Лични адреси';
+$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['messagecount'] = 'Писма';
+$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/bg_BG/messages.inc b/program/localization/bg_BG/messages.inc
new file mode 100644 (file)
index 0000000..75d1904
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/bg/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$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'] = 'Контакт с този 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'] = 'Моля, въведете валиден e-mail адрес';
+$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'] = 'Грешка при записването на адреса';
+$messages['movingmessage'] = 'Преместване на писмото...';
+$messages['receiptsent'] = 'Обратната разписка е изпратена.';
+$messages['errorsendingreceipt'] = 'Грешка при изпращането на обратна разписка.';
+$messages['nodeletelastidentity'] = 'Не можете да изтриете тази самоличност, трябва да имате поне една.';
+$messages['addsubfolderhint'] = 'Тази папка ще бъде създадена като подпапка на текущо избраната';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ca/labels.inc b/program/localization/ca/labels.inc
deleted file mode 100644 (file)
index f238a02..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ca/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Miguel Canteras i Cañizares <miguel@canteras.org>             |
- |         Simo <sim6@graciasensefils.net>                               |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1143 2008-02-26 20:50:10Z yllar $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Benvingut a $product';
-$labels['username'] = 'Nom d\'usuari';
-$labels['password'] = 'Contrasenya';
-$labels['server'] = 'Servidor';
-$labels['login'] = 'Entrar';
-$labels['logout'] = 'Tancar sessió';
-$labels['mail'] = 'E-Mail';
-$labels['settings'] = 'Configuració';
-$labels['addressbook'] = 'Contactes';
-$labels['inbox'] = 'Entrada';
-$labels['drafts'] = 'Esborranys';
-$labels['sent'] = 'Enviats';
-$labels['trash'] = 'Paperera';
-$labels['junk'] = 'Correu brossa';
-$labels['subject'] = 'Assumpte';
-$labels['from'] = 'Remitent';
-$labels['to'] = 'Destinatari';
-$labels['cc'] = 'CC';
-$labels['bcc'] = 'BCC';
-$labels['replyto'] = 'Respondre a';
-$labels['date'] = 'Data';
-$labels['size'] = 'Grandària';
-$labels['priority'] = 'Prioritat';
-$labels['organization'] = 'Organització';
-$labels['reply-to'] = 'Respondre a';
-$labels['mailboxlist'] = 'Carpetes';
-$labels['messagesfromto'] = 'Missatges des de $from a $to de $count';
-$labels['messagenrof'] = 'Missatge $nr de $count';
-$labels['moveto'] = 'moure a...';
-$labels['download'] = 'descarregar';
-$labels['filename'] = 'Nom del fitxer';
-$labels['filesize'] = 'Grandaria de fitxer';
-$labels['preferhtml'] = 'Preferisc HTML';
-$labels['htmlmessage'] = 'Missatge HTML';
-$labels['prettydate'] = 'Dates curtes';
-$labels['addtoaddressbook'] = 'Afegir a contactes';
-$labels['sun'] = 'DM';
-$labels['mon'] = 'DL';
-$labels['tue'] = 'DM';
-$labels['wed'] = 'DC';
-$labels['thu'] = 'DJ';
-$labels['fri'] = 'DV';
-$labels['sat'] = 'DS';
-$labels['sunday'] = 'Diumenge';
-$labels['monday'] = 'Dilluns';
-$labels['tuesday'] = 'Dimarts';
-$labels['wednesday'] = 'Dimecres';
-$labels['thursday'] = 'Dijous';
-$labels['friday'] = 'Divendres';
-$labels['saturday'] = 'Dissabte';
-$labels['today'] = 'Avui';
-$labels['checkmail'] = 'Recupera missatges nous';
-$labels['writenewmessage'] = 'Crear nou missatge';
-$labels['replytomessage'] = 'Respondre al missatge';
-$labels['replytoallmessage'] = 'Respondre al remitent i a tots els destinataris';
-$labels['forwardmessage'] = 'Reenviar missatge';
-$labels['deletemessage'] = 'Eliminar missatge';
-$labels['movemessagetotrash'] = 'Moure missatge a la paperera';
-$labels['printmessage'] = 'Imprimir aquest missatge';
-$labels['previousmessage'] = 'Mostrar el missatge anterior';
-$labels['previousmessages'] = 'Mostrar missatges anteriors';
-$labels['firstmessage'] = 'Mostrar el primer missatge';
-$labels['firstmessages'] = 'Mostrar els primers missatges';
-$labels['nextmessage'] = 'Mostrar el missatge següent';
-$labels['nextmessages'] = 'Mostrar missatges següents';
-$labels['lastmessage'] = 'Mostrar l\'últim missatge';
-$labels['lastmessages'] = 'Mostrar els últims missatges';
-$labels['backtolist'] = 'Tornar a la llista de missatges';
-$labels['viewsource'] = 'Visualitza el codi font';
-$labels['markmessages'] = 'Marca missatges';
-$labels['markread'] = 'Com a llegits';
-$labels['markunread'] = 'Com a no llegits';
-$labels['select'] = 'Seleccionar';
-$labels['all'] = 'Tots';
-$labels['none'] = 'Cap';
-$labels['unread'] = 'No llegits';
-$labels['compact'] = 'Compacta';
-$labels['empty'] = 'Buida';
-$labels['purge'] = 'Purga';
-$labels['quota'] = 'Utilització de disc';
-$labels['unknown'] = 'desconegut';
-$labels['unlimited'] = 'il·limitat';
-$labels['quicksearch'] = 'Cerca ràpida';
-$labels['resetsearch'] = 'Neteja cerca';
-$labels['compose'] = 'Escriure un 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';
-$labels['returnreceipt'] = 'Confirmació de recepció';
-$labels['checkspelling'] = 'Comprova l\'ortografia';
-$labels['resumeediting'] = 'Continua l\'edició';
-$labels['revertto'] = 'Tornar a';
-$labels['attachments'] = 'Adjunts';
-$labels['upload'] = 'Afegir';
-$labels['close'] = 'Cancel·lar';
-$labels['low'] = 'Baixa';
-$labels['lowest'] = 'Molt baixa';
-$labels['normal'] = 'Normal';
-$labels['high'] = 'Alta';
-$labels['highest'] = 'Molt alta';
-$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['mdnrequest'] = 'El remitent d\'aquest missatge ha demanat ser notificat quan llegeixis aquest missatge. Vols notificar al remitent?';
-$labels['receiptread'] = 'Confirmació de recepció';
-$labels['yourmessage'] = 'Aquesta és una confirmació de recepció per al teu missatge';
-$labels['receiptnote'] = 'Nota: Aquesta confirmació solament indica que el missatge ha estat mostrat en l\'ordinador del destinatari. No hi ha garantia que el destinatari hagi llegit o entès el contingut del missatge.';
-$labels['name'] = 'Nom a mostrar';
-$labels['firstname'] = 'Nom';
-$labels['surname'] = 'Cognom';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Afegir nou contacte';
-$labels['editcontact'] = 'Editar contacte';
-$labels['edit'] = 'Editar';
-$labels['cancel'] = 'Cancel·lar';
-$labels['save'] = 'Desar';
-$labels['delete'] = 'Suprimir';
-$labels['newcontact'] = 'Crear nou contacte';
-$labels['deletecontact'] = 'Suprimir contactes seleccionats';
-$labels['composeto'] = 'Redactar correu per a';
-$labels['contactsfromto'] = 'Contactes $from a $to de $count';
-$labels['print'] = 'Imprimeix';
-$labels['export'] = 'Exportar';
-$labels['previouspage'] = 'Mostrar anteriors';
-$labels['firstpage'] = 'Mostrar primers';
-$labels['nextpage'] = 'Mostrar següents';
-$labels['lastpage'] = 'Mostrar últims';
-$labels['groups'] = 'Grups';
-$labels['personaladrbook'] = 'Llibreta d\'adreces';
-$labels['settingsfor'] = 'Configuració per a';
-$labels['preferences'] = 'Preferències';
-$labels['userpreferences'] = 'Preferències d\'usuari';
-$labels['editpreferences'] = 'Editar preferències d\'usuari';
-$labels['identities'] = 'Identitats';
-$labels['manageidentities'] = 'Gestionar identitats per a aquest compte';
-$labels['newidentity'] = 'Nova identitat';
-$labels['newitem'] = 'Nou';
-$labels['edititem'] = 'Editar';
-$labels['setdefault'] = 'Seleccionar opció per defecte';
-$labels['language'] = 'Idioma';
-$labels['timezone'] = 'Zona horària';
-$labels['pagesize'] = 'Files per pàgina';
-$labels['signature'] = 'Signatura';
-$labels['dstactive'] = 'Horari d\'estiu';
-$labels['htmleditor'] = 'Escriure missatges HTML';
-$labels['htmlsignature'] = 'Signatura HTML';
-$labels['previewpane'] = 'Mostrar el panell de previsualització';
-$labels['autosavedraft'] = 'Desar esborrany automàticament';
-$labels['everynminutes'] = 'cada $n minuts';
-$labels['never'] = 'mai';
-$labels['folder'] = 'Carpeta';
-$labels['folders'] = 'Carpetes';
-$labels['foldername'] = 'Nom de carpeta';
-$labels['subscribed'] = 'Subscriure\'s';
-$labels['messagecount'] = 'Missatges';
-$labels['create'] = 'Crear';
-$labels['createfolder'] = 'Crear nova carpeta';
-$labels['rename'] = 'Canvia el nom';
-$labels['renamefolder'] = 'Canvia el nom de la carpeta';
-$labels['deletefolder'] = 'Suprimir carpeta';
-$labels['managefolders'] = 'Gestionar carpetes';
-$labels['sortby'] = 'Ordena per';
-$labels['sortasc'] = 'Ordena ascendentment';
-$labels['sortdesc'] = 'Ordena descendentment';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ca/messages.inc b/program/localization/ca/messages.inc
deleted file mode 100644 (file)
index 5f2a131..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ca/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Miguel Canteras i Cañizares <miguel@canteras.org>             |
- |         Simo <sim6@graciasensefils.net>                               |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Contrasenya incorrecta';
-$messages['cookiesdisabled'] = 'El seu navegador no accepta cookies';
-$messages['sessionerror'] = 'La seva sessió no existeix o ha expirat';
-$messages['imaperror'] = 'Error de conexió amb el servidor IMAP';
-$messages['nomessagesfound'] = 'No s\'han trobat missatges en aquesta bústia';
-$messages['loggedout'] = 'Ha tancat la sessió. Fins aviat!';
-$messages['mailboxempty'] = 'La bústia està buida';
-$messages['loading'] = 'Carregant...';
-$messages['loadingdata'] = 'Carregant dades...';
-$messages['checkingmail'] = 'Cercant nous missatges...';
-$messages['sendingmessage'] = 'Enviant missatge...';
-$messages['messagesent'] = 'Missatge enviat correctament';
-$messages['savingmessage'] = 'Desant missatge...';
-$messages['messagesaved'] = 'Missatge desat a Esborranys';
-$messages['successfullysaved'] = 'Desat correctament';
-$messages['addedsuccessfully'] = 'Contacte afegit correctament a la llibreta d\'adreces';
-$messages['contactexists'] = 'Ja hi ha un contacte amb aquesta adreça de correu';
-$messages['blockedimages'] = 'Per a protegir la seva privacitat, les imatges remotes han sigut bloquejades en aquest missatge';
-$messages['encryptedmessage'] = 'Aquest és un missatge xifrat i no pot ser mostrat. Ho sento!';
-$messages['nocontactsfound'] = 'No hi ha contactes';
-$messages['contactnotfound'] = 'No s\'ha trobat el contacte solicitat';
-$messages['sendingfailed'] = 'Error enviant missatge';
-$messages['errorsaving'] = 'Va ocórrer un error mentres es desava';
-$messages['errormoving'] = 'No s\'ha pogut moure el missatge';
-$messages['errordeleting'] = 'No s\'ha pogut eliminar el missatge';
-$messages['deletecontactconfirm'] = 'Realment vol suprimir el(s) contacte(s) selecionat(s)?';
-$messages['deletemessagesconfirm'] = 'Realment vol suprimir el(s) missatge(s) selecionat(s)?';
-$messages['deletefolderconfirm'] = 'Realment vol suprimir aquesta carpeta?';
-$messages['purgefolderconfirm'] = 'Realment vol suprimir tots els missatges d\'aquesta carpeta?';
-$messages['formincomplete'] = 'El formulari no ha sigut emplenat totalment';
-$messages['noemailwarning'] = 'Introdueixi una direcció email vàlida';
-$messages['nonamewarning'] = 'Introdueixi un nom';
-$messages['nopagesizewarning'] = 'Introdueixi un tamany de pàgina';
-$messages['norecipientwarning'] = 'Introdueixi al menys un destinatari';
-$messages['nosubjectwarning'] = 'El camp "Assumpte" eatà buit. Vol introduir un ara?';
-$messages['nobodywarning'] = 'Vol enviar aquest missatge sense text?';
-$messages['notsentwarning'] = 'El missatge no s\'ha enviat. Vol descartar el seu missatge?';
-$messages['noldapserver'] = 'Seleccioni un servidor ldap per a cercar';
-$messages['nocontactsreturned'] = 'No s\'han trobat contactes';
-$messages['nosearchname'] = 'Introdueixi un nom de contacte o una direcció email';
-$messages['searchsuccessful'] = '$nr missatges trobats';
-$messages['searchnomatch'] = 'No s\'ha trobat cap coincidència';
-$messages['searching'] = 'Cercant...';
-$messages['checking'] = 'Comprovant...';
-$messages['nospellerrors'] = 'No s\'han trobat errors d\'ortografia';
-$messages['folderdeleted'] = 'Carpeta eliminada correctament';
-$messages['deletedsuccessfully'] = 'Eliminat correctament';
-$messages['converting'] = 'Treient format del missatge...';
-$messages['messageopenerror'] = 'No s\'ha pogut carregar el missatge del servidor';
-$messages['fileuploaderror'] = 'Pujada de fitxer fallida';
-$messages['filesizeerror'] = 'El fitxer pujat excedeix la grandària màxima de $size';
-$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...';
-$messages['receiptsent'] = 'Confirmació de lectura enviada satisfactòriament';
-$messages['errorsendingreceipt'] = 'No es pot enviar la confirmació';
-$messages['nodeletelastidentity'] = 'No pots eliminar aquesta identitat, és l\'última.';
-$messages['addsubfolderhint'] = 'Aquesta carpeta serà creada com a subcarpeta de la seleccionada actualment';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ca_ES/labels.inc b/program/localization/ca_ES/labels.inc
new file mode 100644 (file)
index 0000000..9c2d85b
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/ca_ES/labels.inc                                             |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Miguel Canteras i Cañizares <miguel@canteras.org>             |
+|         Simo <sim6@graciasensefils.net>                               |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 1486 2008-06-07 11:47:46Z thomasb $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Benvingut a $product';
+$labels['username'] = 'Nom d\'usuari';
+$labels['password'] = 'Contrasenya';
+$labels['server'] = 'Servidor';
+$labels['login'] = 'Entrar';
+$labels['logout'] = 'Tancar sessió';
+$labels['mail'] = 'E-Mail';
+$labels['settings'] = 'Configuració';
+$labels['addressbook'] = 'Contactes';
+$labels['inbox'] = 'Entrada';
+$labels['drafts'] = 'Esborranys';
+$labels['sent'] = 'Enviats';
+$labels['trash'] = 'Paperera';
+$labels['junk'] = 'Correu brossa';
+$labels['subject'] = 'Assumpte';
+$labels['from'] = 'Remitent';
+$labels['to'] = 'Destinatari';
+$labels['cc'] = 'CC';
+$labels['bcc'] = 'BCC';
+$labels['replyto'] = 'Respondre a';
+$labels['date'] = 'Data';
+$labels['size'] = 'Grandària';
+$labels['priority'] = 'Prioritat';
+$labels['organization'] = 'Organització';
+$labels['reply-to'] = 'Respondre a';
+$labels['mailboxlist'] = 'Carpetes';
+$labels['messagesfromto'] = 'Missatges des de $from a $to de $count';
+$labels['messagenrof'] = 'Missatge $nr de $count';
+$labels['moveto'] = 'moure a...';
+$labels['download'] = 'descarregar';
+$labels['filename'] = 'Nom del fitxer';
+$labels['filesize'] = 'Grandaria de fitxer';
+$labels['preferhtml'] = 'Preferisc HTML';
+$labels['htmlmessage'] = 'Missatge HTML';
+$labels['prettydate'] = 'Dates curtes';
+$labels['addtoaddressbook'] = 'Afegir a contactes';
+$labels['sun'] = 'DM';
+$labels['mon'] = 'DL';
+$labels['tue'] = 'DM';
+$labels['wed'] = 'DC';
+$labels['thu'] = 'DJ';
+$labels['fri'] = 'DV';
+$labels['sat'] = 'DS';
+$labels['sunday'] = 'Diumenge';
+$labels['monday'] = 'Dilluns';
+$labels['tuesday'] = 'Dimarts';
+$labels['wednesday'] = 'Dimecres';
+$labels['thursday'] = 'Dijous';
+$labels['friday'] = 'Divendres';
+$labels['saturday'] = 'Dissabte';
+$labels['jan'] = 'gen';
+$labels['feb'] = 'feb';
+$labels['mar'] = 'mar';
+$labels['apr'] = 'abr';
+$labels['may'] = 'mai';
+$labels['jun'] = 'jun';
+$labels['jul'] = 'jul';
+$labels['aug'] = 'ago';
+$labels['sep'] = 'set';
+$labels['oct'] = 'oct';
+$labels['nov'] = 'nov';
+$labels['dec'] = 'des';
+$labels['longjan'] = 'gener';
+$labels['longfeb'] = 'febrer';
+$labels['longmar'] = 'març';
+$labels['longapr'] = 'abril';
+$labels['longmay'] = 'maig';
+$labels['longjun'] = 'juny';
+$labels['longjul'] = 'juliol';
+$labels['longaug'] = 'agost';
+$labels['longsep'] = 'setembre';
+$labels['longoct'] = 'octubre';
+$labels['longnov'] = 'novembre';
+$labels['longdec'] = 'desembre';
+$labels['today'] = 'Avui';
+$labels['checkmail'] = 'Recupera missatges nous';
+$labels['writenewmessage'] = 'Crear nou missatge';
+$labels['replytomessage'] = 'Respondre al missatge';
+$labels['replytoallmessage'] = 'Respondre al remitent i a tots els destinataris';
+$labels['forwardmessage'] = 'Reenviar missatge';
+$labels['deletemessage'] = 'Eliminar missatge';
+$labels['movemessagetotrash'] = 'Moure missatge a la paperera';
+$labels['printmessage'] = 'Imprimir aquest missatge';
+$labels['previousmessage'] = 'Mostrar el missatge anterior';
+$labels['previousmessages'] = 'Mostrar missatges anteriors';
+$labels['firstmessage'] = 'Mostrar el primer missatge';
+$labels['firstmessages'] = 'Mostrar els primers missatges';
+$labels['nextmessage'] = 'Mostrar el missatge següent';
+$labels['nextmessages'] = 'Mostrar missatges següents';
+$labels['lastmessage'] = 'Mostrar l\'últim missatge';
+$labels['lastmessages'] = 'Mostrar els últims missatges';
+$labels['backtolist'] = 'Tornar a la llista de missatges';
+$labels['viewsource'] = 'Visualitza el codi font';
+$labels['markmessages'] = 'Marca missatges';
+$labels['markread'] = 'Com a llegits';
+$labels['markunread'] = 'Com a no llegits';
+$labels['select'] = 'Seleccionar';
+$labels['all'] = 'Tots';
+$labels['none'] = 'Cap';
+$labels['unread'] = 'No llegits';
+$labels['compact'] = 'Compacta';
+$labels['empty'] = 'Buida';
+$labels['purge'] = 'Purga';
+$labels['quota'] = 'Utilització de disc';
+$labels['unknown'] = 'desconegut';
+$labels['unlimited'] = 'il·limitat';
+$labels['quicksearch'] = 'Cerca ràpida';
+$labels['resetsearch'] = 'Neteja cerca';
+$labels['compose'] = 'Escriure un 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';
+$labels['returnreceipt'] = 'Confirmació de recepció';
+$labels['checkspelling'] = 'Comprova l\'ortografia';
+$labels['resumeediting'] = 'Continua l\'edició';
+$labels['revertto'] = 'Tornar a';
+$labels['attachments'] = 'Adjunts';
+$labels['upload'] = 'Afegir';
+$labels['close'] = 'Cancel·lar';
+$labels['low'] = 'Baixa';
+$labels['lowest'] = 'Molt baixa';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Alta';
+$labels['highest'] = 'Molt alta';
+$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['mdnrequest'] = 'El remitent d\'aquest missatge ha demanat ser notificat quan llegeixis aquest missatge. Vols notificar al remitent?';
+$labels['receiptread'] = 'Confirmació de recepció';
+$labels['yourmessage'] = 'Aquesta és una confirmació de recepció per al teu missatge';
+$labels['receiptnote'] = 'Nota: Aquesta confirmació solament indica que el missatge ha estat mostrat en l\'ordinador del destinatari. No hi ha garantia que el destinatari hagi llegit o entès el contingut del missatge.';
+$labels['name'] = 'Nom a mostrar';
+$labels['firstname'] = 'Nom';
+$labels['surname'] = 'Cognom';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Afegir nou contacte';
+$labels['editcontact'] = 'Editar contacte';
+$labels['edit'] = 'Editar';
+$labels['cancel'] = 'Cancel·lar';
+$labels['save'] = 'Desar';
+$labels['delete'] = 'Suprimir';
+$labels['newcontact'] = 'Crear nou contacte';
+$labels['deletecontact'] = 'Suprimir contactes seleccionats';
+$labels['composeto'] = 'Redactar correu per a';
+$labels['contactsfromto'] = 'Contactes $from a $to de $count';
+$labels['print'] = 'Imprimeix';
+$labels['export'] = 'Exportar';
+$labels['previouspage'] = 'Mostrar anteriors';
+$labels['firstpage'] = 'Mostrar primers';
+$labels['nextpage'] = 'Mostrar següents';
+$labels['lastpage'] = 'Mostrar últims';
+$labels['groups'] = 'Grups';
+$labels['personaladrbook'] = 'Llibreta d\'adreces';
+$labels['settingsfor'] = 'Configuració per a';
+$labels['preferences'] = 'Preferències';
+$labels['userpreferences'] = 'Preferències d\'usuari';
+$labels['editpreferences'] = 'Editar preferències d\'usuari';
+$labels['identities'] = 'Identitats';
+$labels['manageidentities'] = 'Gestionar identitats per a aquest compte';
+$labels['newidentity'] = 'Nova identitat';
+$labels['newitem'] = 'Nou';
+$labels['edititem'] = 'Editar';
+$labels['setdefault'] = 'Seleccionar opció per defecte';
+$labels['language'] = 'Idioma';
+$labels['timezone'] = 'Zona horària';
+$labels['pagesize'] = 'Files per pàgina';
+$labels['signature'] = 'Signatura';
+$labels['dstactive'] = 'Horari d\'estiu';
+$labels['htmleditor'] = 'Escriure missatges HTML';
+$labels['htmlsignature'] = 'Signatura HTML';
+$labels['previewpane'] = 'Mostrar el panell de previsualització';
+$labels['logoutclear'] = 'Esborrar la paperera al tancar sessió';
+$labels['logoutcompact'] = 'Compactar la safata d\'entrada al tancar sessió';
+$labels['uisettings'] = 'Interfície d\'usuari';
+$labels['serversettings'] = 'Configuració del servidor';
+$labels['mailboxview'] = 'Vista de la bústia';
+$labels['mdnrequests'] = 'Notificacions de recepció';
+$labels['askuser'] = 'Pregunta-ho a l\'usuari';
+$labels['autosend'] = 'Envia-les automàticament';
+$labels['ignore'] = 'Ignora-les';
+$labels['readwhendeleted'] = 'Marca el missatge com a llegit quan s\'esborri';
+$labels['flagfordeletion'] = 'Afegeix marca d\'esborrat en comptes d\'esborrar-lo';
+$labels['autosavedraft'] = 'Desar esborrany automàticament';
+$labels['everynminutes'] = 'cada $n minuts';
+$labels['never'] = 'mai';
+$labels['folder'] = 'Carpeta';
+$labels['folders'] = 'Carpetes';
+$labels['foldername'] = 'Nom de carpeta';
+$labels['subscribed'] = 'Subscriure\'s';
+$labels['messagecount'] = 'Missatges';
+$labels['create'] = 'Crear';
+$labels['createfolder'] = 'Crear nova carpeta';
+$labels['rename'] = 'Canvia el nom';
+$labels['renamefolder'] = 'Canvia el nom de la carpeta';
+$labels['deletefolder'] = 'Suprimir carpeta';
+$labels['managefolders'] = 'Gestionar carpetes';
+$labels['sortby'] = 'Ordena per';
+$labels['sortasc'] = 'Ordena ascendentment';
+$labels['sortdesc'] = 'Ordena descendentment';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ca_ES/messages.inc b/program/localization/ca_ES/messages.inc
new file mode 100644 (file)
index 0000000..5bc7431
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/ca_ES/messages.inc                                           |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Miguel Canteras i Cañizares <miguel@canteras.org>             |
+|         Simo <sim6@graciasensefils.net>                               |
++-----------------------------------------------------------------------+
+
+@version $Id: messages.inc 1486 2008-06-07 11:47:46Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Contrasenya incorrecta';
+$messages['cookiesdisabled'] = 'El seu navegador no accepta cookies';
+$messages['sessionerror'] = 'La seva sessió no existeix o ha expirat';
+$messages['imaperror'] = 'Error de conexió amb el servidor IMAP';
+$messages['nomessagesfound'] = 'No s\'han trobat missatges en aquesta bústia';
+$messages['loggedout'] = 'Ha tancat la sessió. Fins aviat!';
+$messages['mailboxempty'] = 'La bústia està buida';
+$messages['loading'] = 'Carregant...';
+$messages['loadingdata'] = 'Carregant dades...';
+$messages['checkingmail'] = 'Cercant nous missatges...';
+$messages['sendingmessage'] = 'Enviant missatge...';
+$messages['messagesent'] = 'Missatge enviat correctament';
+$messages['savingmessage'] = 'Desant missatge...';
+$messages['messagesaved'] = 'Missatge desat a Esborranys';
+$messages['successfullysaved'] = 'Desat correctament';
+$messages['addedsuccessfully'] = 'Contacte afegit correctament a la llibreta d\'adreces';
+$messages['contactexists'] = 'Ja hi ha un contacte amb aquesta adreça de correu';
+$messages['blockedimages'] = 'Per a protegir la seva privacitat, les imatges remotes han sigut bloquejades en aquest missatge';
+$messages['encryptedmessage'] = 'Aquest és un missatge xifrat i no pot ser mostrat. Ho sento!';
+$messages['nocontactsfound'] = 'No hi ha contactes';
+$messages['contactnotfound'] = 'No s\'ha trobat el contacte solicitat';
+$messages['sendingfailed'] = 'Error enviant missatge';
+$messages['errorsaving'] = 'Va ocórrer un error mentres es desava';
+$messages['errormoving'] = 'No s\'ha pogut moure el missatge';
+$messages['errordeleting'] = 'No s\'ha pogut eliminar el missatge';
+$messages['deletecontactconfirm'] = 'Realment vol suprimir el(s) contacte(s) selecionat(s)?';
+$messages['deletemessagesconfirm'] = 'Realment vol suprimir el(s) missatge(s) selecionat(s)?';
+$messages['deletefolderconfirm'] = 'Realment vol suprimir aquesta carpeta?';
+$messages['purgefolderconfirm'] = 'Realment vol suprimir tots els missatges d\'aquesta carpeta?';
+$messages['formincomplete'] = 'El formulari no ha sigut emplenat totalment';
+$messages['noemailwarning'] = 'Introdueixi una direcció email vàlida';
+$messages['nonamewarning'] = 'Introdueixi un nom';
+$messages['nopagesizewarning'] = 'Introdueixi un tamany de pàgina';
+$messages['norecipientwarning'] = 'Introdueixi al menys un destinatari';
+$messages['nosubjectwarning'] = 'El camp "Assumpte" eatà buit. Vol introduir un ara?';
+$messages['nobodywarning'] = 'Vol enviar aquest missatge sense text?';
+$messages['notsentwarning'] = 'El missatge no s\'ha enviat. Vol descartar el seu missatge?';
+$messages['noldapserver'] = 'Seleccioni un servidor ldap per a cercar';
+$messages['nocontactsreturned'] = 'No s\'han trobat contactes';
+$messages['nosearchname'] = 'Introdueixi un nom de contacte o una direcció email';
+$messages['searchsuccessful'] = '$nr missatges trobats';
+$messages['searchnomatch'] = 'No s\'ha trobat cap coincidència';
+$messages['searching'] = 'Cercant...';
+$messages['checking'] = 'Comprovant...';
+$messages['nospellerrors'] = 'No s\'han trobat errors d\'ortografia';
+$messages['folderdeleted'] = 'Carpeta eliminada correctament';
+$messages['deletedsuccessfully'] = 'Eliminat correctament';
+$messages['converting'] = 'Treient format del missatge...';
+$messages['messageopenerror'] = 'No s\'ha pogut carregar el missatge del servidor';
+$messages['fileuploaderror'] = 'Pujada de fitxer fallida';
+$messages['filesizeerror'] = 'El fitxer pujat excedeix la grandària màxima de $size';
+$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...';
+$messages['receiptsent'] = 'Confirmació de lectura enviada satisfactòriament';
+$messages['errorsendingreceipt'] = 'No es pot enviar la confirmació';
+$messages['nodeletelastidentity'] = 'No pots eliminar aquesta identitat, és l\'última.';
+$messages['addsubfolderhint'] = 'Aquesta carpeta serà creada com a subcarpeta de la seleccionada actualment';
+$messages['forbiddencharacter'] = 'El nom de carpeta conté un caràcter prohibit';
+
+?>
\ No newline at end of file
diff --git a/program/localization/cs_CZ/labels.inc b/program/localization/cs_CZ/labels.inc
new file mode 100644 (file)
index 0000000..5e8ef82
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/cz/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Martin Mrajca <martin@moonlake.cz>                            |
+ |        joe <joe@humlak.cz>                                            |
+ |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
+
+*/
+
+$labels = array();
+$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ář';
+$labels['inbox'] = 'Příchozí pošta';
+$labels['drafts'] = 'Rozepsané';
+$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['replyto'] = 'Odpověď na';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Velikost';
+$labels['priority'] = 'Priorita';
+$labels['organization'] = 'Organizace';
+$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['download'] = 'stáhnout';
+$labels['filename'] = 'Jméno přílohy';
+$labels['filesize'] = 'Velikost přílohy';
+$labels['preferhtml'] = 'Upřednostňovat HTML zobrazení';
+$labels['htmlmessage'] = 'HTML zpráva';
+$labels['prettydate'] = 'Hezčí datum';
+$labels['addtoaddressbook'] = 'Přidat do adresáře';
+$labels['sun'] = 'Ne';
+$labels['mon'] = 'Po';
+$labels['tue'] = 'Út';
+$labels['wed'] = 'St';
+$labels['thu'] = 'Čt';
+$labels['fri'] = 'Pá';
+$labels['sat'] = 'So';
+$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['today'] = 'Dnes';
+$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['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['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['markmessages'] = 'Označ zprávy';
+$labels['markread'] = 'Jako přečtené';
+$labels['markunread'] = 'Jako nepřečtené';
+$labels['select'] = 'Vybrat';
+$labels['all'] = 'Vše';
+$labels['none'] = 'Nic';
+$labels['unread'] = 'Nepřečtené';
+$labels['compact'] = 'Kompaktní';
+$labels['empty'] = 'Prázdný';
+$labels['purge'] = 'Vyprázdnit';
+$labels['quota'] = 'Využití schránky';
+$labels['unknown'] = 'neznámý';
+$labels['unlimited'] = 'neomezený';
+$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['checkspelling'] = 'Zkontrolovat pravopis';
+$labels['resumeediting'] = 'Pokračovat v úpravách';
+$labels['revertto'] = 'Přejít na';
+$labels['attachments'] = 'Přílohy';
+$labels['upload'] = 'Nahrát';
+$labels['close'] = 'Zavřít';
+$labels['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['addcc'] = 'Přidat pole "Kopie"';
+$labels['addbcc'] = 'Přidat pole "Skrytá Kopie"';
+$labels['addreplyto'] = 'Přidat pole "Odpověď"';
+$labels['mdnrequest'] = 'Odesílatel této zprávy si přeje být upozorněn na to, že jste zprávu obdrželi. Chcete přijetí zprávy potvrdit?';
+$labels['receiptread'] = 'Potvrzení o přijetí zprávy';
+$labels['yourmessage'] = 'Toto je potvrzení o přijetí Vaší zprávy';
+$labels['receiptnote'] = 'Poznámka: Toto potvrzení negarantuje, že zpráva byla příjemce přečtena a že porozuměl jejímu obsahu.';
+$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['folder'] = 'Složka';
+$labels['folders'] = 'Složky';
+$labels['foldername'] = 'Jméno složky';
+$labels['subscribed'] = 'Vybráno';
+$labels['messagecount'] = 'Počet zpráv';
+$labels['create'] = 'Vytvořit';
+$labels['createfolder'] = 'Vytvořit novou složku';
+$labels['rename'] = 'Přejmenovat';
+$labels['renamefolder'] = 'Přejmenovat složku';
+$labels['deletefolder'] = 'Smazat složku';
+$labels['managefolders'] = 'Spravovat složky';
+$labels['sortby'] = 'Seřadit podle';
+$labels['sortasc'] = 'Seřadit vzestupně';
+$labels['sortdesc'] = 'Seřadit sestupně';
+
+?>
\ No newline at end of file
diff --git a/program/localization/cs_CZ/messages.inc b/program/localization/cs_CZ/messages.inc
new file mode 100644 (file)
index 0000000..20c5d48
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/cz/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Martin Mrajca <martin@moonlake.cz>                            |
+ |        joe <joe@humlak.cz>                                            |
+ |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
+
+*/
+
+$messages = array();
+$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['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['nopagesizewarning'] = 'Zadejte, prosím, velikost stránky';
+$messages['norecipientwarning'] = 'Zadejte, prosím, alespoň jednoho příjemce';
+$messages['nosubjectwarning'] = 'Předmět nebyl vyplňen. Přejete si jej zadat nyní?';
+$messages['nobodywarning'] = 'Opravdu chtete odeslat prázdnou zprávu?';
+$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['searchsuccessful'] = '$nr zpráv nalezeno';
+$messages['searchnomatch'] = 'Nenalezena žádná zpráva';
+$messages['searching'] = 'Vyhledávám...';
+$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';
+$messages['filesizeerror'] = 'Soubor přesáhl maximální velikost $size';
+$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...';
+$messages['receiptsent'] = 'Potvrzení o přřijetí zprávy odesláno';
+$messages['errorsendingreceipt'] = 'Potvrzení o přijetí zprávy nebylo možné odeslat';
+$messages['nodeletelastidentity'] = 'Alespoň jedna identita musí být ponechána. Identitu nelze odstranit.';
+$messages['addsubfolderhint'] = 'Tato složka bude vytvořena jako podsložka aktuálně zvolené složky';
+
+?>
\ No newline at end of file
diff --git a/program/localization/cz/labels.inc b/program/localization/cz/labels.inc
deleted file mode 100644 (file)
index 5e8ef82..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/cz/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Martin Mrajca <martin@moonlake.cz>                            |
- |        joe <joe@humlak.cz>                                            |
- |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
-
-*/
-
-$labels = array();
-$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ář';
-$labels['inbox'] = 'Příchozí pošta';
-$labels['drafts'] = 'Rozepsané';
-$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['replyto'] = 'Odpověď na';
-$labels['date'] = 'Datum';
-$labels['size'] = 'Velikost';
-$labels['priority'] = 'Priorita';
-$labels['organization'] = 'Organizace';
-$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['download'] = 'stáhnout';
-$labels['filename'] = 'Jméno přílohy';
-$labels['filesize'] = 'Velikost přílohy';
-$labels['preferhtml'] = 'Upřednostňovat HTML zobrazení';
-$labels['htmlmessage'] = 'HTML zpráva';
-$labels['prettydate'] = 'Hezčí datum';
-$labels['addtoaddressbook'] = 'Přidat do adresáře';
-$labels['sun'] = 'Ne';
-$labels['mon'] = 'Po';
-$labels['tue'] = 'Út';
-$labels['wed'] = 'St';
-$labels['thu'] = 'Čt';
-$labels['fri'] = 'Pá';
-$labels['sat'] = 'So';
-$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['today'] = 'Dnes';
-$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['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['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['markmessages'] = 'Označ zprávy';
-$labels['markread'] = 'Jako přečtené';
-$labels['markunread'] = 'Jako nepřečtené';
-$labels['select'] = 'Vybrat';
-$labels['all'] = 'Vše';
-$labels['none'] = 'Nic';
-$labels['unread'] = 'Nepřečtené';
-$labels['compact'] = 'Kompaktní';
-$labels['empty'] = 'Prázdný';
-$labels['purge'] = 'Vyprázdnit';
-$labels['quota'] = 'Využití schránky';
-$labels['unknown'] = 'neznámý';
-$labels['unlimited'] = 'neomezený';
-$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['checkspelling'] = 'Zkontrolovat pravopis';
-$labels['resumeediting'] = 'Pokračovat v úpravách';
-$labels['revertto'] = 'Přejít na';
-$labels['attachments'] = 'Přílohy';
-$labels['upload'] = 'Nahrát';
-$labels['close'] = 'Zavřít';
-$labels['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['addcc'] = 'Přidat pole "Kopie"';
-$labels['addbcc'] = 'Přidat pole "Skrytá Kopie"';
-$labels['addreplyto'] = 'Přidat pole "Odpověď"';
-$labels['mdnrequest'] = 'Odesílatel této zprávy si přeje být upozorněn na to, že jste zprávu obdrželi. Chcete přijetí zprávy potvrdit?';
-$labels['receiptread'] = 'Potvrzení o přijetí zprávy';
-$labels['yourmessage'] = 'Toto je potvrzení o přijetí Vaší zprávy';
-$labels['receiptnote'] = 'Poznámka: Toto potvrzení negarantuje, že zpráva byla příjemce přečtena a že porozuměl jejímu obsahu.';
-$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['folder'] = 'Složka';
-$labels['folders'] = 'Složky';
-$labels['foldername'] = 'Jméno složky';
-$labels['subscribed'] = 'Vybráno';
-$labels['messagecount'] = 'Počet zpráv';
-$labels['create'] = 'Vytvořit';
-$labels['createfolder'] = 'Vytvořit novou složku';
-$labels['rename'] = 'Přejmenovat';
-$labels['renamefolder'] = 'Přejmenovat složku';
-$labels['deletefolder'] = 'Smazat složku';
-$labels['managefolders'] = 'Spravovat složky';
-$labels['sortby'] = 'Seřadit podle';
-$labels['sortasc'] = 'Seřadit vzestupně';
-$labels['sortdesc'] = 'Seřadit sestupně';
-
-?>
\ No newline at end of file
diff --git a/program/localization/cz/messages.inc b/program/localization/cz/messages.inc
deleted file mode 100644 (file)
index 20c5d48..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/cz/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Martin Mrajca <martin@moonlake.cz>                            |
- |        joe <joe@humlak.cz>                                            |
- |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
-
-*/
-
-$messages = array();
-$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['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['nopagesizewarning'] = 'Zadejte, prosím, velikost stránky';
-$messages['norecipientwarning'] = 'Zadejte, prosím, alespoň jednoho příjemce';
-$messages['nosubjectwarning'] = 'Předmět nebyl vyplňen. Přejete si jej zadat nyní?';
-$messages['nobodywarning'] = 'Opravdu chtete odeslat prázdnou zprávu?';
-$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['searchsuccessful'] = '$nr zpráv nalezeno';
-$messages['searchnomatch'] = 'Nenalezena žádná zpráva';
-$messages['searching'] = 'Vyhledávám...';
-$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';
-$messages['filesizeerror'] = 'Soubor přesáhl maximální velikost $size';
-$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...';
-$messages['receiptsent'] = 'Potvrzení o přřijetí zprávy odesláno';
-$messages['errorsendingreceipt'] = 'Potvrzení o přijetí zprávy nebylo možné odeslat';
-$messages['nodeletelastidentity'] = 'Alespoň jedna identita musí být ponechána. Identitu nelze odstranit.';
-$messages['addsubfolderhint'] = 'Tato složka bude vytvořena jako podsložka aktuálně zvolené složky';
-
-?>
\ No newline at end of file
diff --git a/program/localization/da/labels.inc b/program/localization/da/labels.inc
deleted file mode 100644 (file)
index a326658..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/da/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Martin Moeller <martin@liga.dk>                               |
- |         Jesper R. Meyer <jrm@upthere.dk>                              |
- |         Søren Aggeboe <soren@aggeboe.dk>                              |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Velkommen til $product';
-$labels['username'] = 'Brugernavn';
-$labels['password'] = 'Adgangskode';
-$labels['server'] = 'Server';
-$labels['login'] = 'Log på';
-$labels['logout'] = 'Log af';
-$labels['mail'] = 'E-mail';
-$labels['settings'] = 'Personlige indstillinger';
-$labels['addressbook'] = 'Adressebog';
-$labels['inbox'] = 'Indbakke';
-$labels['drafts'] = 'Kladder';
-$labels['sent'] = 'Sendt post';
-$labels['trash'] = 'Skrald';
-$labels['junk'] = 'Ragelse';
-$labels['subject'] = 'Emne';
-$labels['from'] = 'Afsender';
-$labels['to'] = 'Modtager';
-$labels['cc'] = 'Kopi til';
-$labels['bcc'] = 'BCC';
-$labels['replyto'] = 'Svar til';
-$labels['date'] = 'Dato';
-$labels['size'] = 'Størrelse';
-$labels['priority'] = 'Prioritet';
-$labels['organization'] = 'Organisation';
-$labels['reply-to'] = 'Svar til';
-$labels['mailboxlist'] = 'Mapper';
-$labels['messagesfromto'] = 'Beskeder $from til $to af $count';
-$labels['messagenrof'] = 'Besked $nr af $count';
-$labels['moveto'] = 'flyt til...';
-$labels['download'] = 'download';
-$labels['filename'] = 'Filnavn';
-$labels['filesize'] = 'Filstørrelse';
-$labels['preferhtml'] = 'Foretræk HTML';
-$labels['htmlmessage'] = 'HTML-besked';
-$labels['prettydate'] = 'Pæn datovisning';
-$labels['addtoaddressbook'] = 'Tilføj til adressebogen';
-$labels['sun'] = 'Søn';
-$labels['mon'] = 'Man';
-$labels['tue'] = 'Tir';
-$labels['wed'] = 'Ons';
-$labels['thu'] = 'Tor';
-$labels['fri'] = 'Fre';
-$labels['sat'] = 'Lør';
-$labels['sunday'] = 'Søndag';
-$labels['monday'] = 'Mandag';
-$labels['tuesday'] = 'Tirsdag';
-$labels['wednesday'] = 'Onsdag';
-$labels['thursday'] = 'Torsdag';
-$labels['friday'] = 'Fredag';
-$labels['saturday'] = 'Lørdag';
-$labels['today'] = 'I dag';
-$labels['checkmail'] = 'Se efter nye beskeder';
-$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'] = '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';
-$labels['firstmessage'] = 'Vis første besked';
-$labels['firstmessages'] = 'Vis første sæt beskeder';
-$labels['nextmessage'] = 'Vis næste besked';
-$labels['nextmessages'] = 'Vis næste sæt beskeder';
-$labels['lastmessage'] = 'Vis sidste besked';
-$labels['lastmessages'] = 'Vis sidste sæt beskeder';
-$labels['backtolist'] = 'Tilbage til beskedlisten';
-$labels['viewsource'] = 'Vis rå besked';
-$labels['markmessages'] = 'Markér beskeder';
-$labels['markread'] = 'Som læst';
-$labels['markunread'] = 'Som ulæst';
-$labels['select'] = 'Vælg';
-$labels['all'] = 'Alle';
-$labels['none'] = 'Ingen';
-$labels['unread'] = 'Ulæste';
-$labels['compact'] = 'Ryd op';
-$labels['empty'] = 'Tøm';
-$labels['purge'] = 'Udrens';
-$labels['quota'] = 'Disk forbrug';
-$labels['unknown'] = 'ukendt';
-$labels['unlimited'] = 'ubegrænset';
-$labels['quicksearch'] = 'Hurtigsøgning';
-$labels['resetsearch'] = 'Nulstil søgning';
-$labels['compose'] = 'Forfat en besked';
-$labels['savemessage'] = 'Gem denne kladde';
-$labels['sendmessage'] = 'Send beskeden nu';
-$labels['addattachment'] = 'Vedhæft en fil';
-$labels['charset'] = 'Tegnsæt';
-$labels['editortype'] = 'Tekstbehandler';
-$labels['returnreceipt'] = 'Anmod om kvittering';
-$labels['checkspelling'] = 'Stavekontrol';
-$labels['resumeediting'] = 'Genoptag redigering';
-$labels['revertto'] = 'Vend tilbage til';
-$labels['attachments'] = 'Vedhæftninger';
-$labels['upload'] = 'Upload';
-$labels['close'] = 'Luk';
-$labels['low'] = 'Lav';
-$labels['lowest'] = 'Lavest';
-$labels['normal'] = 'Normal';
-$labels['high'] = 'Høj';
-$labels['highest'] = 'Højest';
-$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['mdnrequest'] = 'Afsenderen af denne besked har bedt om at modtage en bekræftelse når du læser beskeden. Vil du sende kvittering for læsning?';
-$labels['receiptread'] = 'Send kvittering for læsning';
-$labels['yourmessage'] = 'Dette er en kvittering for at din besked er blevet vist';
-$labels['receiptnote'] = 'Bemærk: Denne kvittering bekræfter udelukkende at beskeden blev vist på modtagerens computer. Der er ingen garanti for at modtageren har læst eller forstået beskedens indhold.';
-$labels['name'] = 'Vist navn';
-$labels['firstname'] = 'Fornavn';
-$labels['surname'] = 'Efternavn';
-$labels['email'] = 'E-mail';
-$labels['addcontact'] = 'Tilføj en ny kontakt';
-$labels['editcontact'] = 'Redigér kontakt';
-$labels['edit'] = 'Redigér';
-$labels['cancel'] = 'Afbryd';
-$labels['save'] = 'Gem';
-$labels['delete'] = 'Slet';
-$labels['newcontact'] = 'Opret nyt kontaktkort';
-$labels['deletecontact'] = 'Slet valgte kontakter';
-$labels['composeto'] = 'Skriv brev til';
-$labels['contactsfromto'] = 'Kontakter $from til $to af $count';
-$labels['print'] = 'Print';
-$labels['export'] = 'Eksport';
-$labels['previouspage'] = 'Vis forrige sæt';
-$labels['firstpage'] = 'Vis første sæt';
-$labels['nextpage'] = 'Vis næste sæt';
-$labels['lastpage'] = 'Vis sidste sæt';
-$labels['groups'] = 'Grupper';
-$labels['personaladrbook'] = 'Personlige Adresser';
-$labels['settingsfor'] = 'Indstillinger for';
-$labels['preferences'] = 'Præferencer';
-$labels['userpreferences'] = 'Brugerpræferencer';
-$labels['editpreferences'] = 'Redigér brugerpræferencer';
-$labels['identities'] = 'Identiteter';
-$labels['manageidentities'] = 'Styr identiteterne for denne konto';
-$labels['newidentity'] = 'Ny identitet';
-$labels['newitem'] = 'Nyt punkt';
-$labels['edititem'] = 'Redigér punkt';
-$labels['setdefault'] = 'Sæt standard';
-$labels['language'] = 'Sprog';
-$labels['timezone'] = 'Tidszone';
-$labels['pagesize'] = 'Rækker per side';
-$labels['signature'] = 'Signatur';
-$labels['dstactive'] = 'Sommertid';
-$labels['htmleditor'] = 'Skriv HTML-besked';
-$labels['htmlsignature'] = 'HTML-signatur';
-$labels['previewpane'] = 'Forhåndsvisning';
-$labels['autosavedraft'] = 'Gem kladde automatisk';
-$labels['everynminutes'] = 'hver $n. minut';
-$labels['never'] = 'aldrig';
-$labels['folder'] = 'Mappe';
-$labels['folders'] = 'Mapper';
-$labels['foldername'] = 'Mappenavn';
-$labels['subscribed'] = 'Abonneret';
-$labels['messagecount'] = 'Beskeder';
-$labels['create'] = 'Opret';
-$labels['createfolder'] = 'Opret ny mappe';
-$labels['rename'] = 'Omdøb';
-$labels['renamefolder'] = 'Omdøb mappe';
-$labels['deletefolder'] = 'Slet mappe';
-$labels['managefolders'] = 'Administrér mapper';
-$labels['sortby'] = 'Sortér efter';
-$labels['sortasc'] = 'Ældste først';
-$labels['sortdesc'] = 'Nyeste først';
-
-?>
diff --git a/program/localization/da/messages.inc b/program/localization/da/messages.inc
deleted file mode 100644 (file)
index d960380..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/da/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author : Martin Moeller <martin@liga.dk>                              |
- |         Jesper R. Meyer <jesper@upthere.dk>                           |
- |         Søren Aggeboe <soren@aggeboe.dk>                              |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Det lykkedes ikke at logge på';
-$messages['cookiesdisabled'] = 'Din browser accepterer ikke cookies';
-$messages['sessionerror'] = 'Din session er ugyldig eller udløbet';
-$messages['imaperror'] = 'Forbindelse til IMAP serveren fejlede';
-$messages['nomessagesfound'] = 'Der blev ikke fundet nogen beskeder i denne postkasse';
-$messages['loggedout'] = 'Du er nu logget af webmail. Farvel så længe!';
-$messages['mailboxempty'] = 'Postkassen er tom!';
-$messages['loading'] = 'Indlæser...';
-$messages['loadingdata'] = 'Indlæser data...';
-$messages['checkingmail'] = 'Tjekker for nye beskeder...';
-$messages['sendingmessage'] = 'Sender besked...';
-$messages['messagesent'] = 'Beskeden blev sendt korrekt';
-$messages['savingmessage'] = 'Gemmer besked...';
-$messages['messagesaved'] = 'Beskeden er gemt i kladdemappen';
-$messages['successfullysaved'] = 'Det lykkedes at gemme';
-$messages['addedsuccessfully'] = 'Kontakten blev tilføjet adressebogen';
-$messages['contactexists'] = 'Der er allerede en kontakt med denne e-mail adresse';
-$messages['blockedimages'] = 'For at beskytte dit privatliv er billeder fra internetservere blokeret i denne besked.';
-$messages['encryptedmessage'] = 'Beskeden er krypteret og kan ikke vises. Beklager!';
-$messages['nocontactsfound'] = 'Ingen kontakter blev fundet';
-$messages['contactnotfound'] = 'Den søgte kontakt blev ikke fundet';
-$messages['sendingfailed'] = 'Beskeden kunne ikke sendes';
-$messages['errorsaving'] = 'Der opstod en fejl ved lagring af data';
-$messages['errormoving'] = 'Beskeden kunne ikke flyttes';
-$messages['errordeleting'] = 'Beskeden kunne ikke slettes';
-$messages['deletecontactconfirm'] = 'Vil du virkelig slette den/de valgte kontakt(er)?';
-$messages['deletemessagesconfirm'] = 'Vil du virkelig slette den/de valgte besked(er)?';
-$messages['deletefolderconfirm'] = 'Vil du virkelig slette den valgte mappe';
-$messages['purgefolderconfirm'] = 'Vil du virkelig slette alle beskeder i denne mappe?';
-$messages['formincomplete'] = 'Formularen var ikke fuldstændig fyldt ud';
-$messages['noemailwarning'] = 'Indtast venligst en gyldig e-mail adresse';
-$messages['nonamewarning'] = 'Angiv venligst et navn';
-$messages['nopagesizewarning'] = 'Angiv sidestørrelsen';
-$messages['norecipientwarning'] = 'Indtast mindst én modtager';
-$messages['nosubjectwarning'] = '\'Emne\'-feltet er tomt. Kunne du tænke dig at skrive et nu?';
-$messages['nobodywarning'] = 'Send denne besked uden tekst?';
-$messages['notsentwarning'] = 'Beskeden er ikke blevet sendt. Vil du kassere din besked?';
-$messages['noldapserver'] = 'Vælg venligst hvilken LDAP-server der skal søges i';
-$messages['nocontactsreturned'] = 'Ingen kontakter blev fundet';
-$messages['nosearchname'] = 'Indtast venligst en kontakts navn eller e-mail adresse';
-$messages['searchsuccessful'] = 'Fandt $nr beskeder';
-$messages['searchnomatch'] = 'Søgningen fandt ingen beskeder';
-$messages['searching'] = 'Søger...';
-$messages['checking'] = 'Tjekker...';
-$messages['nospellerrors'] = 'Ingen stavefejl fundet';
-$messages['folderdeleted'] = 'Mappen er slettet';
-$messages['deletedsuccessfully'] = 'Slettet';
-$messages['converting'] = 'Fjerner formatering fra besked...';
-$messages['messageopenerror'] = 'Beskeden kunne ikke hentes fra serveren';
-$messages['fileuploaderror'] = 'Den indsatte fil fejlede';
-$messages['filesizeerror'] = 'Den indsatte fil fylder mere end det maksimale på $size';
-$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...';
-$messages['receiptsent'] = 'Kvittering for læsning er sendt';
-$messages['errorsendingreceipt'] = 'Kvitteringen kunne ikke sendes';
-$messages['nodeletelastidentity'] = 'Du kan ikke slette denne identitet, da det er den eneste der er tilbage.';
-$messages['addsubfolderhint'] = 'Denne mappe vil blive oprettet som en undermappe af den der er valgt i øjeblikket.';
-
-?>
diff --git a/program/localization/da_DK/labels.inc b/program/localization/da_DK/labels.inc
new file mode 100644 (file)
index 0000000..a326658
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/da/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Martin Moeller <martin@liga.dk>                               |
+ |         Jesper R. Meyer <jrm@upthere.dk>                              |
+ |         Søren Aggeboe <soren@aggeboe.dk>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Velkommen til $product';
+$labels['username'] = 'Brugernavn';
+$labels['password'] = 'Adgangskode';
+$labels['server'] = 'Server';
+$labels['login'] = 'Log på';
+$labels['logout'] = 'Log af';
+$labels['mail'] = 'E-mail';
+$labels['settings'] = 'Personlige indstillinger';
+$labels['addressbook'] = 'Adressebog';
+$labels['inbox'] = 'Indbakke';
+$labels['drafts'] = 'Kladder';
+$labels['sent'] = 'Sendt post';
+$labels['trash'] = 'Skrald';
+$labels['junk'] = 'Ragelse';
+$labels['subject'] = 'Emne';
+$labels['from'] = 'Afsender';
+$labels['to'] = 'Modtager';
+$labels['cc'] = 'Kopi til';
+$labels['bcc'] = 'BCC';
+$labels['replyto'] = 'Svar til';
+$labels['date'] = 'Dato';
+$labels['size'] = 'Størrelse';
+$labels['priority'] = 'Prioritet';
+$labels['organization'] = 'Organisation';
+$labels['reply-to'] = 'Svar til';
+$labels['mailboxlist'] = 'Mapper';
+$labels['messagesfromto'] = 'Beskeder $from til $to af $count';
+$labels['messagenrof'] = 'Besked $nr af $count';
+$labels['moveto'] = 'flyt til...';
+$labels['download'] = 'download';
+$labels['filename'] = 'Filnavn';
+$labels['filesize'] = 'Filstørrelse';
+$labels['preferhtml'] = 'Foretræk HTML';
+$labels['htmlmessage'] = 'HTML-besked';
+$labels['prettydate'] = 'Pæn datovisning';
+$labels['addtoaddressbook'] = 'Tilføj til adressebogen';
+$labels['sun'] = 'Søn';
+$labels['mon'] = 'Man';
+$labels['tue'] = 'Tir';
+$labels['wed'] = 'Ons';
+$labels['thu'] = 'Tor';
+$labels['fri'] = 'Fre';
+$labels['sat'] = 'Lør';
+$labels['sunday'] = 'Søndag';
+$labels['monday'] = 'Mandag';
+$labels['tuesday'] = 'Tirsdag';
+$labels['wednesday'] = 'Onsdag';
+$labels['thursday'] = 'Torsdag';
+$labels['friday'] = 'Fredag';
+$labels['saturday'] = 'Lørdag';
+$labels['today'] = 'I dag';
+$labels['checkmail'] = 'Se efter nye beskeder';
+$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'] = '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';
+$labels['firstmessage'] = 'Vis første besked';
+$labels['firstmessages'] = 'Vis første sæt beskeder';
+$labels['nextmessage'] = 'Vis næste besked';
+$labels['nextmessages'] = 'Vis næste sæt beskeder';
+$labels['lastmessage'] = 'Vis sidste besked';
+$labels['lastmessages'] = 'Vis sidste sæt beskeder';
+$labels['backtolist'] = 'Tilbage til beskedlisten';
+$labels['viewsource'] = 'Vis rå besked';
+$labels['markmessages'] = 'Markér beskeder';
+$labels['markread'] = 'Som læst';
+$labels['markunread'] = 'Som ulæst';
+$labels['select'] = 'Vælg';
+$labels['all'] = 'Alle';
+$labels['none'] = 'Ingen';
+$labels['unread'] = 'Ulæste';
+$labels['compact'] = 'Ryd op';
+$labels['empty'] = 'Tøm';
+$labels['purge'] = 'Udrens';
+$labels['quota'] = 'Disk forbrug';
+$labels['unknown'] = 'ukendt';
+$labels['unlimited'] = 'ubegrænset';
+$labels['quicksearch'] = 'Hurtigsøgning';
+$labels['resetsearch'] = 'Nulstil søgning';
+$labels['compose'] = 'Forfat en besked';
+$labels['savemessage'] = 'Gem denne kladde';
+$labels['sendmessage'] = 'Send beskeden nu';
+$labels['addattachment'] = 'Vedhæft en fil';
+$labels['charset'] = 'Tegnsæt';
+$labels['editortype'] = 'Tekstbehandler';
+$labels['returnreceipt'] = 'Anmod om kvittering';
+$labels['checkspelling'] = 'Stavekontrol';
+$labels['resumeediting'] = 'Genoptag redigering';
+$labels['revertto'] = 'Vend tilbage til';
+$labels['attachments'] = 'Vedhæftninger';
+$labels['upload'] = 'Upload';
+$labels['close'] = 'Luk';
+$labels['low'] = 'Lav';
+$labels['lowest'] = 'Lavest';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Høj';
+$labels['highest'] = 'Højest';
+$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['mdnrequest'] = 'Afsenderen af denne besked har bedt om at modtage en bekræftelse når du læser beskeden. Vil du sende kvittering for læsning?';
+$labels['receiptread'] = 'Send kvittering for læsning';
+$labels['yourmessage'] = 'Dette er en kvittering for at din besked er blevet vist';
+$labels['receiptnote'] = 'Bemærk: Denne kvittering bekræfter udelukkende at beskeden blev vist på modtagerens computer. Der er ingen garanti for at modtageren har læst eller forstået beskedens indhold.';
+$labels['name'] = 'Vist navn';
+$labels['firstname'] = 'Fornavn';
+$labels['surname'] = 'Efternavn';
+$labels['email'] = 'E-mail';
+$labels['addcontact'] = 'Tilføj en ny kontakt';
+$labels['editcontact'] = 'Redigér kontakt';
+$labels['edit'] = 'Redigér';
+$labels['cancel'] = 'Afbryd';
+$labels['save'] = 'Gem';
+$labels['delete'] = 'Slet';
+$labels['newcontact'] = 'Opret nyt kontaktkort';
+$labels['deletecontact'] = 'Slet valgte kontakter';
+$labels['composeto'] = 'Skriv brev til';
+$labels['contactsfromto'] = 'Kontakter $from til $to af $count';
+$labels['print'] = 'Print';
+$labels['export'] = 'Eksport';
+$labels['previouspage'] = 'Vis forrige sæt';
+$labels['firstpage'] = 'Vis første sæt';
+$labels['nextpage'] = 'Vis næste sæt';
+$labels['lastpage'] = 'Vis sidste sæt';
+$labels['groups'] = 'Grupper';
+$labels['personaladrbook'] = 'Personlige Adresser';
+$labels['settingsfor'] = 'Indstillinger for';
+$labels['preferences'] = 'Præferencer';
+$labels['userpreferences'] = 'Brugerpræferencer';
+$labels['editpreferences'] = 'Redigér brugerpræferencer';
+$labels['identities'] = 'Identiteter';
+$labels['manageidentities'] = 'Styr identiteterne for denne konto';
+$labels['newidentity'] = 'Ny identitet';
+$labels['newitem'] = 'Nyt punkt';
+$labels['edititem'] = 'Redigér punkt';
+$labels['setdefault'] = 'Sæt standard';
+$labels['language'] = 'Sprog';
+$labels['timezone'] = 'Tidszone';
+$labels['pagesize'] = 'Rækker per side';
+$labels['signature'] = 'Signatur';
+$labels['dstactive'] = 'Sommertid';
+$labels['htmleditor'] = 'Skriv HTML-besked';
+$labels['htmlsignature'] = 'HTML-signatur';
+$labels['previewpane'] = 'Forhåndsvisning';
+$labels['autosavedraft'] = 'Gem kladde automatisk';
+$labels['everynminutes'] = 'hver $n. minut';
+$labels['never'] = 'aldrig';
+$labels['folder'] = 'Mappe';
+$labels['folders'] = 'Mapper';
+$labels['foldername'] = 'Mappenavn';
+$labels['subscribed'] = 'Abonneret';
+$labels['messagecount'] = 'Beskeder';
+$labels['create'] = 'Opret';
+$labels['createfolder'] = 'Opret ny mappe';
+$labels['rename'] = 'Omdøb';
+$labels['renamefolder'] = 'Omdøb mappe';
+$labels['deletefolder'] = 'Slet mappe';
+$labels['managefolders'] = 'Administrér mapper';
+$labels['sortby'] = 'Sortér efter';
+$labels['sortasc'] = 'Ældste først';
+$labels['sortdesc'] = 'Nyeste først';
+
+?>
diff --git a/program/localization/da_DK/messages.inc b/program/localization/da_DK/messages.inc
new file mode 100644 (file)
index 0000000..d960380
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/da/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author : Martin Moeller <martin@liga.dk>                              |
+ |         Jesper R. Meyer <jesper@upthere.dk>                           |
+ |         Søren Aggeboe <soren@aggeboe.dk>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Det lykkedes ikke at logge på';
+$messages['cookiesdisabled'] = 'Din browser accepterer ikke cookies';
+$messages['sessionerror'] = 'Din session er ugyldig eller udløbet';
+$messages['imaperror'] = 'Forbindelse til IMAP serveren fejlede';
+$messages['nomessagesfound'] = 'Der blev ikke fundet nogen beskeder i denne postkasse';
+$messages['loggedout'] = 'Du er nu logget af webmail. Farvel så længe!';
+$messages['mailboxempty'] = 'Postkassen er tom!';
+$messages['loading'] = 'Indlæser...';
+$messages['loadingdata'] = 'Indlæser data...';
+$messages['checkingmail'] = 'Tjekker for nye beskeder...';
+$messages['sendingmessage'] = 'Sender besked...';
+$messages['messagesent'] = 'Beskeden blev sendt korrekt';
+$messages['savingmessage'] = 'Gemmer besked...';
+$messages['messagesaved'] = 'Beskeden er gemt i kladdemappen';
+$messages['successfullysaved'] = 'Det lykkedes at gemme';
+$messages['addedsuccessfully'] = 'Kontakten blev tilføjet adressebogen';
+$messages['contactexists'] = 'Der er allerede en kontakt med denne e-mail adresse';
+$messages['blockedimages'] = 'For at beskytte dit privatliv er billeder fra internetservere blokeret i denne besked.';
+$messages['encryptedmessage'] = 'Beskeden er krypteret og kan ikke vises. Beklager!';
+$messages['nocontactsfound'] = 'Ingen kontakter blev fundet';
+$messages['contactnotfound'] = 'Den søgte kontakt blev ikke fundet';
+$messages['sendingfailed'] = 'Beskeden kunne ikke sendes';
+$messages['errorsaving'] = 'Der opstod en fejl ved lagring af data';
+$messages['errormoving'] = 'Beskeden kunne ikke flyttes';
+$messages['errordeleting'] = 'Beskeden kunne ikke slettes';
+$messages['deletecontactconfirm'] = 'Vil du virkelig slette den/de valgte kontakt(er)?';
+$messages['deletemessagesconfirm'] = 'Vil du virkelig slette den/de valgte besked(er)?';
+$messages['deletefolderconfirm'] = 'Vil du virkelig slette den valgte mappe';
+$messages['purgefolderconfirm'] = 'Vil du virkelig slette alle beskeder i denne mappe?';
+$messages['formincomplete'] = 'Formularen var ikke fuldstændig fyldt ud';
+$messages['noemailwarning'] = 'Indtast venligst en gyldig e-mail adresse';
+$messages['nonamewarning'] = 'Angiv venligst et navn';
+$messages['nopagesizewarning'] = 'Angiv sidestørrelsen';
+$messages['norecipientwarning'] = 'Indtast mindst én modtager';
+$messages['nosubjectwarning'] = '\'Emne\'-feltet er tomt. Kunne du tænke dig at skrive et nu?';
+$messages['nobodywarning'] = 'Send denne besked uden tekst?';
+$messages['notsentwarning'] = 'Beskeden er ikke blevet sendt. Vil du kassere din besked?';
+$messages['noldapserver'] = 'Vælg venligst hvilken LDAP-server der skal søges i';
+$messages['nocontactsreturned'] = 'Ingen kontakter blev fundet';
+$messages['nosearchname'] = 'Indtast venligst en kontakts navn eller e-mail adresse';
+$messages['searchsuccessful'] = 'Fandt $nr beskeder';
+$messages['searchnomatch'] = 'Søgningen fandt ingen beskeder';
+$messages['searching'] = 'Søger...';
+$messages['checking'] = 'Tjekker...';
+$messages['nospellerrors'] = 'Ingen stavefejl fundet';
+$messages['folderdeleted'] = 'Mappen er slettet';
+$messages['deletedsuccessfully'] = 'Slettet';
+$messages['converting'] = 'Fjerner formatering fra besked...';
+$messages['messageopenerror'] = 'Beskeden kunne ikke hentes fra serveren';
+$messages['fileuploaderror'] = 'Den indsatte fil fejlede';
+$messages['filesizeerror'] = 'Den indsatte fil fylder mere end det maksimale på $size';
+$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...';
+$messages['receiptsent'] = 'Kvittering for læsning er sendt';
+$messages['errorsendingreceipt'] = 'Kvitteringen kunne ikke sendes';
+$messages['nodeletelastidentity'] = 'Du kan ikke slette denne identitet, da det er den eneste der er tilbage.';
+$messages['addsubfolderhint'] = 'Denne mappe vil blive oprettet som en undermappe af den der er valgt i øjeblikket.';
+
+?>
index 7e16ab944fb7bf8b9f9c9cb83f8abeca82040ba2..9a35dd0f47bd8dc32dcb3431a40d49c24f708508 100644 (file)
@@ -14,7 +14,7 @@
  | Corrections: Alexander Stiebing <ja.stiebing[NOSPAM]@web.de>          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1075 2008-02-13 23:43:04Z thomasb $
+ @version $Id: labels.inc 1446 2008-05-28 21:36:42Z thomasb $
 
 */
 
@@ -89,13 +89,41 @@ $labels['thursday']  = 'Donnerstag';
 $labels['friday']    = 'Freitag';
 $labels['saturday']  = 'Samstag';
 
+// months short
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mär';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'Mai';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dez';
+
+// months long
+$labels['longjan'] = 'Januar';
+$labels['longfeb'] = 'Februar';
+$labels['longmar'] = 'März';
+$labels['longapr'] = 'April';
+$labels['longmay'] = 'Mai';
+$labels['longjun'] = 'Juni';
+$labels['longjul'] = 'Juli';
+$labels['longaug'] = 'August';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Oktober';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'Dezember';
+
 $labels['today'] = 'Heute';
 
 // toolbar buttons // Symbolleisten-Tipps
 $labels['checkmail']        = 'Überprüfung auf neue Anzeigen';
 $labels['writenewmessage']  = 'Neue Nachricht schreiben';
 $labels['replytomessage']   = 'Antwort verfassen';
-$labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger';
+$labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger verfassen';
 $labels['forwardmessage']   = 'Nachricht weiterleiten';
 $labels['deletemessage']    = 'Nachricht löschen';
 $labels['movemessagetotrash'] = 'Nachricht in den Papierkorb verschieben';
@@ -224,6 +252,18 @@ $labels['htmleditor'] = 'HTML-Nachrichten verfassen';
 $labels['htmlsignature'] = 'HTML-Signatur';
 $labels['previewpane'] = 'Nachrichtenvorschau anzeigen';
 
+$labels['logoutclear'] = 'Papierkorb beim Abmelden leeren';
+$labels['logoutcompact'] = 'Posteingang beim Abmleden packen';
+$labels['uisettings'] = 'Benutzeroberfläche';
+$labels['serversettings'] = 'Server-Einstellungen';
+$labels['mailboxview'] = 'Mailbox-Ansicht';
+$labels['mdnrequests'] = 'Lesebestätigung senden';
+$labels['askuser'] = 'immer fragen';
+$labels['autosend'] = 'automatisch senden';
+$labels['ignore'] = 'ignorieren';
+$labels['readwhendeleted'] = 'Beim Löschen als gelesen markieren';
+$labels['flagfordeletion'] = 'Als gelöscht markieren wenn kein Papierkorb';
+
 $labels['autosavedraft']  = 'Entwurf autom. speichern';
 $labels['everynminutes']  = 'alle $n Minuten';
 $labels['never']  = 'nie';
index 492fd61d0a46b365828ae1d50efe331f04753797..f3eae04177560070a56dc9c9178314e0bb076332 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 1075 2008-02-13 23:43:04Z thomasb $
+ @version $Id: messages.inc 1456 2008-05-30 13:27:13Z thomasb $
 
 */
 
@@ -81,5 +81,6 @@ $messages['errorsendingreceipt'] = 'Bestätigung konnte nicht gesendet werden';
 
 $messages['nodeletelastidentity'] = 'Sie können diesen Absender nicht löschen';
 $messages['addsubfolderhint'] = 'Wird als Unterdornder des aktuell selektieren Ordners erstellt';
+$messages['forbiddencharacter'] = 'Der Ordnername enthält ein ungültiges Zeichen';
 
 ?>
\ No newline at end of file
index 9181bc2bd2851c08561a1c4d76d40ad8755fe392..c6a846e77c85a75440e72a1b8ba5809491398278 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Marcel Schlesinger <info@marcel-schlesinger.de>               |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1107 2008-02-17 18:32:46Z thomasb $
+ @version $Id: labels.inc 1446 2008-05-28 21:36:42Z thomasb $
 
 */
 
@@ -68,11 +68,35 @@ $labels['wednesday'] = 'Mittwoch';
 $labels['thursday'] = 'Donnerstag';
 $labels['friday'] = 'Freitag';
 $labels['saturday'] = 'Samstag';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mär';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'Mai';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dez';
+$labels['longjan'] = 'Januar';
+$labels['longfeb'] = 'Februar';
+$labels['longmar'] = 'März';
+$labels['longapr'] = 'April';
+$labels['longmay'] = 'Mai';
+$labels['longjun'] = 'Juni';
+$labels['longjul'] = 'Juli';
+$labels['longaug'] = 'August';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Oktober';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'Dezember';
 $labels['today'] = 'Heute';
 $labels['checkmail'] = 'Auf neue Nachrichten überprüfen';
 $labels['writenewmessage'] = 'Neue Nachricht schreiben';
 $labels['replytomessage'] = 'Antwort verfassen';
-$labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger';
+$labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger verfassen';
 $labels['forwardmessage'] = 'Nachricht weiterleiten';
 $labels['deletemessage'] = 'Nachricht löschen';
 $labels['movemessagetotrash'] = 'Nachricht in den Papierkorb verschieben';
@@ -171,6 +195,17 @@ $labels['dstactive'] = 'Sommerzeit';
 $labels['htmleditor'] = 'HTML-Nachrichten erstellen';
 $labels['htmlsignature'] = 'HTML-Signatur';
 $labels['previewpane'] = 'Vorschaufenster anzeigen';
+$labels['logoutclear'] = 'Papierkorb beim Abmelden leeren';
+$labels['logoutcompact'] = 'Posteingang beim Abmleden packen';
+$labels['uisettings'] = 'Benutzeroberfläche';
+$labels['serversettings'] = 'Server-Einstellungen';
+$labels['mailboxview'] = 'Mailbox-Ansicht';
+$labels['mdnrequests'] = 'Lesebestätigung senden';
+$labels['askuser'] = 'immer fragen';
+$labels['autosend'] = 'automatisch senden';
+$labels['ignore'] = 'ignorieren';
+$labels['readwhendeleted'] = 'Beim Löschen als gelesen markieren';
+$labels['flagfordeletion'] = 'Als gelöscht markieren wenn kein Papierkorb';
 $labels['autosavedraft'] = 'Entwurf automatisch speichern';
 $labels['everynminutes'] = 'alle $n Minuten';
 $labels['never'] = 'nie';
index 002e90e86dac074c203015564980231be689d499..2e90b3e2c6b2e9385f2080955d5bce1bd21cb965 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Marcel Schlesinger <info@marcel-schlesinger.de>               |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 1107 2008-02-17 18:32:46Z thomasb $
+ @version $Id: messages.inc 1456 2008-05-30 13:27:13Z thomasb $
 
 */
 
@@ -78,5 +78,6 @@ $messages['receiptsent'] = 'Lesebestätigung erfolgreich gesendet';
 $messages['errorsendingreceipt'] = 'Bestätigung konnte nicht gesendet werden';
 $messages['nodeletelastidentity'] = 'Diese Identität kann nicht gelöscht werden, da dies die letzte ist.';
 $messages['addsubfolderhint'] = 'Wird als Unterordner des aktuell selektieren Ordners erstellt';
+$messages['forbiddencharacter'] = 'Der Ordnername enthält ein ungültiges Zeichen';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/el/labels.inc b/program/localization/el/labels.inc
deleted file mode 100644 (file)
index e3a25ad..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/el/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Jim Deves <jim@cobaltblue.gr>                                 |
- |         John Economou <hsoc@irc.gr>                                   |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Καλώς ήρθατε στο $product';
-$labels['username'] = 'Όνομα Χρήστη';
-$labels['password'] = 'Κωδικός Πρόσβασης';
-$labels['server'] = 'Διακομιστής';
-$labels['login'] = 'Είσοδος';
-$labels['logout'] = 'Έξοδος';
-$labels['mail'] = 'E-Mail';
-$labels['settings'] = 'Προσωπικές Ρυθμίσεις';
-$labels['addressbook'] = 'Βιβλίο Διευθύνσεων';
-$labels['inbox'] = 'Εισερχόμενα';
-$labels['drafts'] = 'Πρόχειρα';
-$labels['sent'] = 'Απεσταλμένα';
-$labels['trash'] = 'Κάδος';
-$labels['junk'] = 'Junk';
-$labels['subject'] = 'Θέμα';
-$labels['from'] = 'Αποστολέας';
-$labels['to'] = 'Παραλήπτης';
-$labels['cc'] = 'Αντίγραφο';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Απάντηση σε';
-$labels['date'] = 'Ημ/νία';
-$labels['size'] = 'Μέγεθος';
-$labels['priority'] = 'Πρoτεραιότητα';
-$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['movemessagetotrash'] = 'Μετακίνηση μηνύματος στον Κάδο';
-$labels['printmessage'] = 'Εκτύπωση';
-$labels['previousmessage'] = 'Εμφάνιση προηγούμενου μηνύματος';
-$labels['previousmessages'] = 'Εμφάνιση προηγούμενης ομάδας μηνυμάτων';
-$labels['firstmessage'] = 'Εμφάνιση πρώτου μυνήματος';
-$labels['firstmessages'] = 'Εμφάνιση πρώτης ομάδας μηνυμάτων';
-$labels['nextmessage'] = 'Εμφάνιση επόμενου μηνύματος';
-$labels['nextmessages'] = 'Εμφάνιση επόμενης ομάδας μηνυμάτων';
-$labels['lastmessage'] = 'Εμφάνιση τελευταίου μηνύματος';
-$labels['lastmessages'] = 'Εμφάνιση τελευταίας ομάδας μηνυμάτων';
-$labels['backtolist'] = 'Επιστροφή στη λίστα μηνυμάτων';
-$labels['viewsource'] = 'Προβολή πηγαίου κώδικα';
-$labels['markmessages'] = 'Σήμανση μηνυμάτων';
-$labels['markread'] = 'ως αναγνωσμένα';
-$labels['markunread'] = 'ως μη-αναγνωσμένα';
-$labels['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['savemessage'] = 'Αποθήκευση ως πρόχειρου';
-$labels['sendmessage'] = 'Αποστολή μηνύματος τώρα';
-$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['addcc'] = 'Προσθήκη Cc';
-$labels['addbcc'] = 'Προσθήκη Bcc';
-$labels['addreplyto'] = 'Προσθήκη Απάντηση-Σε';
-$labels['mdnrequest'] = 'Ο αποστολέας του μηνύματος έχει ζητήσει να ενημερωθεί όταν διαβάσετε αυτό το μήνυμα. Επιθυμείτε να ενημερώστε τον αποστολέα;';
-$labels['receiptread'] = 'Αναφορά (ανάγνωσης)';
-$labels['yourmessage'] = 'Αυτό είναι μια Αναφορά για το μήνυμά σας';
-$labels['receiptnote'] = 'Σημείωση: Αυτή η αναφορά επιβεβαιώνει μόνο ότι το μήνυμα εμφανίστηκε μόνο στον υπολογιστή του παραλήπτη. Δεν επιβεβαιώνει ότι ο παραλήπτης έχει διαβάσει ή έχει κατανοήσει το περιεχόμενο του μηνύματος.';
-$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'] = 'Προσωπικό Βιβλίο Διευθύνσεων';
-$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'] = 'Daylight savings';
-$labels['htmleditor'] = 'Σύνθεση HTML μηνύματος';
-$labels['htmlsignature'] = 'Υπογραφή HTML';
-$labels['previewpane'] = 'Εμφάνιση προηγούμενου παραθύρου';
-$labels['autosavedraft'] = 'Αυτόματη προχείρου';
-$labels['everynminutes'] = 'κάθε $n λεπτά';
-$labels['never'] = 'ποτέ';
-$labels['folder'] = 'Φάκελος';
-$labels['folders'] = 'Φάκελοι';
-$labels['foldername'] = 'Όνομα φακέλου';
-$labels['subscribed'] = 'Εγγραφή';
-$labels['messagecount'] = 'Μηνύματα';
-$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/el/messages.inc b/program/localization/el/messages.inc
deleted file mode 100644 (file)
index 84890e8..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/el/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Jim Deves <jim@cobaltblue.gr>                                 |
- |         John Economou <hsoc@irc.gr>                                   |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Είσοδος Απέτυχε';
-$messages['cookiesdisabled'] = 'Ο περιηγητής σας (browser) δεν αποδέχεται 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'] = 'Υπάρχει ήδη επαφή με αυτή τη διεύθυνση 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'] = 'Παρακαλώ εισάγεται έγκυρη διεύθυνση email';
-$messages['nonamewarning'] = 'Παρακαλώ εισάγεται όνομα';
-$messages['nopagesizewarning'] = 'Παρακαλώ εισάγεται μέγεθος σελίδας';
-$messages['norecipientwarning'] = 'Παρακαλώ εισάγεται τουλάχιστον έναν παραλήπτη';
-$messages['nosubjectwarning'] = 'Το πεδίο "Θέμα" είναι άδειο. Θέλετε να εισάγεται ένα τώρα;';
-$messages['nobodywarning'] = 'Αποστολή μηνύματος χωρίς κείμενο;';
-$messages['notsentwarning'] = 'Το μήνυμα δεν έχει σταλεί. Θέλετε να το απορρίψετε;';
-$messages['noldapserver'] = 'Παρακαλώ επιλέξτε έναν LDAP διακομιστή για αναζήτηση';
-$messages['nocontactsreturned'] = 'Δε βρέθηκαν επαφές';
-$messages['nosearchname'] = 'Παρακαλώ εισάγεται όνομα επαφής ή διεύθυνση email';
-$messages['searchsuccessful'] = '$nr μηνύματα βρέθηκαν';
-$messages['searchnomatch'] = 'Η Εύρεση δεν επέστρεψε αποτελέσματα';
-$messages['searching'] = 'Εύρεση...';
-$messages['checking'] = 'Έλεγχος...';
-$messages['nospellerrors'] = 'Δε βρέθηκαν ορθογραφικά λάθη';
-$messages['folderdeleted'] = 'Ο φάκελος διαγράφηκε επιτυχώς';
-$messages['deletedsuccessfully'] = 'Διαγραφή Επιτυχώς';
-$messages['converting'] = 'Μετακίνηση διαμορφώσεων κειμένου...';
-$messages['messageopenerror'] = 'Φόρτωση μηνυμάτων από τον διακομιστή απέτυχε';
-$messages['fileuploaderror'] = 'Ανέβασμα αρχείου απέτυχε';
-$messages['filesizeerror'] = 'Το ανεβασμένο αρχείο ξεπερνάει το μέγιστο μέγεθος των $size';
-$messages['copysuccess'] = 'Επιτυχή αντιγραφή $nr διευθύνσεων';
-$messages['copyerror'] = 'Αποτυχία αντιγραφής διευθύνσεων';
-$messages['sourceisreadonly'] = 'Η διεύθυνση έχει μόνο δικαίωμα ανάγνωσης';
-$messages['errorsavingcontact'] = 'Σώσιμο επαφής απέτυχε';
-$messages['movingmessage'] = 'Μετακίνηση μηνύματος...';
-$messages['receiptsent'] = 'Επιτυχής αποστολή αναφοράς ανάγνωσης';
-$messages['errorsendingreceipt'] = 'Αποστολή αναφοράς απέτυχε';
-$messages['nodeletelastidentity'] = 'Δε μπορείτε να διαγράψετε αυτήν την ταυτότητα, είναι η τελευταία.';
-$messages['addsubfolderhint'] = 'Αυτός ο φάκελος θα δημιουργηθεί ως υποφάκελος του επιλεγμένου';
-
-?>
\ No newline at end of file
diff --git a/program/localization/el_GR/labels.inc b/program/localization/el_GR/labels.inc
new file mode 100644 (file)
index 0000000..e3a25ad
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/el/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Jim Deves <jim@cobaltblue.gr>                                 |
+ |         John Economou <hsoc@irc.gr>                                   |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Καλώς ήρθατε στο $product';
+$labels['username'] = 'Όνομα Χρήστη';
+$labels['password'] = 'Κωδικός Πρόσβασης';
+$labels['server'] = 'Διακομιστής';
+$labels['login'] = 'Είσοδος';
+$labels['logout'] = 'Έξοδος';
+$labels['mail'] = 'E-Mail';
+$labels['settings'] = 'Προσωπικές Ρυθμίσεις';
+$labels['addressbook'] = 'Βιβλίο Διευθύνσεων';
+$labels['inbox'] = 'Εισερχόμενα';
+$labels['drafts'] = 'Πρόχειρα';
+$labels['sent'] = 'Απεσταλμένα';
+$labels['trash'] = 'Κάδος';
+$labels['junk'] = 'Junk';
+$labels['subject'] = 'Θέμα';
+$labels['from'] = 'Αποστολέας';
+$labels['to'] = 'Παραλήπτης';
+$labels['cc'] = 'Αντίγραφο';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Απάντηση σε';
+$labels['date'] = 'Ημ/νία';
+$labels['size'] = 'Μέγεθος';
+$labels['priority'] = 'Πρoτεραιότητα';
+$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['movemessagetotrash'] = 'Μετακίνηση μηνύματος στον Κάδο';
+$labels['printmessage'] = 'Εκτύπωση';
+$labels['previousmessage'] = 'Εμφάνιση προηγούμενου μηνύματος';
+$labels['previousmessages'] = 'Εμφάνιση προηγούμενης ομάδας μηνυμάτων';
+$labels['firstmessage'] = 'Εμφάνιση πρώτου μυνήματος';
+$labels['firstmessages'] = 'Εμφάνιση πρώτης ομάδας μηνυμάτων';
+$labels['nextmessage'] = 'Εμφάνιση επόμενου μηνύματος';
+$labels['nextmessages'] = 'Εμφάνιση επόμενης ομάδας μηνυμάτων';
+$labels['lastmessage'] = 'Εμφάνιση τελευταίου μηνύματος';
+$labels['lastmessages'] = 'Εμφάνιση τελευταίας ομάδας μηνυμάτων';
+$labels['backtolist'] = 'Επιστροφή στη λίστα μηνυμάτων';
+$labels['viewsource'] = 'Προβολή πηγαίου κώδικα';
+$labels['markmessages'] = 'Σήμανση μηνυμάτων';
+$labels['markread'] = 'ως αναγνωσμένα';
+$labels['markunread'] = 'ως μη-αναγνωσμένα';
+$labels['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['savemessage'] = 'Αποθήκευση ως πρόχειρου';
+$labels['sendmessage'] = 'Αποστολή μηνύματος τώρα';
+$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['addcc'] = 'Προσθήκη Cc';
+$labels['addbcc'] = 'Προσθήκη Bcc';
+$labels['addreplyto'] = 'Προσθήκη Απάντηση-Σε';
+$labels['mdnrequest'] = 'Ο αποστολέας του μηνύματος έχει ζητήσει να ενημερωθεί όταν διαβάσετε αυτό το μήνυμα. Επιθυμείτε να ενημερώστε τον αποστολέα;';
+$labels['receiptread'] = 'Αναφορά (ανάγνωσης)';
+$labels['yourmessage'] = 'Αυτό είναι μια Αναφορά για το μήνυμά σας';
+$labels['receiptnote'] = 'Σημείωση: Αυτή η αναφορά επιβεβαιώνει μόνο ότι το μήνυμα εμφανίστηκε μόνο στον υπολογιστή του παραλήπτη. Δεν επιβεβαιώνει ότι ο παραλήπτης έχει διαβάσει ή έχει κατανοήσει το περιεχόμενο του μηνύματος.';
+$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'] = 'Προσωπικό Βιβλίο Διευθύνσεων';
+$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'] = 'Daylight savings';
+$labels['htmleditor'] = 'Σύνθεση HTML μηνύματος';
+$labels['htmlsignature'] = 'Υπογραφή HTML';
+$labels['previewpane'] = 'Εμφάνιση προηγούμενου παραθύρου';
+$labels['autosavedraft'] = 'Αυτόματη προχείρου';
+$labels['everynminutes'] = 'κάθε $n λεπτά';
+$labels['never'] = 'ποτέ';
+$labels['folder'] = 'Φάκελος';
+$labels['folders'] = 'Φάκελοι';
+$labels['foldername'] = 'Όνομα φακέλου';
+$labels['subscribed'] = 'Εγγραφή';
+$labels['messagecount'] = 'Μηνύματα';
+$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/el_GR/messages.inc b/program/localization/el_GR/messages.inc
new file mode 100644 (file)
index 0000000..84890e8
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/el/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Jim Deves <jim@cobaltblue.gr>                                 |
+ |         John Economou <hsoc@irc.gr>                                   |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Είσοδος Απέτυχε';
+$messages['cookiesdisabled'] = 'Ο περιηγητής σας (browser) δεν αποδέχεται 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'] = 'Υπάρχει ήδη επαφή με αυτή τη διεύθυνση 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'] = 'Παρακαλώ εισάγεται έγκυρη διεύθυνση email';
+$messages['nonamewarning'] = 'Παρακαλώ εισάγεται όνομα';
+$messages['nopagesizewarning'] = 'Παρακαλώ εισάγεται μέγεθος σελίδας';
+$messages['norecipientwarning'] = 'Παρακαλώ εισάγεται τουλάχιστον έναν παραλήπτη';
+$messages['nosubjectwarning'] = 'Το πεδίο "Θέμα" είναι άδειο. Θέλετε να εισάγεται ένα τώρα;';
+$messages['nobodywarning'] = 'Αποστολή μηνύματος χωρίς κείμενο;';
+$messages['notsentwarning'] = 'Το μήνυμα δεν έχει σταλεί. Θέλετε να το απορρίψετε;';
+$messages['noldapserver'] = 'Παρακαλώ επιλέξτε έναν LDAP διακομιστή για αναζήτηση';
+$messages['nocontactsreturned'] = 'Δε βρέθηκαν επαφές';
+$messages['nosearchname'] = 'Παρακαλώ εισάγεται όνομα επαφής ή διεύθυνση email';
+$messages['searchsuccessful'] = '$nr μηνύματα βρέθηκαν';
+$messages['searchnomatch'] = 'Η Εύρεση δεν επέστρεψε αποτελέσματα';
+$messages['searching'] = 'Εύρεση...';
+$messages['checking'] = 'Έλεγχος...';
+$messages['nospellerrors'] = 'Δε βρέθηκαν ορθογραφικά λάθη';
+$messages['folderdeleted'] = 'Ο φάκελος διαγράφηκε επιτυχώς';
+$messages['deletedsuccessfully'] = 'Διαγραφή Επιτυχώς';
+$messages['converting'] = 'Μετακίνηση διαμορφώσεων κειμένου...';
+$messages['messageopenerror'] = 'Φόρτωση μηνυμάτων από τον διακομιστή απέτυχε';
+$messages['fileuploaderror'] = 'Ανέβασμα αρχείου απέτυχε';
+$messages['filesizeerror'] = 'Το ανεβασμένο αρχείο ξεπερνάει το μέγιστο μέγεθος των $size';
+$messages['copysuccess'] = 'Επιτυχή αντιγραφή $nr διευθύνσεων';
+$messages['copyerror'] = 'Αποτυχία αντιγραφής διευθύνσεων';
+$messages['sourceisreadonly'] = 'Η διεύθυνση έχει μόνο δικαίωμα ανάγνωσης';
+$messages['errorsavingcontact'] = 'Σώσιμο επαφής απέτυχε';
+$messages['movingmessage'] = 'Μετακίνηση μηνύματος...';
+$messages['receiptsent'] = 'Επιτυχής αποστολή αναφοράς ανάγνωσης';
+$messages['errorsendingreceipt'] = 'Αποστολή αναφοράς απέτυχε';
+$messages['nodeletelastidentity'] = 'Δε μπορείτε να διαγράψετε αυτήν την ταυτότητα, είναι η τελευταία.';
+$messages['addsubfolderhint'] = 'Αυτός ο φάκελος θα δημιουργηθεί ως υποφάκελος του επιλεγμένου';
+
+?>
\ No newline at end of file
index 3515de91fceec5fe73c725137f70f7e8bf9095c0..0588e709b0e0e219da8f9afd8cb3eefd4796c14d 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
+ @version $Id: labels.inc 1373 2008-05-10 14:48:18Z alec $
 
 */
 
@@ -68,10 +68,34 @@ $labels['wednesday'] = 'Wednesday';
 $labels['thursday'] = 'Thursday';
 $labels['friday'] = 'Friday';
 $labels['saturday'] = 'Saturday';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'May';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Oct';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dec';
+$labels['longjan'] = 'January';
+$labels['longfeb'] = 'February';
+$labels['longmar'] = 'March';
+$labels['longapr'] = 'April';
+$labels['longmay'] = 'May';
+$labels['longjun'] = 'June';
+$labels['longjul'] = 'July';
+$labels['longaug'] = 'August';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'October';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'December';
 $labels['today'] = 'Today';
 $labels['checkmail'] = 'Check for new messages';
 $labels['writenewmessage'] = 'Create a new message';
-$labels['replytomessage'] = 'Reply to the message';
+$labels['replytomessage'] = 'Reply to sender';
 $labels['replytoallmessage'] = 'Reply to sender and all recipients';
 $labels['forwardmessage'] = 'Forward the message';
 $labels['deletemessage'] = 'Delete message';
@@ -171,6 +195,10 @@ $labels['dstactive'] = 'Summer time';
 $labels['htmleditor'] = 'Compose HTML messages';
 $labels['htmlsignature'] = 'HTML signature';
 $labels['previewpane'] = 'Show preview pane';
+$labels['logoutclear'] = 'Clear Trash on logout';
+$labels['logoutcompact'] = 'Compact Inbox on logout';
+$labels['uisettings'] = 'User Interface';
+$labels['serversettings'] = 'Server Settings';
 $labels['autosavedraft'] = 'Automatically save draft';
 $labels['everynminutes'] = 'every $n minutes';
 $labels['never'] = 'never';
index c00941567de9aa14d8a04a16b5058b5fd0c587e6..e5620fd8aa216807980bcec0479fd808a6828fb6 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
+ @version $Id: labels.inc 1403 2008-05-19 08:09:38Z alec $
 
 */
 
@@ -88,12 +88,40 @@ $labels['thursday']  = 'Thursday';
 $labels['friday']    = 'Friday';
 $labels['saturday']  = 'Saturday';
 
+// months short
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'May';
+$labels['jun'] = 'Jun';
+$labels['jul']         = 'Jul';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Oct';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dec';
+
+// months long
+$labels['longjan']     = 'January';
+$labels['longfeb']     = 'February';
+$labels['longmar']     = 'March';
+$labels['longapr']     = 'April';
+$labels['longmay']     = 'May';
+$labels['longjun']     = 'June';
+$labels['longjul']     = 'July';
+$labels['longaug']     = 'August';
+$labels['longsep']     = 'September';
+$labels['longoct']     = 'October';
+$labels['longnov']     = 'November';
+$labels['longdec']     = 'December';
+
 $labels['today'] = 'Today';
 
 // toolbar buttons
 $labels['checkmail']        = 'Check for new messages';
 $labels['writenewmessage']  = 'Create a new message';
-$labels['replytomessage']   = 'Reply to the message';
+$labels['replytomessage']   = 'Reply to sender';
 $labels['replytoallmessage'] = 'Reply to sender and all recipients';
 $labels['forwardmessage']   = 'Forward the message';
 $labels['deletemessage']    = 'Delete message';
@@ -222,6 +250,17 @@ $labels['dstactive']  = 'Daylight saving time';
 $labels['htmleditor'] = 'Compose HTML messages';
 $labels['htmlsignature'] = 'HTML signature';
 $labels['previewpane'] = 'Show preview pane';
+$labels['logoutclear'] = 'Clear Trash on logout';
+$labels['logoutcompact'] = 'Compact Inbox on logout';
+$labels['uisettings'] = 'User Interface';
+$labels['serversettings'] = 'Server Settings';
+$labels['mailboxview'] = 'Mailbox View';
+$labels['mdnrequests'] = 'Sender notifications';
+$labels['askuser'] = 'ask the user';
+$labels['autosend'] = 'send automatically';
+$labels['ignore'] = 'ignore';
+$labels['readwhendeleted'] = 'Mark the message as read on delete';
+$labels['flagfordeletion'] = 'Flag the message for deletion instead of delete';
 
 $labels['autosavedraft']  = 'Automatically save draft';
 $labels['everynminutes']  = 'every $n minutes';
index e94ee407a8d66f9588545b61f4bc41dac7ffa00d..4fd63aef64f6be6b98cacab9ed469ffa623f6595 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 1052 2008-02-12 18:41:53Z thomasb $
+ @version $Id: messages.inc 1456 2008-05-30 13:27:13Z thomasb $
 
 */
 
@@ -78,5 +78,6 @@ $messages['receiptsent'] = 'Successfully sent a read receipt';
 $messages['errorsendingreceipt'] = 'Could not send the receipt';
 $messages['nodeletelastidentity'] = 'You cannot delete this identity, it\'s your last one.';
 $messages['addsubfolderhint'] = 'This folder will be created as subfolder of the currently selected one';
+$messages['forbiddencharacter'] = 'Folder name contains a forbidden character';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/es/labels.inc b/program/localization/es/labels.inc
deleted file mode 100644 (file)
index 54a5e8c..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/es/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Javier Smaldone <javier@smaldone.com.ar>                      |
- |         http://www.smaldone.com.ar                                    |
- |         David Grajal Blanco <dgrabla@gmail.com>                       |
- |         http://david.grajal.net                                       |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1079 2008-02-14 07:47:11Z tomekp $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Bienvenido a $product';
-$labels['username'] = 'Nombre de usuario';
-$labels['password'] = 'Contraseña';
-$labels['server'] = 'Servidor';
-$labels['login'] = 'Entrar';
-$labels['logout'] = 'Cerrar sesión';
-$labels['mail'] = 'Correo';
-$labels['settings'] = 'Configuración';
-$labels['addressbook'] = 'Contactos';
-$labels['inbox'] = 'Entrada';
-$labels['drafts'] = 'Borradores';
-$labels['sent'] = 'Enviados';
-$labels['trash'] = 'Papelera';
-$labels['junk'] = 'Basura';
-$labels['subject'] = 'Asunto';
-$labels['from'] = 'Remitente';
-$labels['to'] = 'Destinatario';
-$labels['cc'] = 'Copia';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Respuesta a';
-$labels['date'] = 'Fecha';
-$labels['size'] = 'Tamaño';
-$labels['priority'] = 'Prioridad';
-$labels['organization'] = 'Organización';
-$labels['reply-to'] = 'Respuesta a';
-$labels['mailboxlist'] = 'Bandejas';
-$labels['messagesfromto'] = 'Mensajes $from a $to de $count';
-$labels['messagenrof'] = 'Mensaje $nr de $count';
-$labels['moveto'] = 'mover a...';
-$labels['download'] = 'descargar';
-$labels['filename'] = 'Nombre del archivo';
-$labels['filesize'] = 'Tamaño del archivo';
-$labels['preferhtml'] = 'Prefiero HTML';
-$labels['htmlmessage'] = 'Mensaje HTML';
-$labels['prettydate'] = 'Fecha detallada';
-$labels['addtoaddressbook'] = 'Añadir a contactos';
-$labels['sun'] = 'Dom';
-$labels['mon'] = 'Lun';
-$labels['tue'] = 'Mar';
-$labels['wed'] = 'Mié';
-$labels['thu'] = 'Jue';
-$labels['fri'] = 'Vie';
-$labels['sat'] = 'Sáb';
-$labels['sunday'] = 'Domingo';
-$labels['monday'] = 'Lunes';
-$labels['tuesday'] = 'Martes';
-$labels['wednesday'] = 'Miércoles';
-$labels['thursday'] = 'Jueves';
-$labels['friday'] = 'Viernes';
-$labels['saturday'] = 'Sábado';
-$labels['today'] = 'Hoy';
-$labels['checkmail'] = 'Revisar si hay nuevos mensajes';
-$labels['writenewmessage'] = 'Crear nuevo mensaje';
-$labels['replytomessage'] = 'Responder mensaje';
-$labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
-$labels['forwardmessage'] = 'Reenviar mensaje';
-$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';
-$labels['firstmessage'] = 'Mostrar primer mensaje';
-$labels['firstmessages'] = 'Mostrar primer grupo de mensajes';
-$labels['nextmessage'] = 'Mostrar siguente mensaje';
-$labels['nextmessages'] = 'Mostrar siguente grupo de mensajes';
-$labels['lastmessage'] = 'Mostrar último mensaje';
-$labels['lastmessages'] = 'Mostrar último grupo de mensajes';
-$labels['backtolist'] = 'Volver a la lista de mensajes';
-$labels['viewsource'] = 'Mostrar código';
-$labels['markmessages'] = 'Marcar mensajes';
-$labels['markread'] = 'Como leído';
-$labels['markunread'] = 'Como no leído';
-$labels['select'] = 'Elija';
-$labels['all'] = 'Todos';
-$labels['none'] = 'Ninguno';
-$labels['unread'] = 'Sin leer';
-$labels['compact'] = 'Compacta';
-$labels['empty'] = 'Vacia';
-$labels['purge'] = 'Eliminar';
-$labels['quota'] = 'Uso de disco';
-$labels['unknown'] = 'desconocido';
-$labels['unlimited'] = 'sin límite';
-$labels['quicksearch'] = 'Búsqueda rápida';
-$labels['resetsearch'] = 'Reajustar la búsqueda';
-$labels['compose'] = 'Escribir un 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';
-$labels['returnreceipt'] = 'Acuse de recibo';
-$labels['checkspelling'] = 'Revisar ortografía';
-$labels['resumeediting'] = 'Continuar edición';
-$labels['revertto'] = 'Revertir a';
-$labels['attachments'] = 'Adjuntos';
-$labels['upload'] = 'Subir';
-$labels['close'] = 'Cerrar';
-$labels['low'] = 'Bajo';
-$labels['lowest'] = 'Bajísimo';
-$labels['normal'] = 'Normal';
-$labels['high'] = 'Alto';
-$labels['highest'] = 'Altísimo';
-$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['mdnrequest'] = 'El emisor de este mensaje desea ser notificado cuando usted lo lea. ¿Quiere enviar esta notificación?';
-$labels['receiptread'] = 'Notificación de lectura';
-$labels['yourmessage'] = 'Esta es una notificación de lectura de su mensaje';
-$labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaje fue mostrado en la computadora del receptor. No hay garantía de que el receptor haya leído o entendido el contenido del mensaje.';
-$labels['name'] = 'Nombre completo';
-$labels['firstname'] = 'Nombre';
-$labels['surname'] = 'Apellido';
-$labels['email'] = 'Correo';
-$labels['addcontact'] = 'Añadir nuevo contacto';
-$labels['editcontact'] = 'Editar contacto';
-$labels['edit'] = 'Editar';
-$labels['cancel'] = 'Cancelar';
-$labels['save'] = 'Guardar';
-$labels['delete'] = 'Eliminar';
-$labels['newcontact'] = 'Crear nuevo contacto';
-$labels['deletecontact'] = 'Eliminar contactos seleccionados';
-$labels['composeto'] = 'Enviar mensaje a';
-$labels['contactsfromto'] = 'Contactos $from a $to de $count';
-$labels['print'] = 'Imprimir';
-$labels['export'] = 'Exportar';
-$labels['previouspage'] = 'Mostrar grupo anterior';
-$labels['firstpage'] = 'Mostrar primer grupo';
-$labels['nextpage'] = 'Mostrar grupo siguiente';
-$labels['lastpage'] = 'Mostrar último grupo';
-$labels['groups'] = 'Grupos';
-$labels['personaladrbook'] = 'Direcciones personales';
-$labels['settingsfor'] = 'Configuración para';
-$labels['preferences'] = 'Preferencias';
-$labels['userpreferences'] = 'Preferencias de usuario';
-$labels['editpreferences'] = 'Editar preferencias de usuario';
-$labels['identities'] = 'Identidades';
-$labels['manageidentities'] = 'Gestionar identidades para esta cuenta';
-$labels['newidentity'] = 'Nueva identidad';
-$labels['newitem'] = 'Nuevo';
-$labels['edititem'] = 'Editar';
-$labels['setdefault'] = 'Seleccionar opción por defecto';
-$labels['language'] = 'Idioma';
-$labels['timezone'] = 'Zona horaria';
-$labels['pagesize'] = 'Filas por página';
-$labels['signature'] = 'Firma';
-$labels['dstactive'] = 'Cambio de horario';
-$labels['htmleditor'] = 'Componer mensaje en HTML';
-$labels['htmlsignature'] = 'Firma HTML';
-$labels['previewpane'] = 'Mostrar vista preliminar';
-$labels['autosavedraft'] = 'Guardar borrador automáticamente';
-$labels['everynminutes'] = 'cada $n minutos';
-$labels['never'] = 'nunca';
-$labels['folder'] = 'Bandeja';
-$labels['folders'] = 'Bandejas';
-$labels['foldername'] = 'Nombre de bandeja';
-$labels['subscribed'] = 'Suscrita';
-$labels['messagecount'] = 'Mensajes';
-$labels['create'] = 'Crear';
-$labels['createfolder'] = 'Crear nueva bandeja';
-$labels['rename'] = 'Renombrar';
-$labels['renamefolder'] = 'Renombrar bandeja';
-$labels['deletefolder'] = 'Eliminar bandeja';
-$labels['managefolders'] = 'Administrar bandejas';
-$labels['sortby'] = 'Ordenar por';
-$labels['sortasc'] = 'Orden ascendente';
-$labels['sortdesc'] = 'Orden descendente';
-
-?>
\ No newline at end of file
diff --git a/program/localization/es/messages.inc b/program/localization/es/messages.inc
deleted file mode 100644 (file)
index 3092a3f..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/es/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Javier Smaldone <javier@smaldone.com.ar>                      |
- |         David Grajal Blanco <dgrabla@gmail.com>                       |
- |         Lito Jornero <jornero@gmail.com>                              |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1079 2008-02-14 07:47:11Z tomekp $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Contraseña incorrecta';
-$messages['cookiesdisabled'] = 'Su navegador no acepta cookies';
-$messages['sessionerror'] = 'Su sesión no existe o ha expirado';
-$messages['imaperror'] = 'Error de conexión con el servidor IMAP';
-$messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla';
-$messages['loggedout'] = 'Ha cerrado la sesión. ¡Hasta pronto!';
-$messages['mailboxempty'] = 'La casilla está vacía';
-$messages['loading'] = 'Cargando...';
-$messages['loadingdata'] = 'Cargando datos...';
-$messages['checkingmail'] = 'Verificando si hay nuevos mensajes...';
-$messages['sendingmessage'] = 'Enviando mensaje...';
-$messages['messagesent'] = 'Mensaje enviado correctamente';
-$messages['savingmessage'] = 'Guardar mensaje...';
-$messages['messagesaved'] = 'Mensaje guardado en borradores';
-$messages['successfullysaved'] = 'Guardado correctamente';
-$messages['addedsuccessfully'] = 'Contacto añadido correctamente a la libreta de direcciones';
-$messages['contactexists'] = 'Ya existe un contacto con esta dirección de correo';
-$messages['blockedimages'] = 'Para proteger su privacidad, las imágenes externas han sido bloqueadas en este mensaje';
-$messages['encryptedmessage'] = 'Este es un mensaje cifrado y no puede ser mostrado. ¡Lo siento!';
-$messages['nocontactsfound'] = 'No hay contactos';
-$messages['contactnotfound'] = 'El contacto solicitado no existe';
-$messages['sendingfailed'] = 'Error al enviar mensaje';
-$messages['errorsaving'] = 'Ocurrió un error mientras se guardaba';
-$messages['errormoving'] = 'No se ha podido mover el mensaje';
-$messages['errordeleting'] = 'No se ha podido eliminar el mensaje';
-$messages['deletecontactconfirm'] = '¿Realmente quiere eliminar los contactos seleccionados?';
-$messages['deletemessagesconfirm'] = '¿Realmente quiere eliminar los mensajes seleccionados?';
-$messages['deletefolderconfirm'] = '¿Está seguro de que quiere eliminar esta carpeta?';
-$messages['purgefolderconfirm'] = '¿Está seguro de que quiere eliminar todos los mensajes de esta carpeta?';
-$messages['formincomplete'] = 'No se han llenado todos los campos del formulario';
-$messages['noemailwarning'] = 'Por favor, introduzca un e-mail válido';
-$messages['nonamewarning'] = 'Por favor, introduzca su nombre';
-$messages['nopagesizewarning'] = 'Por favor, introduzca un tamaño de página';
-$messages['norecipientwarning'] = 'Por favor, introduzca al menos un destinatario';
-$messages['nosubjectwarning'] = 'El campo "Asunto" esta vacío. ¿Desea completarlo en este momento?';
-$messages['nobodywarning'] = '¿Quiere enviar este mensaje sin texto?';
-$messages['notsentwarning'] = 'El mensaje no ha sido enviado. ¿Desea descartar su mensaje?';
-$messages['noldapserver'] = 'Por favor, seleccione un servidor LDAP para buscar';
-$messages['nocontactsreturned'] = 'No se han encontrado contactos';
-$messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección de e-mail';
-$messages['searchsuccessful'] = 'Se encontraron $nr mensajes';
-$messages['searchnomatch'] = 'La búsqueda no obtuvo resultados';
-$messages['searching'] = 'Buscando...';
-$messages['checking'] = 'Revisando...';
-$messages['nospellerrors'] = 'No se encontraron errores ortográficos';
-$messages['folderdeleted'] = 'Carpeta eliminada exitosamente';
-$messages['deletedsuccessfully'] = 'Eliminado exitosamente';
-$messages['converting'] = 'Removiendo el formato del mensaje...';
-$messages['messageopenerror'] = 'No puedo descargar el mensaje del servidor';
-$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...';
-$messages['receiptsent'] = 'La notificación de lectura se ha enviado con éxito.';
-$messages['errorsendingreceipt'] = 'No se ha podido enviar la notificación de lectura.';
-$messages['nodeletelastidentity'] = 'No se puede borrar esta identidad puesto que es la última.';
-$messages['addsubfolderhint'] = 'Esta carpeta se creará como una subcarpeta dentro de la carpeta seleccionada';
-
-?>
\ No newline at end of file
diff --git a/program/localization/es_ES/labels.inc b/program/localization/es_ES/labels.inc
new file mode 100644 (file)
index 0000000..8f62074
--- /dev/null
@@ -0,0 +1,231 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/es/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Javier Smaldone <javier@smaldone.com.ar>                      |
+|         http://www.smaldone.com.ar                                    |
+|         David Grajal Blanco <dgrabla@gmail.com>                       |
+|         http://david.grajal.net                                       |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 1417 2008-05-22 06:54:28Z alec $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Bienvenido a $product';
+$labels['username'] = 'Nombre de usuario';
+$labels['password'] = 'Contraseña';
+$labels['server'] = 'Servidor';
+$labels['login'] = 'Entrar';
+$labels['logout'] = 'Cerrar sesión';
+$labels['mail'] = 'Correo';
+$labels['settings'] = 'Configuración';
+$labels['addressbook'] = 'Contactos';
+$labels['inbox'] = 'Entrada';
+$labels['drafts'] = 'Borradores';
+$labels['sent'] = 'Enviados';
+$labels['trash'] = 'Papelera';
+$labels['junk'] = 'Basura';
+$labels['subject'] = 'Asunto';
+$labels['from'] = 'Remitente';
+$labels['to'] = 'Destinatario';
+$labels['cc'] = 'Copia';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Respuesta a';
+$labels['date'] = 'Fecha';
+$labels['size'] = 'Tamaño';
+$labels['priority'] = 'Prioridad';
+$labels['organization'] = 'Organización';
+$labels['reply-to'] = 'Respuesta a';
+$labels['mailboxlist'] = 'Bandejas';
+$labels['messagesfromto'] = 'Mensajes $from a $to de $count';
+$labels['messagenrof'] = 'Mensaje $nr de $count';
+$labels['moveto'] = 'mover a...';
+$labels['download'] = 'descargar';
+$labels['filename'] = 'Nombre del archivo';
+$labels['filesize'] = 'Tamaño del archivo';
+$labels['preferhtml'] = 'Prefiero HTML';
+$labels['htmlmessage'] = 'Mensaje HTML';
+$labels['prettydate'] = 'Fecha detallada';
+$labels['addtoaddressbook'] = 'Añadir a contactos';
+$labels['sun'] = 'Dom';
+$labels['mon'] = 'Lun';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mié';
+$labels['thu'] = 'Jue';
+$labels['fri'] = 'Vie';
+$labels['sat'] = 'Sáb';
+$labels['sunday'] = 'Domingo';
+$labels['monday'] = 'Lunes';
+$labels['tuesday'] = 'Martes';
+$labels['wednesday'] = 'Miércoles';
+$labels['thursday'] = 'Jueves';
+$labels['friday'] = 'Viernes';
+$labels['saturday'] = 'Sábado';
+$labels['jan'] = 'Ene';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Abr';
+$labels['may'] = 'May';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Ago';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Oct';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Duc';
+$labels['longjan'] = 'Enero';
+$labels['longfeb'] = 'Febrero';
+$labels['longmar'] = 'Marzo';
+$labels['longapr'] = 'Abril';
+$labels['longmay'] = 'Mayo';
+$labels['longjun'] = 'Junio';
+$labels['longjul'] = 'Julio';
+$labels['longaug'] = 'Agosto';
+$labels['longsep'] = 'Septiembre';
+$labels['longoct'] = 'Octubre';
+$labels['longnov'] = 'Noviembre';
+$labels['longdec'] = 'Diciembre';
+$labels['today'] = 'Hoy';
+$labels['checkmail'] = 'Revisar si hay nuevos mensajes';
+$labels['writenewmessage'] = 'Crear nuevo mensaje';
+$labels['replytomessage'] = 'Responder mensaje';
+$labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
+$labels['forwardmessage'] = 'Reenviar mensaje';
+$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';
+$labels['firstmessage'] = 'Mostrar primer mensaje';
+$labels['firstmessages'] = 'Mostrar primer grupo de mensajes';
+$labels['nextmessage'] = 'Mostrar siguente mensaje';
+$labels['nextmessages'] = 'Mostrar siguente grupo de mensajes';
+$labels['lastmessage'] = 'Mostrar último mensaje';
+$labels['lastmessages'] = 'Mostrar último grupo de mensajes';
+$labels['backtolist'] = 'Volver a la lista de mensajes';
+$labels['viewsource'] = 'Mostrar código';
+$labels['markmessages'] = 'Marcar mensajes';
+$labels['markread'] = 'Como leído';
+$labels['markunread'] = 'Como no leído';
+$labels['select'] = 'Elija';
+$labels['all'] = 'Todos';
+$labels['none'] = 'Ninguno';
+$labels['unread'] = 'Sin leer';
+$labels['compact'] = 'Compacta';
+$labels['empty'] = 'Vacia';
+$labels['purge'] = 'Eliminar';
+$labels['quota'] = 'Uso de disco';
+$labels['unknown'] = 'desconocido';
+$labels['unlimited'] = 'sin límite';
+$labels['quicksearch'] = 'Búsqueda rápida';
+$labels['resetsearch'] = 'Reajustar la búsqueda';
+$labels['compose'] = 'Escribir un 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';
+$labels['returnreceipt'] = 'Acuse de recibo';
+$labels['checkspelling'] = 'Revisar ortografía';
+$labels['resumeediting'] = 'Continuar edición';
+$labels['revertto'] = 'Revertir a';
+$labels['attachments'] = 'Adjuntos';
+$labels['upload'] = 'Subir';
+$labels['close'] = 'Cerrar';
+$labels['low'] = 'Bajo';
+$labels['lowest'] = 'Bajísimo';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Alto';
+$labels['highest'] = 'Altísimo';
+$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['mdnrequest'] = 'El emisor de este mensaje desea ser notificado cuando usted lo lea. ¿Quiere enviar esta notificación?';
+$labels['receiptread'] = 'Notificación de lectura';
+$labels['yourmessage'] = 'Esta es una notificación de lectura de su mensaje';
+$labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaje fue mostrado en la computadora del receptor. No hay garantía de que el receptor haya leído o entendido el contenido del mensaje.';
+$labels['name'] = 'Nombre completo';
+$labels['firstname'] = 'Nombre';
+$labels['surname'] = 'Apellido';
+$labels['email'] = 'Correo';
+$labels['addcontact'] = 'Añadir nuevo contacto';
+$labels['editcontact'] = 'Editar contacto';
+$labels['edit'] = 'Editar';
+$labels['cancel'] = 'Cancelar';
+$labels['save'] = 'Guardar';
+$labels['delete'] = 'Eliminar';
+$labels['newcontact'] = 'Crear nuevo contacto';
+$labels['deletecontact'] = 'Eliminar contactos seleccionados';
+$labels['composeto'] = 'Enviar mensaje a';
+$labels['contactsfromto'] = 'Contactos $from a $to de $count';
+$labels['print'] = 'Imprimir';
+$labels['export'] = 'Exportar';
+$labels['previouspage'] = 'Mostrar grupo anterior';
+$labels['firstpage'] = 'Mostrar primer grupo';
+$labels['nextpage'] = 'Mostrar grupo siguiente';
+$labels['lastpage'] = 'Mostrar último grupo';
+$labels['groups'] = 'Grupos';
+$labels['personaladrbook'] = 'Direcciones personales';
+$labels['settingsfor'] = 'Configuración para';
+$labels['preferences'] = 'Preferencias';
+$labels['userpreferences'] = 'Preferencias de usuario';
+$labels['editpreferences'] = 'Editar preferencias de usuario';
+$labels['identities'] = 'Identidades';
+$labels['manageidentities'] = 'Gestionar identidades para esta cuenta';
+$labels['newidentity'] = 'Nueva identidad';
+$labels['newitem'] = 'Nuevo';
+$labels['edititem'] = 'Editar';
+$labels['setdefault'] = 'Seleccionar opción por defecto';
+$labels['language'] = 'Idioma';
+$labels['timezone'] = 'Zona horaria';
+$labels['pagesize'] = 'Filas por página';
+$labels['signature'] = 'Firma';
+$labels['dstactive'] = 'Cambio de horario';
+$labels['htmleditor'] = 'Componer mensaje en HTML';
+$labels['htmlsignature'] = 'Firma HTML';
+$labels['previewpane'] = 'Mostrar vista preliminar';
+$labels['logoutclear'] = 'Vaciar papelera al cerrar sesión';
+$labels['logoutcompact'] = 'Compactar la bandeja de entrada al cerrar sesión';
+$labels['uisettings'] = 'Interfaz de usuario';
+$labels['serversettings'] = 'Configuracion del servidor';
+$labels['mailboxview'] = 'Vista de buzón';
+$labels['mdnrequests'] = 'Notificaciones de envio';
+$labels['askuser'] = 'preguntar al usuario';
+$labels['autosend'] = 'enviar automáticamente';
+$labels['ignore'] = 'ignorar';
+$labels['readwhendeleted'] = 'Marcar el mensage como leido al borrarlo';
+$labels['flagfordeletion'] = 'Marcar el mensage para borrarse en vez de borrarlo';
+$labels['autosavedraft'] = 'Guardar borrador automáticamente';
+$labels['everynminutes'] = 'cada $n minutos';
+$labels['never'] = 'nunca';
+$labels['folder'] = 'Bandeja';
+$labels['folders'] = 'Bandejas';
+$labels['foldername'] = 'Nombre de bandeja';
+$labels['subscribed'] = 'Suscrita';
+$labels['messagecount'] = 'Mensajes';
+$labels['create'] = 'Crear';
+$labels['createfolder'] = 'Crear nueva bandeja';
+$labels['rename'] = 'Renombrar';
+$labels['renamefolder'] = 'Renombrar bandeja';
+$labels['deletefolder'] = 'Eliminar bandeja';
+$labels['managefolders'] = 'Administrar bandejas';
+$labels['sortby'] = 'Ordenar por';
+$labels['sortasc'] = 'Orden ascendente';
+$labels['sortdesc'] = 'Orden descendente';
+
+?>
+
diff --git a/program/localization/es_ES/messages.inc b/program/localization/es_ES/messages.inc
new file mode 100644 (file)
index 0000000..3092a3f
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/es/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Javier Smaldone <javier@smaldone.com.ar>                      |
+ |         David Grajal Blanco <dgrabla@gmail.com>                       |
+ |         Lito Jornero <jornero@gmail.com>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1079 2008-02-14 07:47:11Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Contraseña incorrecta';
+$messages['cookiesdisabled'] = 'Su navegador no acepta cookies';
+$messages['sessionerror'] = 'Su sesión no existe o ha expirado';
+$messages['imaperror'] = 'Error de conexión con el servidor IMAP';
+$messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla';
+$messages['loggedout'] = 'Ha cerrado la sesión. ¡Hasta pronto!';
+$messages['mailboxempty'] = 'La casilla está vacía';
+$messages['loading'] = 'Cargando...';
+$messages['loadingdata'] = 'Cargando datos...';
+$messages['checkingmail'] = 'Verificando si hay nuevos mensajes...';
+$messages['sendingmessage'] = 'Enviando mensaje...';
+$messages['messagesent'] = 'Mensaje enviado correctamente';
+$messages['savingmessage'] = 'Guardar mensaje...';
+$messages['messagesaved'] = 'Mensaje guardado en borradores';
+$messages['successfullysaved'] = 'Guardado correctamente';
+$messages['addedsuccessfully'] = 'Contacto añadido correctamente a la libreta de direcciones';
+$messages['contactexists'] = 'Ya existe un contacto con esta dirección de correo';
+$messages['blockedimages'] = 'Para proteger su privacidad, las imágenes externas han sido bloqueadas en este mensaje';
+$messages['encryptedmessage'] = 'Este es un mensaje cifrado y no puede ser mostrado. ¡Lo siento!';
+$messages['nocontactsfound'] = 'No hay contactos';
+$messages['contactnotfound'] = 'El contacto solicitado no existe';
+$messages['sendingfailed'] = 'Error al enviar mensaje';
+$messages['errorsaving'] = 'Ocurrió un error mientras se guardaba';
+$messages['errormoving'] = 'No se ha podido mover el mensaje';
+$messages['errordeleting'] = 'No se ha podido eliminar el mensaje';
+$messages['deletecontactconfirm'] = '¿Realmente quiere eliminar los contactos seleccionados?';
+$messages['deletemessagesconfirm'] = '¿Realmente quiere eliminar los mensajes seleccionados?';
+$messages['deletefolderconfirm'] = '¿Está seguro de que quiere eliminar esta carpeta?';
+$messages['purgefolderconfirm'] = '¿Está seguro de que quiere eliminar todos los mensajes de esta carpeta?';
+$messages['formincomplete'] = 'No se han llenado todos los campos del formulario';
+$messages['noemailwarning'] = 'Por favor, introduzca un e-mail válido';
+$messages['nonamewarning'] = 'Por favor, introduzca su nombre';
+$messages['nopagesizewarning'] = 'Por favor, introduzca un tamaño de página';
+$messages['norecipientwarning'] = 'Por favor, introduzca al menos un destinatario';
+$messages['nosubjectwarning'] = 'El campo "Asunto" esta vacío. ¿Desea completarlo en este momento?';
+$messages['nobodywarning'] = '¿Quiere enviar este mensaje sin texto?';
+$messages['notsentwarning'] = 'El mensaje no ha sido enviado. ¿Desea descartar su mensaje?';
+$messages['noldapserver'] = 'Por favor, seleccione un servidor LDAP para buscar';
+$messages['nocontactsreturned'] = 'No se han encontrado contactos';
+$messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección de e-mail';
+$messages['searchsuccessful'] = 'Se encontraron $nr mensajes';
+$messages['searchnomatch'] = 'La búsqueda no obtuvo resultados';
+$messages['searching'] = 'Buscando...';
+$messages['checking'] = 'Revisando...';
+$messages['nospellerrors'] = 'No se encontraron errores ortográficos';
+$messages['folderdeleted'] = 'Carpeta eliminada exitosamente';
+$messages['deletedsuccessfully'] = 'Eliminado exitosamente';
+$messages['converting'] = 'Removiendo el formato del mensaje...';
+$messages['messageopenerror'] = 'No puedo descargar el mensaje del servidor';
+$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...';
+$messages['receiptsent'] = 'La notificación de lectura se ha enviado con éxito.';
+$messages['errorsendingreceipt'] = 'No se ha podido enviar la notificación de lectura.';
+$messages['nodeletelastidentity'] = 'No se puede borrar esta identidad puesto que es la última.';
+$messages['addsubfolderhint'] = 'Esta carpeta se creará como una subcarpeta dentro de la carpeta seleccionada';
+
+?>
\ No newline at end of file
index f66eddd513d595c68f5abcbf7ed61f75b2e3ea0e..16beaba197b03a6c2a23bff0d982bb0ca7818cb5 100644 (file)
@@ -68,6 +68,30 @@ $labels['wednesday'] = 'Kolmapäev';
 $labels['thursday'] = 'Neljapäev';
 $labels['friday'] = 'Reede';
 $labels['saturday'] = 'Laupäev';
+$labels['jan'] = 'jaan';
+$labels['feb'] = 'veebr';
+$labels['mar'] = 'märts';
+$labels['apr'] = 'apr';
+$labels['may'] = 'mai';
+$labels['jun'] = 'juuni';
+$labels['jul'] = 'juuli';
+$labels['aug'] = 'aug';
+$labels['sep'] = 'sept';
+$labels['oct'] = 'okt';
+$labels['nov'] = 'nov';
+$labels['dec'] = 'dets';
+$labels['longjan'] = 'Jaanuar';
+$labels['longfeb'] = 'Veebruar';
+$labels['longmar'] = 'Märts';
+$labels['longapr'] = 'Aprill';
+$labels['longmay'] = 'Mai';
+$labels['longjun'] = 'Juuni';
+$labels['longjul'] = 'Juuli';
+$labels['longaug'] = 'August';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Oktoober';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'Detsember';
 $labels['today'] = 'Täna';
 $labels['checkmail'] = 'Kontrolli uusi kirju';
 $labels['writenewmessage'] = 'Kirjuta uus kiri';
@@ -103,8 +127,8 @@ $labels['unlimited'] = 'piiramatu';
 $labels['quicksearch'] = 'Kiirotsing';
 $labels['resetsearch'] = 'Lähtesta otsing';
 $labels['compose'] = 'Koosta kiri';
-$labels['sendmessage'] = 'Saada kiri kohe';
 $labels['savemessage'] = 'Salvesta see mustand';
+$labels['sendmessage'] = 'Saada kiri kohe';
 $labels['addattachment'] = 'Lisa fail';
 $labels['charset'] = 'Märgistik';
 $labels['editortype'] = 'Redaktori tüüp';
@@ -171,6 +195,17 @@ $labels['dstactive'] = 'Suveaeg';
 $labels['htmleditor'] = 'Kasuta HTML redaktorit';
 $labels['htmlsignature'] = 'HTML allkiri';
 $labels['previewpane'] = 'Näita eelvaate akent';
+$labels['logoutclear'] = 'Tühjenda väljumisel prügikast';
+$labels['logoutcompact'] = 'Tihenda väljumisel sissetulevate kaust';
+$labels['uisettings'] = 'Kasutajaliides';
+$labels['serversettings'] = 'Serveri seaded';
+$labels['mailboxview'] = 'Postkasti vaade';
+$labels['mdnrequests'] = 'Kättesaamis kinnitus';
+$labels['askuser'] = 'küsi kasutajalt';
+$labels['autosend'] = 'saada automaatselt';
+$labels['ignore'] = 'ignoreeri';
+$labels['readwhendeleted'] = 'Märgi kiri kustutamisel loetuks';
+$labels['flagfordeletion'] = 'Kustutamise asemel märgi kiri kustutatavaks';
 $labels['autosavedraft'] = 'Salvesta mustandid automaatselt';
 $labels['everynminutes'] = 'iga $n minuti tagant';
 $labels['never'] = 'mitte kunagi';
@@ -188,5 +223,4 @@ $labels['managefolders'] = 'Halda kaustu';
 $labels['sortby'] = 'Järjesta';
 $labels['sortasc'] = 'Järjesta kasvavalt';
 $labels['sortdesc'] = 'Järjesta kahanevalt';
-
 ?>
index ecea2711842cbaa6ea836ca95ce546af985bd111..7bdb685d4f2d1d8b29337b061fe2a00abfe5d47a 100644 (file)
@@ -78,4 +78,5 @@ $messages['receiptsent'] = 'Kättesaamiskinnitus saadetud';
 $messages['errorsendingreceipt'] = 'Ei õnnestunud kättesaamiskinnitust saata';
 $messages['nodeletelastidentity'] = 'See identiteet on viimane ja seda ei saa kustutada.';
 $messages['addsubfolderhint'] = 'See kataloog luuakse valitud kausta alamkataloogina.';
+$messages['forbiddencharacter'] = 'Kausta nimi sisaldab keelatud sümbolit';
 ?>
diff --git a/program/localization/eu/labels.inc b/program/localization/eu/labels.inc
deleted file mode 100644 (file)
index 2fb5fee..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/eu/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Bicyus <bicyus@tenkanet.com>                                  |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Ongietorri Roundcube|Mail-era';
-$labels['username'] = 'Erabiltzailea';
-$labels['password'] = 'Pasahitza';
-$labels['server'] = 'Zerbitzaria';
-$labels['login'] = 'Saio hasiera';
-$labels['logout'] = 'Irten';
-$labels['mail'] = 'ePosta';
-$labels['settings'] = 'Ezarpen Pertsonalak';
-$labels['addressbook'] = 'Helbide Liburua';
-$labels['inbox'] = 'Sarrera';
-$labels['drafts'] = 'Zirriborroak';
-$labels['sent'] = 'Bidalitakoak';
-$labels['trash'] = 'Zakarrontzia';
-$labels['junk'] = 'Zabor-posta';
-$labels['subject'] = 'Gaia';
-$labels['from'] = 'Nork';
-$labels['to'] = 'Nori';
-$labels['cc'] = 'Kopia';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Erantzun-Hona';
-$labels['date'] = 'Data';
-$labels['size'] = 'Tamaina';
-$labels['priority'] = 'Lehentasuna';
-$labels['organization'] = 'Erakundea';
-$labels['reply-to'] = 'Erantzun-Hona';
-$labels['mailboxlist'] = 'Karpetak';
-$labels['messagesfromto'] = '$from -tik $to -ra $count mezuetatik';
-$labels['messagenrof'] = '$nr mezua $count -tik';
-$labels['moveto'] = 'mugitu hona...';
-$labels['download'] = 'deskargatu';
-$labels['filename'] = 'Fitxategi Izena';
-$labels['filesize'] = 'Fitxategi Tamaina';
-$labels['preferhtml'] = 'HTML nahiago';
-$labels['htmlmessage'] = 'HTML Mezua';
-$labels['prettydate'] = 'Data politak';
-$labels['addtoaddressbook'] = 'Helbide liburura gehitu';
-$labels['sun'] = 'Iga';
-$labels['mon'] = 'Al';
-$labels['tue'] = 'As';
-$labels['wed'] = 'Azt';
-$labels['thu'] = 'Og';
-$labels['fri'] = 'Or';
-$labels['sat'] = 'Lar';
-$labels['sunday'] = 'Igandea';
-$labels['monday'] = 'Astelehena';
-$labels['tuesday'] = 'Asteartea';
-$labels['wednesday'] = 'Asteazkena';
-$labels['thursday'] = 'Osteguna';
-$labels['friday'] = 'Ostirala';
-$labels['saturday'] = 'Larunbata';
-$labels['today'] = 'Gaur';
-$labels['checkmail'] = 'Mezu berrien bila arakatu';
-$labels['writenewmessage'] = 'Mezu berri bat sortu';
-$labels['replytomessage'] = 'Mezuari erantzun';
-$labels['replytoallmessage'] = 'Bidaltzaile eta hartzaile guztiei erantzun';
-$labels['forwardmessage'] = 'Mezua Birbidali';
-$labels['deletemessage'] = 'Mezua zakarrontzira mugitu';
-$labels['printmessage'] = 'Mezu hau inprimatu';
-$labels['previousmessage'] = 'Aurreko mezua ikusi';
-$labels['previousmessages'] = 'Aurreko mezuak ikusi';
-$labels['firstmessage'] = 'Lehenengo mezua ikusi';
-$labels['firstmessages'] = 'Lehenengo mezu sorta ikusi';
-$labels['nextmessage'] = 'Hurrengo mezua ikusi';
-$labels['nextmessages'] = 'Hurrengo mezu sorta ikusi';
-$labels['lastmessage'] = 'Azken mezua ikusi';
-$labels['lastmessages'] = 'Azken mezu sorta ikusi';
-$labels['backtolist'] = 'Mezu zerrendara itzuli';
-$labels['viewsource'] = 'Jatorria bistarazi';
-$labels['select'] = 'Hautatu';
-$labels['all'] = 'Denak';
-$labels['none'] = 'Batez';
-$labels['unread'] = 'Irakurri gabeak';
-$labels['compact'] = 'Trinkotu';
-$labels['empty'] = 'Hustu';
-$labels['purge'] = 'Garbitu';
-$labels['quota'] = 'Disko erabilera';
-$labels['unknown'] = 'ezezaguna';
-$labels['unlimited'] = 'mugagabea';
-$labels['quicksearch'] = 'Bilaketa azkarra';
-$labels['resetsearch'] = 'Bilaketa berrabiarazi';
-$labels['compose'] = 'Mezu bat sortu';
-$labels['sendmessage'] = 'Mezua orain bidali';
-$labels['savemessage'] = 'Zirriborro hau gorde';
-$labels['addattachment'] = 'Fitxategia erantsi';
-$labels['charset'] = 'Karaktere jokoa';
-$labels['editortype'] = 'Editore mota';
-$labels['returnreceipt'] = 'Bidaltzaileari itzuli';
-$labels['checkspelling'] = 'Egiaztaketa ortografikoa';
-$labels['resumeediting'] = 'Editatzen jarraitu';
-$labels['revertto'] = 'Itzuli hona';
-$labels['attachments'] = 'Eranskinak';
-$labels['upload'] = 'Igo';
-$labels['close'] = 'Itxi';
-$labels['low'] = 'Baxua';
-$labels['lowest'] = 'Baxuena';
-$labels['normal'] = 'Normala';
-$labels['high'] = 'Altua';
-$labels['highest'] = 'Altuena';
-$labels['nosubject'] = '(gairik gabea)';
-$labels['showimages'] = 'Irudiak bistarazi';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Testu laua';
-$labels['name'] = 'Izena bistarazi';
-$labels['firstname'] = 'Izena';
-$labels['surname'] = 'Abizena';
-$labels['email'] = 'ePosta';
-$labels['addcontact'] = 'Txartel berria gehitu';
-$labels['editcontact'] = 'Txartela editatu';
-$labels['edit'] = 'Editatu';
-$labels['cancel'] = 'Utzi';
-$labels['save'] = 'Gorde';
-$labels['delete'] = 'Ezabatu';
-$labels['newcontact'] = 'Helbide liburu txartel berria sortu';
-$labels['deletecontact'] = 'Aukeraturiko txartelak ezabatu';
-$labels['composeto'] = 'Bidali mezua honi: ';
-$labels['contactsfromto'] = '$from -tik $to -ra $count txarteletatik';
-$labels['print'] = 'Inprimatu';
-$labels['export'] = 'Esportatu';
-$labels['previouspage'] = 'Aurreko sorta ikusi';
-$labels['firstpage'] = 'Lehenengo sorta ikusi';
-$labels['nextpage'] = 'Hurrengo sorta ikusi';
-$labels['lastpage'] = 'Azken sorta ikusi';
-$labels['groups'] = 'Taldeak';
-$labels['personaladrbook'] = 'Helbide pertsonalak';
-$labels['settingsfor'] = 'Honen ezarpenak:';
-$labels['preferences'] = 'Hobespenak';
-$labels['userpreferences'] = 'Erabiltzaile hobespenak';
-$labels['editpreferences'] = 'Erabiltzaile hobespenak editatu';
-$labels['identities'] = 'Identitateak';
-$labels['manageidentities'] = 'Kontu honetako identitateak kudeatu';
-$labels['newidentity'] = 'Identitate berria';
-$labels['newitem'] = 'Elementu berria';
-$labels['edititem'] = 'Elementua Editatu';
-$labels['setdefault'] = 'Lehenespenak ezarri';
-$labels['language'] = 'Hizkuntza';
-$labels['timezone'] = 'Ordu zonaldea';
-$labels['pagesize'] = 'Lerro orrialdeko';
-$labels['signature'] = 'Sinadura';
-$labels['dstactive'] = 'Eguneko gordeketak';
-$labels['htmleditor'] = 'HTML mezuak sortu';
-$labels['htmlsignature'] = 'HTML sinadura';
-$labels['previewpane'] = 'Aurrebista panela ikusi';
-$labels['autosavedraft'] = 'Zirriborroa automatikoki gorde';
-$labels['everynminutes'] = '$n minuturo';
-$labels['never'] = 'inoiz';
-$labels['folder'] = 'Karpeta';
-$labels['folders'] = 'Karpetak';
-$labels['foldername'] = 'Karpeta izena';
-$labels['subscribed'] = 'Harpideturik';
-$labels['create'] = 'Sortu';
-$labels['createfolder'] = 'Karpeta berria sortu';
-$labels['rename'] = 'Berrizendatu';
-$labels['renamefolder'] = 'Karpeta berrizendatu';
-$labels['deletefolder'] = 'Karpeta ezabatu';
-$labels['managefolders'] = 'Karpeta kudeaketa';
-$labels['sortby'] = 'Honela ordenatu';
-$labels['sortasc'] = 'Goraka ordenatu';
-$labels['sortdesc'] = 'Beheraka ordenatu';
-
-?>
\ No newline at end of file
diff --git a/program/localization/eu/messages.inc b/program/localization/eu/messages.inc
deleted file mode 100644 (file)
index 279efd8..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/eu/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: pi <pi@beobide.net>                                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Saio sarrerak huts egin du';
-$messages['cookiesdisabled'] = 'Zure nabigatzaileak ez ditu cookie-ak onartzen';
-$messages['sessionerror'] = 'Zure saioa baliogabea da edo iraungita dago';
-$messages['imaperror'] = 'Huts IMAP zerbitzarira konektatzerakoan';
-$messages['nomessagesfound'] = 'Ez da mezurik aurkitu posta kutxa honetan';
-$messages['loggedout'] = 'Saioa behar bezala amaitu duzu. Agur!';
-$messages['mailboxempty'] = 'Posta kutxa hutsik dago';
-$messages['loading'] = 'Kargatzen...';
-$messages['loadingdata'] = 'Datuak kargatzen...';
-$messages['checkingmail'] = 'Mezu berrien bila arakatzen...';
-$messages['sendingmessage'] = 'Mezua bidaltzen...';
-$messages['messagesent'] = 'Mezua behar bezala bidali da';
-$messages['savingmessage'] = 'Mezua gordetzen...';
-$messages['messagesaved'] = 'Mezua zirriborroetan gordea';
-$messages['successfullysaved'] = 'Behar bezala gorde da';
-$messages['addedsuccessfully'] = 'Txartela behar bezala gehitu da helbide liburura';
-$messages['contactexists'] = 'ePosta honetako txartel bat badago dagoeneko';
-$messages['blockedimages'] = 'Zure pribazitatea mantentzeko urruneko irudiak blokeatu egin dira.';
-$messages['encryptedmessage'] = 'Hau enkriptaturiko mezu bat da eta ezin da bistarazi. Barkatu!';
-$messages['nocontactsfound'] = 'Ez da txartelik aurkitu';
-$messages['sendingfailed'] = 'Huts mezua bidaltzerakoan';
-$messages['errorsaving'] = 'Errore bat gertatu da gordetzerakoan';
-$messages['errormoving'] = 'Ezin da mezua mugitu';
-$messages['errordeleting'] = 'Ezin da mezua ezabatu';
-$messages['deletecontactconfirm'] = 'Benetan hautaturiko kontaktuak ezabatu nahi dituzula?';
-$messages['deletemessagesconfirm'] = 'Benetan hautaturiko mezuak ezabatu nahi dituzula?';
-$messages['deletefolderconfirm'] = 'Benetan Karpeta hau ezabatu nahi duzu?';
-$messages['purgefolderconfirm'] = 'Benetan karpeta honetako mezu guziak ezabatu nahi dituzu?';
-$messages['formincomplete'] = 'Inprimakia ez guztiz bete';
-$messages['noemailwarning'] = 'Mesedez idatzi baliozko eposta helbide bat';
-$messages['nonamewarning'] = 'Mesedez izen bat idatzi';
-$messages['nopagesizewarning'] = 'Mesedez paper tamaina idatzi';
-$messages['norecipientwarning'] = 'Mesedez behintzat hartzaile bat idatzi';
-$messages['nosubjectwarning'] = '"Gaia" eremua hutsik dago. Bat idatzi nahi al duzu?';
-$messages['nobodywarning'] = 'Testu gabeko mezu hau bidali?';
-$messages['notsentwarning'] = 'Mezua ez da bidali. Mezua ezeztatu nahi al duzu?';
-$messages['noldapserver'] = 'Mesedez hautatu bilaketa egiteko LDAP zerbitzari bat';
-$messages['nocontactsreturned'] = 'Ez da kontakturik aurkitu';
-$messages['nosearchname'] = 'Mesedez idatzi kontaktu izen bat edo eposta helbide bat';
-$messages['searchsuccessful'] = '$nr mezu aurkiturik';
-$messages['searchnomatch'] = 'Bilaketak ez du emaitzarik itzuli';
-$messages['searching'] = 'Bilatzen...';
-$messages['checking'] = 'Arakatzen...';
-$messages['nospellerrors'] = 'Ez da ortografia errorerik aurkitu';
-$messages['folderdeleted'] = 'Karpeta behar bezala ezabatu da';
-$messages['deletedsuccessfully'] = 'Behar bezala ezabatu da';
-$messages['converting'] = 'Mezuaren formatua ezabatzen';
-$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/eu_ES/labels.inc b/program/localization/eu_ES/labels.inc
new file mode 100644 (file)
index 0000000..2fb5fee
--- /dev/null
@@ -0,0 +1,179 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/eu/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Bicyus <bicyus@tenkanet.com>                                  |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Ongietorri Roundcube|Mail-era';
+$labels['username'] = 'Erabiltzailea';
+$labels['password'] = 'Pasahitza';
+$labels['server'] = 'Zerbitzaria';
+$labels['login'] = 'Saio hasiera';
+$labels['logout'] = 'Irten';
+$labels['mail'] = 'ePosta';
+$labels['settings'] = 'Ezarpen Pertsonalak';
+$labels['addressbook'] = 'Helbide Liburua';
+$labels['inbox'] = 'Sarrera';
+$labels['drafts'] = 'Zirriborroak';
+$labels['sent'] = 'Bidalitakoak';
+$labels['trash'] = 'Zakarrontzia';
+$labels['junk'] = 'Zabor-posta';
+$labels['subject'] = 'Gaia';
+$labels['from'] = 'Nork';
+$labels['to'] = 'Nori';
+$labels['cc'] = 'Kopia';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Erantzun-Hona';
+$labels['date'] = 'Data';
+$labels['size'] = 'Tamaina';
+$labels['priority'] = 'Lehentasuna';
+$labels['organization'] = 'Erakundea';
+$labels['reply-to'] = 'Erantzun-Hona';
+$labels['mailboxlist'] = 'Karpetak';
+$labels['messagesfromto'] = '$from -tik $to -ra $count mezuetatik';
+$labels['messagenrof'] = '$nr mezua $count -tik';
+$labels['moveto'] = 'mugitu hona...';
+$labels['download'] = 'deskargatu';
+$labels['filename'] = 'Fitxategi Izena';
+$labels['filesize'] = 'Fitxategi Tamaina';
+$labels['preferhtml'] = 'HTML nahiago';
+$labels['htmlmessage'] = 'HTML Mezua';
+$labels['prettydate'] = 'Data politak';
+$labels['addtoaddressbook'] = 'Helbide liburura gehitu';
+$labels['sun'] = 'Iga';
+$labels['mon'] = 'Al';
+$labels['tue'] = 'As';
+$labels['wed'] = 'Azt';
+$labels['thu'] = 'Og';
+$labels['fri'] = 'Or';
+$labels['sat'] = 'Lar';
+$labels['sunday'] = 'Igandea';
+$labels['monday'] = 'Astelehena';
+$labels['tuesday'] = 'Asteartea';
+$labels['wednesday'] = 'Asteazkena';
+$labels['thursday'] = 'Osteguna';
+$labels['friday'] = 'Ostirala';
+$labels['saturday'] = 'Larunbata';
+$labels['today'] = 'Gaur';
+$labels['checkmail'] = 'Mezu berrien bila arakatu';
+$labels['writenewmessage'] = 'Mezu berri bat sortu';
+$labels['replytomessage'] = 'Mezuari erantzun';
+$labels['replytoallmessage'] = 'Bidaltzaile eta hartzaile guztiei erantzun';
+$labels['forwardmessage'] = 'Mezua Birbidali';
+$labels['deletemessage'] = 'Mezua zakarrontzira mugitu';
+$labels['printmessage'] = 'Mezu hau inprimatu';
+$labels['previousmessage'] = 'Aurreko mezua ikusi';
+$labels['previousmessages'] = 'Aurreko mezuak ikusi';
+$labels['firstmessage'] = 'Lehenengo mezua ikusi';
+$labels['firstmessages'] = 'Lehenengo mezu sorta ikusi';
+$labels['nextmessage'] = 'Hurrengo mezua ikusi';
+$labels['nextmessages'] = 'Hurrengo mezu sorta ikusi';
+$labels['lastmessage'] = 'Azken mezua ikusi';
+$labels['lastmessages'] = 'Azken mezu sorta ikusi';
+$labels['backtolist'] = 'Mezu zerrendara itzuli';
+$labels['viewsource'] = 'Jatorria bistarazi';
+$labels['select'] = 'Hautatu';
+$labels['all'] = 'Denak';
+$labels['none'] = 'Batez';
+$labels['unread'] = 'Irakurri gabeak';
+$labels['compact'] = 'Trinkotu';
+$labels['empty'] = 'Hustu';
+$labels['purge'] = 'Garbitu';
+$labels['quota'] = 'Disko erabilera';
+$labels['unknown'] = 'ezezaguna';
+$labels['unlimited'] = 'mugagabea';
+$labels['quicksearch'] = 'Bilaketa azkarra';
+$labels['resetsearch'] = 'Bilaketa berrabiarazi';
+$labels['compose'] = 'Mezu bat sortu';
+$labels['sendmessage'] = 'Mezua orain bidali';
+$labels['savemessage'] = 'Zirriborro hau gorde';
+$labels['addattachment'] = 'Fitxategia erantsi';
+$labels['charset'] = 'Karaktere jokoa';
+$labels['editortype'] = 'Editore mota';
+$labels['returnreceipt'] = 'Bidaltzaileari itzuli';
+$labels['checkspelling'] = 'Egiaztaketa ortografikoa';
+$labels['resumeediting'] = 'Editatzen jarraitu';
+$labels['revertto'] = 'Itzuli hona';
+$labels['attachments'] = 'Eranskinak';
+$labels['upload'] = 'Igo';
+$labels['close'] = 'Itxi';
+$labels['low'] = 'Baxua';
+$labels['lowest'] = 'Baxuena';
+$labels['normal'] = 'Normala';
+$labels['high'] = 'Altua';
+$labels['highest'] = 'Altuena';
+$labels['nosubject'] = '(gairik gabea)';
+$labels['showimages'] = 'Irudiak bistarazi';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Testu laua';
+$labels['name'] = 'Izena bistarazi';
+$labels['firstname'] = 'Izena';
+$labels['surname'] = 'Abizena';
+$labels['email'] = 'ePosta';
+$labels['addcontact'] = 'Txartel berria gehitu';
+$labels['editcontact'] = 'Txartela editatu';
+$labels['edit'] = 'Editatu';
+$labels['cancel'] = 'Utzi';
+$labels['save'] = 'Gorde';
+$labels['delete'] = 'Ezabatu';
+$labels['newcontact'] = 'Helbide liburu txartel berria sortu';
+$labels['deletecontact'] = 'Aukeraturiko txartelak ezabatu';
+$labels['composeto'] = 'Bidali mezua honi: ';
+$labels['contactsfromto'] = '$from -tik $to -ra $count txarteletatik';
+$labels['print'] = 'Inprimatu';
+$labels['export'] = 'Esportatu';
+$labels['previouspage'] = 'Aurreko sorta ikusi';
+$labels['firstpage'] = 'Lehenengo sorta ikusi';
+$labels['nextpage'] = 'Hurrengo sorta ikusi';
+$labels['lastpage'] = 'Azken sorta ikusi';
+$labels['groups'] = 'Taldeak';
+$labels['personaladrbook'] = 'Helbide pertsonalak';
+$labels['settingsfor'] = 'Honen ezarpenak:';
+$labels['preferences'] = 'Hobespenak';
+$labels['userpreferences'] = 'Erabiltzaile hobespenak';
+$labels['editpreferences'] = 'Erabiltzaile hobespenak editatu';
+$labels['identities'] = 'Identitateak';
+$labels['manageidentities'] = 'Kontu honetako identitateak kudeatu';
+$labels['newidentity'] = 'Identitate berria';
+$labels['newitem'] = 'Elementu berria';
+$labels['edititem'] = 'Elementua Editatu';
+$labels['setdefault'] = 'Lehenespenak ezarri';
+$labels['language'] = 'Hizkuntza';
+$labels['timezone'] = 'Ordu zonaldea';
+$labels['pagesize'] = 'Lerro orrialdeko';
+$labels['signature'] = 'Sinadura';
+$labels['dstactive'] = 'Eguneko gordeketak';
+$labels['htmleditor'] = 'HTML mezuak sortu';
+$labels['htmlsignature'] = 'HTML sinadura';
+$labels['previewpane'] = 'Aurrebista panela ikusi';
+$labels['autosavedraft'] = 'Zirriborroa automatikoki gorde';
+$labels['everynminutes'] = '$n minuturo';
+$labels['never'] = 'inoiz';
+$labels['folder'] = 'Karpeta';
+$labels['folders'] = 'Karpetak';
+$labels['foldername'] = 'Karpeta izena';
+$labels['subscribed'] = 'Harpideturik';
+$labels['create'] = 'Sortu';
+$labels['createfolder'] = 'Karpeta berria sortu';
+$labels['rename'] = 'Berrizendatu';
+$labels['renamefolder'] = 'Karpeta berrizendatu';
+$labels['deletefolder'] = 'Karpeta ezabatu';
+$labels['managefolders'] = 'Karpeta kudeaketa';
+$labels['sortby'] = 'Honela ordenatu';
+$labels['sortasc'] = 'Goraka ordenatu';
+$labels['sortdesc'] = 'Beheraka ordenatu';
+
+?>
\ No newline at end of file
diff --git a/program/localization/eu_ES/messages.inc b/program/localization/eu_ES/messages.inc
new file mode 100644 (file)
index 0000000..279efd8
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/eu/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: pi <pi@beobide.net>                                           |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Saio sarrerak huts egin du';
+$messages['cookiesdisabled'] = 'Zure nabigatzaileak ez ditu cookie-ak onartzen';
+$messages['sessionerror'] = 'Zure saioa baliogabea da edo iraungita dago';
+$messages['imaperror'] = 'Huts IMAP zerbitzarira konektatzerakoan';
+$messages['nomessagesfound'] = 'Ez da mezurik aurkitu posta kutxa honetan';
+$messages['loggedout'] = 'Saioa behar bezala amaitu duzu. Agur!';
+$messages['mailboxempty'] = 'Posta kutxa hutsik dago';
+$messages['loading'] = 'Kargatzen...';
+$messages['loadingdata'] = 'Datuak kargatzen...';
+$messages['checkingmail'] = 'Mezu berrien bila arakatzen...';
+$messages['sendingmessage'] = 'Mezua bidaltzen...';
+$messages['messagesent'] = 'Mezua behar bezala bidali da';
+$messages['savingmessage'] = 'Mezua gordetzen...';
+$messages['messagesaved'] = 'Mezua zirriborroetan gordea';
+$messages['successfullysaved'] = 'Behar bezala gorde da';
+$messages['addedsuccessfully'] = 'Txartela behar bezala gehitu da helbide liburura';
+$messages['contactexists'] = 'ePosta honetako txartel bat badago dagoeneko';
+$messages['blockedimages'] = 'Zure pribazitatea mantentzeko urruneko irudiak blokeatu egin dira.';
+$messages['encryptedmessage'] = 'Hau enkriptaturiko mezu bat da eta ezin da bistarazi. Barkatu!';
+$messages['nocontactsfound'] = 'Ez da txartelik aurkitu';
+$messages['sendingfailed'] = 'Huts mezua bidaltzerakoan';
+$messages['errorsaving'] = 'Errore bat gertatu da gordetzerakoan';
+$messages['errormoving'] = 'Ezin da mezua mugitu';
+$messages['errordeleting'] = 'Ezin da mezua ezabatu';
+$messages['deletecontactconfirm'] = 'Benetan hautaturiko kontaktuak ezabatu nahi dituzula?';
+$messages['deletemessagesconfirm'] = 'Benetan hautaturiko mezuak ezabatu nahi dituzula?';
+$messages['deletefolderconfirm'] = 'Benetan Karpeta hau ezabatu nahi duzu?';
+$messages['purgefolderconfirm'] = 'Benetan karpeta honetako mezu guziak ezabatu nahi dituzu?';
+$messages['formincomplete'] = 'Inprimakia ez guztiz bete';
+$messages['noemailwarning'] = 'Mesedez idatzi baliozko eposta helbide bat';
+$messages['nonamewarning'] = 'Mesedez izen bat idatzi';
+$messages['nopagesizewarning'] = 'Mesedez paper tamaina idatzi';
+$messages['norecipientwarning'] = 'Mesedez behintzat hartzaile bat idatzi';
+$messages['nosubjectwarning'] = '"Gaia" eremua hutsik dago. Bat idatzi nahi al duzu?';
+$messages['nobodywarning'] = 'Testu gabeko mezu hau bidali?';
+$messages['notsentwarning'] = 'Mezua ez da bidali. Mezua ezeztatu nahi al duzu?';
+$messages['noldapserver'] = 'Mesedez hautatu bilaketa egiteko LDAP zerbitzari bat';
+$messages['nocontactsreturned'] = 'Ez da kontakturik aurkitu';
+$messages['nosearchname'] = 'Mesedez idatzi kontaktu izen bat edo eposta helbide bat';
+$messages['searchsuccessful'] = '$nr mezu aurkiturik';
+$messages['searchnomatch'] = 'Bilaketak ez du emaitzarik itzuli';
+$messages['searching'] = 'Bilatzen...';
+$messages['checking'] = 'Arakatzen...';
+$messages['nospellerrors'] = 'Ez da ortografia errorerik aurkitu';
+$messages['folderdeleted'] = 'Karpeta behar bezala ezabatu da';
+$messages['deletedsuccessfully'] = 'Behar bezala ezabatu da';
+$messages['converting'] = 'Mezuaren formatua ezabatzen';
+$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/fi/labels.inc b/program/localization/fi/labels.inc
deleted file mode 100644 (file)
index b156120..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/fi/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Ville Alatalo <ville@alatalo.org>                             |
- |         Veljo Velling <veve@utu.fi>                                   |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Tervetuloa $product -käyttäjäksi';
-$labels['username'] = 'Käyttäjätunnus';
-$labels['password'] = 'Salasana';
-$labels['server'] = 'Palvelin';
-$labels['login'] = 'Kirjaudu';
-$labels['logout'] = 'Kirjaudu ulos';
-$labels['mail'] = 'Sähköposti';
-$labels['settings'] = 'Omat asetukset';
-$labels['addressbook'] = 'Osoitekirja';
-$labels['inbox'] = 'Saapuneet';
-$labels['drafts'] = 'Luonnokset';
-$labels['sent'] = 'Lähetetyt';
-$labels['trash'] = 'Roskakori';
-$labels['junk'] = 'Roskaposti';
-$labels['subject'] = 'Aihe';
-$labels['from'] = 'Lähettäjä';
-$labels['to'] = 'Vastaanottaja';
-$labels['cc'] = 'Kopio';
-$labels['bcc'] = 'Piilokopio';
-$labels['replyto'] = 'Vastaus osoitteeseen';
-$labels['date'] = 'Päiväys';
-$labels['size'] = 'Koko';
-$labels['priority'] = 'Tärkeys';
-$labels['organization'] = 'Organisaatio';
-$labels['reply-to'] = 'Vastaus osoitteeseen';
-$labels['mailboxlist'] = 'Kansiot';
-$labels['messagesfromto'] = 'Viestit $from-$to/$count';
-$labels['messagenrof'] = 'Viesti $nr/$count';
-$labels['moveto'] = 'siirrä kansioon...';
-$labels['download'] = 'lataa';
-$labels['filename'] = 'Tiedoston nimi';
-$labels['filesize'] = 'Tiedoston koko';
-$labels['preferhtml'] = 'Käytä HTML:aa';
-$labels['htmlmessage'] = 'HTML-viesti';
-$labels['prettydate'] = 'Nätit päiväykset';
-$labels['addtoaddressbook'] = 'Lisää osoitekirjaan';
-$labels['sun'] = 'Su';
-$labels['mon'] = 'Ma';
-$labels['tue'] = 'Ti';
-$labels['wed'] = 'Ke';
-$labels['thu'] = 'To';
-$labels['fri'] = 'Pe';
-$labels['sat'] = 'La';
-$labels['sunday'] = 'Sunnuntai';
-$labels['monday'] = 'Maanantai';
-$labels['tuesday'] = 'Tiistai';
-$labels['wednesday'] = 'Keskiviikko';
-$labels['thursday'] = 'Torstai';
-$labels['friday'] = 'Perjantai';
-$labels['saturday'] = 'Lauantai';
-$labels['today'] = 'Tänään';
-$labels['checkmail'] = 'Tarkista saapuneet viestit';
-$labels['writenewmessage'] = 'Kirjoita uusi viesti';
-$labels['replytomessage'] = 'Vastaa viestiin';
-$labels['replytoallmessage'] = 'Vastaa kaikille';
-$labels['forwardmessage'] = 'Välitä viesti';
-$labels['deletemessage'] = 'Poista viesti';
-$labels['movemessagetotrash'] = 'Siirrä viesti roskakoriin';
-$labels['printmessage'] = 'Tulosta viesti';
-$labels['previousmessage'] = 'Näytä edellinen viesti';
-$labels['previousmessages'] = 'Näytä edelliset viestit';
-$labels['firstmessage'] = 'Näytä ensimmäinen viesti';
-$labels['firstmessages'] = 'Näytä ensimmäinen viestiluettelo';
-$labels['nextmessage'] = 'Näytä edellinen viesti';
-$labels['nextmessages'] = 'Näytä seuraavat viestit';
-$labels['lastmessage'] = 'Näytä viimeinen viesti';
-$labels['lastmessages'] = 'Näytä viimeinen viestiluettelo';
-$labels['backtolist'] = 'Takaisin viesteihin';
-$labels['viewsource'] = 'Näytä lähdekoodi';
-$labels['markmessages'] = 'Merkitse viestit';
-$labels['markread'] = 'luetuiksi';
-$labels['markunread'] = 'ei-luetuiksi';
-$labels['select'] = 'Valitse';
-$labels['all'] = 'Kaikki';
-$labels['none'] = 'Ei mitään';
-$labels['unread'] = 'Lukemattomat';
-$labels['compact'] = 'Tiivistä';
-$labels['empty'] = 'Tyhjennä';
-$labels['purge'] = 'Puhdista';
-$labels['quota'] = 'Levytila';
-$labels['unknown'] = 'tuntematon';
-$labels['unlimited'] = 'rajoittamaton';
-$labels['quicksearch'] = 'Pikahaku';
-$labels['resetsearch'] = 'Nollaa haku';
-$labels['compose'] = 'Viestin kirjoitus';
-$labels['savemessage'] = 'Tallenna tämä luonnos';
-$labels['sendmessage'] = 'Lähetä viesti';
-$labels['addattachment'] = 'Liitetiedosto';
-$labels['charset'] = 'Merkistö';
-$labels['editortype'] = 'Editorin tyyppi';
-$labels['returnreceipt'] = 'Perillesaapumisilmoitus';
-$labels['checkspelling'] = 'Tarkista oikeinkirjoitus';
-$labels['resumeediting'] = 'Jatka muokkausta';
-$labels['revertto'] = 'Muuta takaisin';
-$labels['attachments'] = 'Liitetiedostot';
-$labels['upload'] = 'Lisää';
-$labels['close'] = 'Sulje';
-$labels['low'] = 'Matala';
-$labels['lowest'] = 'Matalin';
-$labels['normal'] = 'Normaali';
-$labels['high'] = 'Korkea';
-$labels['highest'] = 'Korkein';
-$labels['nosubject'] = '(ei otsikkoa)';
-$labels['showimages'] = 'Näytä kuvat';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Tavallinen teksti';
-$labels['addcc'] = 'Lisää kopio';
-$labels['addbcc'] = 'Lisää piilokopio';
-$labels['addreplyto'] = 'Lisää vastausosoite';
-$labels['mdnrequest'] = 'Viestin lähettäjä on pyytänyt kuittauksen siitä että olet lukenut viestin. Haluatko lähettää kuittauksen?';
-$labels['receiptread'] = 'Lukukuittaus';
-$labels['yourmessage'] = 'Tämä viesti on kuittaus lähettämällesi viestille';
-$labels['receiptnote'] = 'Huom! Kuittaus kertoo vain siitä, että viesti on avattu vastaanottajan tietokoneella. Se ei tarkoita että vastaanottaja on myös lukenut tai ymmärtänyt viestin.';
-$labels['name'] = 'Näkyvä nimi';
-$labels['firstname'] = 'Etunimi';
-$labels['surname'] = 'Sukunimi';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Lisää valittu kontakti osoitekirjaan';
-$labels['editcontact'] = 'Muokkaa kontaktia';
-$labels['edit'] = 'Muokkaa';
-$labels['cancel'] = 'Peruuta';
-$labels['save'] = 'Tallenna';
-$labels['delete'] = 'Poista';
-$labels['newcontact'] = 'Luo uusi kontakti';
-$labels['deletecontact'] = 'Poista valitut kontaktit';
-$labels['composeto'] = 'Kirjoita viesti kontaktille';
-$labels['contactsfromto'] = 'Kontaktit $from-$to/$count';
-$labels['print'] = 'Tulosta';
-$labels['export'] = 'Vie (export)';
-$labels['previouspage'] = 'Näytä edellinen luettelo';
-$labels['firstpage'] = 'Näytä ensimmäinen luettelo';
-$labels['nextpage'] = 'Näytä seuraava luettelo';
-$labels['lastpage'] = 'Näytä viimeinen luettelo';
-$labels['groups'] = 'Ryhmät';
-$labels['personaladrbook'] = 'Hensilökohtaiset osoitteet';
-$labels['settingsfor'] = 'Asetukset';
-$labels['preferences'] = 'Asetukset';
-$labels['userpreferences'] = 'Käyttäjän asetukset';
-$labels['editpreferences'] = 'Muokkaa käyttäjän asetuksia';
-$labels['identities'] = 'Identiteetit';
-$labels['manageidentities'] = 'Muokkaa tunnuksen identiteettejä';
-$labels['newidentity'] = 'Uusi identiteetti';
-$labels['newitem'] = 'Uusi';
-$labels['edititem'] = 'Muokkaa';
-$labels['setdefault'] = 'Aseta vakioksi';
-$labels['language'] = 'Kieli';
-$labels['timezone'] = 'Aikavyöhyke';
-$labels['pagesize'] = 'Rivejä sivulla';
-$labels['signature'] = 'Allekirjoitus';
-$labels['dstactive'] = 'Kesäaika';
-$labels['htmleditor'] = 'Kirjoita HTML-muodossa';
-$labels['htmlsignature'] = 'HTML-allekirjoitus';
-$labels['previewpane'] = 'Näytä esikatselulehti';
-$labels['autosavedraft'] = 'Tallenna luonnos automaattisesti';
-$labels['everynminutes'] = '$n minuutin välein';
-$labels['never'] = 'ei koskaan';
-$labels['folder'] = 'Kansio';
-$labels['folders'] = 'Kansiot';
-$labels['foldername'] = 'Kansion nimi';
-$labels['subscribed'] = 'Näytetään';
-$labels['messagecount'] = 'Viestejä';
-$labels['create'] = 'Luo uusi';
-$labels['createfolder'] = 'Luo uusi kansio';
-$labels['rename'] = 'Nimeä uudelleen';
-$labels['renamefolder'] = 'Nimeä kansio uudelleen';
-$labels['deletefolder'] = 'Poista kansio';
-$labels['managefolders'] = 'Kansioiden ylläpito';
-$labels['sortby'] = 'Järjestä';
-$labels['sortasc'] = 'Järjestä nousevasti (a-ö)';
-$labels['sortdesc'] = 'Järjestä laskevasti (ö-a)';
-
-?>
\ No newline at end of file
diff --git a/program/localization/fi/messages.inc b/program/localization/fi/messages.inc
deleted file mode 100644 (file)
index e4e1a59..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/fi/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Ville Alatalo <ville@alatalo.org>                             |
- |         Veljo Velling <veve@utu.fi>                                   |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1151 2008-02-28 19:56:47Z thomasb $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Sisäänkirjautuminen epäonnistui';
-$messages['cookiesdisabled'] = 'Selaimesi ei hyväksy evästeitä';
-$messages['sessionerror'] = 'Sessio ei kelpaa tai ei ole enää voimassa';
-$messages['imaperror'] = 'Yhteys IMAP-palvelimeen epäonnistui';
-$messages['nomessagesfound'] = 'Kansiossa ei ole sähköpostiviestejä';
-$messages['loggedout'] = 'Sinut on kirjattu ulos järjestelmästä.';
-$messages['mailboxempty'] = 'Kansio on tyhjä';
-$messages['loading'] = 'Ladataan...';
-$messages['loadingdata'] = 'Ladataan tietoja...';
-$messages['checkingmail'] = 'Tarkistetaan saapuneita viestejä...';
-$messages['sendingmessage'] = 'Lähetetään viestiä...';
-$messages['messagesent'] = 'Viesti lähetetty';
-$messages['savingmessage'] = 'Tallennetaan viestiä...';
-$messages['messagesaved'] = 'Viesti tallennettu "Luonnokset" -kansioon';
-$messages['successfullysaved'] = 'Tallennus onnistui';
-$messages['addedsuccessfully'] = 'Kontakti lisätty osoitekirjaan';
-$messages['contactexists'] = 'Samalla sähköpostiosoitteella on jo olemassa kontakti';
-$messages['blockedimages'] = 'Turvallisuussyistä viestin kuvia ei näytetty.';
-$messages['encryptedmessage'] = 'Viesti on salattu, eikä sitä voida näyttää.';
-$messages['nocontactsfound'] = 'Ei kontakteja';
-$messages['contactnotfound'] = 'Pyydettyä yhteystietoa ei löytynyt';
-$messages['sendingfailed'] = 'Viestin lähetys epäonnistui';
-$messages['errorsaving'] = 'Tallennuksessa tapahtui virhe';
-$messages['errormoving'] = 'Viestiä ei voitu siirtää';
-$messages['errordeleting'] = 'Viestiä ei voitu poistaa';
-$messages['deletecontactconfirm'] = 'Haluatko varmasti poistaa valitut kontaktit?';
-$messages['deletemessagesconfirm'] = 'Haluatko varmasti poistaa valitut viestit?';
-$messages['deletefolderconfirm'] = 'Haluatko varmasti poistaa kansion?';
-$messages['purgefolderconfirm'] = 'Haluatko varmasti poistaa kaikki viestit kansiosta?';
-$messages['formincomplete'] = 'Lomakkeen tiedot olivat puutteelliset';
-$messages['noemailwarning'] = 'Anna sähköpostiosoite';
-$messages['nonamewarning'] = 'Anna nimi';
-$messages['nopagesizewarning'] = 'Anna sivukoko';
-$messages['norecipientwarning'] = 'Anna ainakin yksi vastaanottaja';
-$messages['nosubjectwarning'] = '"Otsikko" -kenttä on tyhjä. Haluaisitko kirjoittaa viestillesi otsikon?';
-$messages['nobodywarning'] = 'Lähetetäänkö viesti ilman tekstiä?';
-$messages['notsentwarning'] = 'Viestiä ei lähethttp://translator.roundcube.net/index.phpetty. Haluatko poistaa viestin?';
-$messages['noldapserver'] = 'Valitse LDAP -palvelin';
-$messages['nocontactsreturned'] = 'Yhtään kontaktia ei löytynyt';
-$messages['nosearchname'] = 'Anna kontaktin nimi tai sähköpostiosoite';
-$messages['searchsuccessful'] = 'Löydetty $nr viestiä';
-$messages['searchnomatch'] = 'Haku ei tuottanut tuloksia';
-$messages['searching'] = 'Etsitään...';
-$messages['checking'] = 'Tarkistetaan...';
-$messages['nospellerrors'] = 'Kirjoitusvirheitä ei löytynyt';
-$messages['folderdeleted'] = 'Kansio poistettu onnistuneesti';
-$messages['deletedsuccessfully'] = 'Poistettu onnistuneesti';
-$messages['converting'] = 'Poistetaan asettelu viestistä...';
-$messages['messageopenerror'] = 'Virhe kopioitaessa viestiä palvelimelta';
-$messages['fileuploaderror'] = 'Tiedoston lähettäminen epäonnistui';
-$messages['filesizeerror'] = 'Lähetettävä tiedosto ylittää sallitun enimmäiskoon $size';
-$messages['copysuccess'] = 'Kopioitu $nr osoitetta onnistuneesti';
-$messages['copyerror'] = 'Yhtään osoitetta ei voitu kopioida';
-$messages['sourceisreadonly'] = 'Tämän osoitteen lähde on kirjoitussuojattu';
-$messages['errorsavingcontact'] = 'Yhteystietoa ei voitu tallentaa';
-$messages['movingmessage'] = 'Siirretään viestiä...';
-$messages['receiptsent'] = 'Lukukuittaus lähetetty onnistuneesti';
-$messages['errorsendingreceipt'] = 'Lukukuittausta ei voitu lähettää';
-$messages['nodeletelastidentity'] = 'Et voi poistaa tätä identiteettiä, koska se on ainoa jäljelläoleva';
-$messages['addsubfolderhint'] = 'Uusi kansio luodaan valitun kansion alikansiona';
-
-?>
\ No newline at end of file
diff --git a/program/localization/fi_FI/labels.inc b/program/localization/fi_FI/labels.inc
new file mode 100644 (file)
index 0000000..63a3039
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/fi/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Ville Alatalo <ville@alatalo.org>                             |
+|         Veljo Velling <veve@utu.fi>                                   |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 1462 2008-06-01 15:40:16Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Tervetuloa $product -käyttäjäksi';
+$labels['username'] = 'Käyttäjätunnus';
+$labels['password'] = 'Salasana';
+$labels['server'] = 'Palvelin';
+$labels['login'] = 'Kirjaudu';
+$labels['logout'] = 'Kirjaudu ulos';
+$labels['mail'] = 'Sähköposti';
+$labels['settings'] = 'Omat asetukset';
+$labels['addressbook'] = 'Osoitekirja';
+$labels['inbox'] = 'Saapuneet';
+$labels['drafts'] = 'Luonnokset';
+$labels['sent'] = 'Lähetetyt';
+$labels['trash'] = 'Roskakori';
+$labels['junk'] = 'Roskaposti';
+$labels['subject'] = 'Aihe';
+$labels['from'] = 'Lähettäjä';
+$labels['to'] = 'Vastaanottaja';
+$labels['cc'] = 'Kopio';
+$labels['bcc'] = 'Piilokopio';
+$labels['replyto'] = 'Vastaus osoitteeseen';
+$labels['date'] = 'Päiväys';
+$labels['size'] = 'Koko';
+$labels['priority'] = 'Tärkeys';
+$labels['organization'] = 'Organisaatio';
+$labels['reply-to'] = 'Vastaus osoitteeseen';
+$labels['mailboxlist'] = 'Kansiot';
+$labels['messagesfromto'] = 'Viestit $from-$to/$count';
+$labels['messagenrof'] = 'Viesti $nr/$count';
+$labels['moveto'] = 'siirrä kansioon...';
+$labels['download'] = 'lataa';
+$labels['filename'] = 'Tiedoston nimi';
+$labels['filesize'] = 'Tiedoston koko';
+$labels['preferhtml'] = 'Käytä HTML:aa';
+$labels['htmlmessage'] = 'HTML-viesti';
+$labels['prettydate'] = 'Nätit päiväykset';
+$labels['addtoaddressbook'] = 'Lisää osoitekirjaan';
+$labels['sun'] = 'Su';
+$labels['mon'] = 'Ma';
+$labels['tue'] = 'Ti';
+$labels['wed'] = 'Ke';
+$labels['thu'] = 'To';
+$labels['fri'] = 'Pe';
+$labels['sat'] = 'La';
+$labels['sunday'] = 'Sunnuntai';
+$labels['monday'] = 'Maanantai';
+$labels['tuesday'] = 'Tiistai';
+$labels['wednesday'] = 'Keskiviikko';
+$labels['thursday'] = 'Torstai';
+$labels['friday'] = 'Perjantai';
+$labels['saturday'] = 'Lauantai';
+$labels['jan'] = 'Tammi';
+$labels['feb'] = 'Helmi';
+$labels['mar'] = 'Maalis';
+$labels['apr'] = 'Huhti';
+$labels['may'] = 'Touko';
+$labels['jun'] = 'Kesä';
+$labels['jul'] = 'Heinä';
+$labels['aug'] = 'Elo';
+$labels['sep'] = 'Syys';
+$labels['oct'] = 'Loka';
+$labels['nov'] = 'Marras';
+$labels['dec'] = 'Joulu';
+$labels['longjan'] = 'Tammikuu';
+$labels['longfeb'] = 'Helmikuu';
+$labels['longmar'] = 'Maaliskuu';
+$labels['longapr'] = 'Huhtikuu';
+$labels['longmay'] = 'Toukokuu';
+$labels['longjun'] = 'Kesäkuu';
+$labels['longjul'] = 'Heinäkuu';
+$labels['longaug'] = 'Elokuu';
+$labels['longsep'] = 'Syyskuu';
+$labels['longoct'] = 'Lokakuu';
+$labels['longnov'] = 'Marraskuu';
+$labels['longdec'] = 'Joulukuu';
+$labels['today'] = 'Tänään';
+$labels['checkmail'] = 'Tarkista saapuneet viestit';
+$labels['writenewmessage'] = 'Kirjoita uusi viesti';
+$labels['replytomessage'] = 'Vastaa viestiin';
+$labels['replytoallmessage'] = 'Vastaa kaikille';
+$labels['forwardmessage'] = 'Välitä viesti';
+$labels['deletemessage'] = 'Poista viesti';
+$labels['movemessagetotrash'] = 'Siirrä viesti roskakoriin';
+$labels['printmessage'] = 'Tulosta viesti';
+$labels['previousmessage'] = 'Näytä edellinen viesti';
+$labels['previousmessages'] = 'Näytä edelliset viestit';
+$labels['firstmessage'] = 'Näytä ensimmäinen viesti';
+$labels['firstmessages'] = 'Näytä ensimmäinen viestiluettelo';
+$labels['nextmessage'] = 'Näytä edellinen viesti';
+$labels['nextmessages'] = 'Näytä seuraavat viestit';
+$labels['lastmessage'] = 'Näytä viimeinen viesti';
+$labels['lastmessages'] = 'Näytä viimeinen viestiluettelo';
+$labels['backtolist'] = 'Takaisin viesteihin';
+$labels['viewsource'] = 'Näytä lähdekoodi';
+$labels['markmessages'] = 'Merkitse viestit';
+$labels['markread'] = 'luetuiksi';
+$labels['markunread'] = 'ei-luetuiksi';
+$labels['select'] = 'Valitse';
+$labels['all'] = 'Kaikki';
+$labels['none'] = 'Ei mitään';
+$labels['unread'] = 'Lukemattomat';
+$labels['compact'] = 'Tiivistä';
+$labels['empty'] = 'Tyhjennä';
+$labels['purge'] = 'Puhdista';
+$labels['quota'] = 'Levytila';
+$labels['unknown'] = 'tuntematon';
+$labels['unlimited'] = 'rajoittamaton';
+$labels['quicksearch'] = 'Pikahaku';
+$labels['resetsearch'] = 'Nollaa haku';
+$labels['compose'] = 'Viestin kirjoitus';
+$labels['savemessage'] = 'Tallenna tämä luonnos';
+$labels['sendmessage'] = 'Lähetä viesti';
+$labels['addattachment'] = 'Liitetiedosto';
+$labels['charset'] = 'Merkistö';
+$labels['editortype'] = 'Editorin tyyppi';
+$labels['returnreceipt'] = 'Perillesaapumisilmoitus';
+$labels['checkspelling'] = 'Tarkista oikeinkirjoitus';
+$labels['resumeediting'] = 'Jatka muokkausta';
+$labels['revertto'] = 'Muuta takaisin';
+$labels['attachments'] = 'Liitetiedostot';
+$labels['upload'] = 'Lisää';
+$labels['close'] = 'Sulje';
+$labels['low'] = 'Matala';
+$labels['lowest'] = 'Matalin';
+$labels['normal'] = 'Normaali';
+$labels['high'] = 'Korkea';
+$labels['highest'] = 'Korkein';
+$labels['nosubject'] = '(ei otsikkoa)';
+$labels['showimages'] = 'Näytä kuvat';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Tavallinen teksti';
+$labels['addcc'] = 'Lisää kopio';
+$labels['addbcc'] = 'Lisää piilokopio';
+$labels['addreplyto'] = 'Lisää vastausosoite';
+$labels['mdnrequest'] = 'Viestin lähettäjä on pyytänyt kuittauksen siitä että olet lukenut viestin. Haluatko lähettää kuittauksen?';
+$labels['receiptread'] = 'Lukukuittaus';
+$labels['yourmessage'] = 'Tämä viesti on kuittaus lähettämällesi viestille';
+$labels['receiptnote'] = 'Huom! Kuittaus tarkoittaa vain sitä, että viesti on avattu vastaanottajan tietokoneella. Se ei tarkoita että vastaanottaja on myös lukenut tai ymmärtänyt viestin.';
+$labels['name'] = 'Näkyvä nimi';
+$labels['firstname'] = 'Etunimi';
+$labels['surname'] = 'Sukunimi';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Lisää valittu kontakti osoitekirjaan';
+$labels['editcontact'] = 'Muokkaa kontaktia';
+$labels['edit'] = 'Muokkaa';
+$labels['cancel'] = 'Peruuta';
+$labels['save'] = 'Tallenna';
+$labels['delete'] = 'Poista';
+$labels['newcontact'] = 'Luo uusi kontakti';
+$labels['deletecontact'] = 'Poista valitut kontaktit';
+$labels['composeto'] = 'Kirjoita viesti kontaktille';
+$labels['contactsfromto'] = 'Kontaktit $from-$to/$count';
+$labels['print'] = 'Tulosta';
+$labels['export'] = 'Vie (export)';
+$labels['previouspage'] = 'Näytä edellinen luettelo';
+$labels['firstpage'] = 'Näytä ensimmäinen luettelo';
+$labels['nextpage'] = 'Näytä seuraava luettelo';
+$labels['lastpage'] = 'Näytä viimeinen luettelo';
+$labels['groups'] = 'Ryhmät';
+$labels['personaladrbook'] = 'Hensilökohtaiset osoitteet';
+$labels['settingsfor'] = 'Asetukset';
+$labels['preferences'] = 'Asetukset';
+$labels['userpreferences'] = 'Käyttäjän asetukset';
+$labels['editpreferences'] = 'Muokkaa käyttäjän asetuksia';
+$labels['identities'] = 'Identiteetit';
+$labels['manageidentities'] = 'Muokkaa tunnuksen identiteettejä';
+$labels['newidentity'] = 'Uusi identiteetti';
+$labels['newitem'] = 'Uusi';
+$labels['edititem'] = 'Muokkaa';
+$labels['setdefault'] = 'Aseta vakioksi';
+$labels['language'] = 'Kieli';
+$labels['timezone'] = 'Aikavyöhyke';
+$labels['pagesize'] = 'Rivejä sivulla';
+$labels['signature'] = 'Allekirjoitus';
+$labels['dstactive'] = 'Kesäaika';
+$labels['htmleditor'] = 'Kirjoita HTML-muodossa';
+$labels['htmlsignature'] = 'HTML-allekirjoitus';
+$labels['previewpane'] = 'Näytä esikatselulehti';
+$labels['logoutclear'] = 'Tyhjennä roskakori ulos kirjautuessa';
+$labels['logoutcompact'] = 'Tiivistä kansiot ulos kirjautuessa';
+$labels['uisettings'] = 'Käyttöliittymä';
+$labels['serversettings'] = 'Palvelinasetukset';
+$labels['mailboxview'] = 'Postilaatikkonäkymä';
+$labels['mdnrequests'] = 'Lähettäjän kuittaukset';
+$labels['askuser'] = 'kysy käyttäjältä';
+$labels['autosend'] = 'lähetä automaattisesti';
+$labels['ignore'] = 'jätä huomiotta';
+$labels['readwhendeleted'] = 'Merkitse poistettavat viestit luetuiksi';
+$labels['flagfordeletion'] = 'Poistamisen sijaan, merkitse viestit poistettavaksi';
+$labels['autosavedraft'] = 'Tallenna luonnos automaattisesti';
+$labels['everynminutes'] = '$n minuutin välein';
+$labels['never'] = 'ei koskaan';
+$labels['folder'] = 'Kansio';
+$labels['folders'] = 'Kansiot';
+$labels['foldername'] = 'Kansion nimi';
+$labels['subscribed'] = 'Näytetään';
+$labels['messagecount'] = 'Viestejä';
+$labels['create'] = 'Luo uusi';
+$labels['createfolder'] = 'Luo uusi kansio';
+$labels['rename'] = 'Nimeä uudelleen';
+$labels['renamefolder'] = 'Nimeä kansio uudelleen';
+$labels['deletefolder'] = 'Poista kansio';
+$labels['managefolders'] = 'Kansioiden ylläpito';
+$labels['sortby'] = 'Järjestä';
+$labels['sortasc'] = 'Järjestä nousevasti (a-ö)';
+$labels['sortdesc'] = 'Järjestä laskevasti (ö-a)';
+
+?>
diff --git a/program/localization/fi_FI/messages.inc b/program/localization/fi_FI/messages.inc
new file mode 100644 (file)
index 0000000..d6b5129
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/fi/messages.inc                                              |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Ville Alatalo <ville@alatalo.org>                             |
+|         Veljo Velling <veve@utu.fi>                                   |
++-----------------------------------------------------------------------+
+
+@version $Id: messages.inc 1462 2008-06-01 15:40:16Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Sisäänkirjautuminen epäonnistui';
+$messages['cookiesdisabled'] = 'Selaimesi ei hyväksy evästeitä';
+$messages['sessionerror'] = 'Sessio ei kelpaa tai ei ole enää voimassa';
+$messages['imaperror'] = 'Yhteys IMAP-palvelimeen epäonnistui';
+$messages['nomessagesfound'] = 'Kansiossa ei ole sähköpostiviestejä';
+$messages['loggedout'] = 'Sinut on kirjattu ulos järjestelmästä.';
+$messages['mailboxempty'] = 'Kansio on tyhjä';
+$messages['loading'] = 'Ladataan...';
+$messages['loadingdata'] = 'Ladataan tietoja...';
+$messages['checkingmail'] = 'Tarkistetaan saapuneita viestejä...';
+$messages['sendingmessage'] = 'Lähetetään viestiä...';
+$messages['messagesent'] = 'Viesti lähetetty';
+$messages['savingmessage'] = 'Tallennetaan viestiä...';
+$messages['messagesaved'] = 'Viesti tallennettu "Luonnokset" -kansioon';
+$messages['successfullysaved'] = 'Tallennus onnistui';
+$messages['addedsuccessfully'] = 'Kontakti lisätty osoitekirjaan';
+$messages['contactexists'] = 'Samalla sähköpostiosoitteella on jo olemassa kontakti';
+$messages['blockedimages'] = 'Turvallisuussyistä viestin kuvia ei näytetty.';
+$messages['encryptedmessage'] = 'Viesti on salattu, eikä sitä voida näyttää.';
+$messages['nocontactsfound'] = 'Ei kontakteja';
+$messages['contactnotfound'] = 'Pyydettyä yhteystietoa ei löytynyt';
+$messages['sendingfailed'] = 'Viestin lähetys epäonnistui';
+$messages['errorsaving'] = 'Tallennuksessa tapahtui virhe';
+$messages['errormoving'] = 'Viestiä ei voitu siirtää';
+$messages['errordeleting'] = 'Viestiä ei voitu poistaa';
+$messages['deletecontactconfirm'] = 'Haluatko varmasti poistaa valitut kontaktit?';
+$messages['deletemessagesconfirm'] = 'Haluatko varmasti poistaa valitut viestit?';
+$messages['deletefolderconfirm'] = 'Haluatko varmasti poistaa kansion?';
+$messages['purgefolderconfirm'] = 'Haluatko varmasti poistaa kaikki viestit kansiosta?';
+$messages['formincomplete'] = 'Lomakkeen tiedot olivat puutteelliset';
+$messages['noemailwarning'] = 'Anna sähköpostiosoite';
+$messages['nonamewarning'] = 'Anna nimi';
+$messages['nopagesizewarning'] = 'Anna sivukoko';
+$messages['norecipientwarning'] = 'Anna ainakin yksi vastaanottaja';
+$messages['nosubjectwarning'] = '"Otsikko" -kenttä on tyhjä. Haluaisitko kirjoittaa viestillesi otsikon?';
+$messages['nobodywarning'] = 'Lähetetäänkö viesti ilman tekstiä?';
+$messages['notsentwarning'] = 'Viestiä ei lähethttp://translator.roundcube.net/index.phpetty. Haluatko poistaa viestin?';
+$messages['noldapserver'] = 'Valitse LDAP -palvelin';
+$messages['nocontactsreturned'] = 'Yhtään kontaktia ei löytynyt';
+$messages['nosearchname'] = 'Anna kontaktin nimi tai sähköpostiosoite';
+$messages['searchsuccessful'] = 'Löydetty $nr viestiä';
+$messages['searchnomatch'] = 'Haku ei tuottanut tuloksia';
+$messages['searching'] = 'Etsitään...';
+$messages['checking'] = 'Tarkistetaan...';
+$messages['nospellerrors'] = 'Kirjoitusvirheitä ei löytynyt';
+$messages['folderdeleted'] = 'Kansio poistettu onnistuneesti';
+$messages['deletedsuccessfully'] = 'Poistettu onnistuneesti';
+$messages['converting'] = 'Poistetaan asettelu viestistä...';
+$messages['messageopenerror'] = 'Virhe kopioitaessa viestiä palvelimelta';
+$messages['fileuploaderror'] = 'Tiedoston lähettäminen epäonnistui';
+$messages['filesizeerror'] = 'Lähetettävä tiedosto ylittää sallitun enimmäiskoon $size';
+$messages['copysuccess'] = 'Kopioitu $nr osoitetta onnistuneesti';
+$messages['copyerror'] = 'Yhtään osoitetta ei voitu kopioida';
+$messages['sourceisreadonly'] = 'Tämän osoitteen lähde on kirjoitussuojattu';
+$messages['errorsavingcontact'] = 'Yhteystietoa ei voitu tallentaa';
+$messages['movingmessage'] = 'Siirretään viestiä...';
+$messages['receiptsent'] = 'Lukukuittaus lähetetty onnistuneesti';
+$messages['errorsendingreceipt'] = 'Lukukuittausta ei voitu lähettää';
+$messages['nodeletelastidentity'] = 'Et voi poistaa tätä identiteettiä, koska se on ainoa jäljelläoleva';
+$messages['addsubfolderhint'] = 'Uusi kansio luodaan valitun kansion alikansiona';
+$messages['forbiddencharacter'] = 'Kansion nimessä on kiellettyjä merkkejä';
+
+?>
diff --git a/program/localization/fr/labels.inc b/program/localization/fr/labels.inc
deleted file mode 100644 (file)
index 01bc6f0..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/fr/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Joel S. <joel.s@spijoprod.net>                                |
- |         Jerome Lipowicz <jerome@yayel.com>                            |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Bienvenue sur $product';
-$labels['username'] = 'Utilisateur';
-$labels['password'] = 'Mot de passe';
-$labels['server'] = 'Serveur';
-$labels['login'] = 'Authentification';
-$labels['logout'] = 'Quitter';
-$labels['mail'] = 'Courriel';
-$labels['settings'] = 'Préférences';
-$labels['addressbook'] = 'Carnet d\'adresses';
-$labels['inbox'] = 'Messages reçus';
-$labels['drafts'] = 'Brouillons';
-$labels['sent'] = 'Messages envoyés';
-$labels['trash'] = 'Corbeille';
-$labels['junk'] = 'Indésirables';
-$labels['subject'] = 'Objet';
-$labels['from'] = 'De';
-$labels['to'] = 'À';
-$labels['cc'] = 'Cc';
-$labels['bcc'] = 'Cci';
-$labels['replyto'] = 'Répondre à';
-$labels['date'] = 'Date';
-$labels['size'] = 'Taille';
-$labels['priority'] = 'Priorité';
-$labels['organization'] = 'Organisation';
-$labels['reply-to'] = 'Répondre à';
-$labels['mailboxlist'] = 'Dossiers';
-$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'] = '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';
-$labels['tue'] = 'Mar';
-$labels['wed'] = 'Mer';
-$labels['thu'] = 'Jeu';
-$labels['fri'] = 'Ven';
-$labels['sat'] = 'Sam';
-$labels['sunday'] = 'Dimanche';
-$labels['monday'] = 'Lundi';
-$labels['tuesday'] = 'Mardi';
-$labels['wednesday'] = 'Mercredi';
-$labels['thursday'] = 'Jeudi';
-$labels['friday'] = 'Vendredi';
-$labels['saturday'] = 'Samedi';
-$labels['today'] = 'Aujourd\'hui';
-$labels['checkmail'] = 'Vérification des nouveaux messages';
-$labels['writenewmessage'] = 'Écrire un nouveau message';
-$labels['replytomessage'] = 'Répondre au message';
-$labels['replytoallmessage'] = 'Répondre à tous';
-$labels['forwardmessage'] = 'Transmettre le message';
-$labels['deletemessage'] = 'Déplacer le message dans la corbeille';
-$labels['movemessagetotrash'] = 'Déplacer le message dans la corbeille';
-$labels['printmessage'] = 'Imprimer ce message';
-$labels['previousmessage'] = 'Voir le message précédent';
-$labels['previousmessages'] = 'Voir les messages précédents';
-$labels['firstmessage'] = 'Voir le premier message';
-$labels['firstmessages'] = 'Voir la première page de messages';
-$labels['nextmessage'] = 'Voir le message suivant';
-$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 source';
-$labels['markmessages'] = 'Marquer les messages';
-$labels['markread'] = 'Comme lus';
-$labels['markunread'] = 'Comme non lus';
-$labels['select'] = 'Sélectionner';
-$labels['all'] = 'Tous';
-$labels['none'] = 'Aucun';
-$labels['unread'] = 'Non lus';
-$labels['compact'] = 'Compacter';
-$labels['empty'] = 'Vider';
-$labels['purge'] = 'Purger';
-$labels['quota'] = 'Utilisation disque';
-$labels['unknown'] = 'inconnue';
-$labels['unlimited'] = 'illimitée';
-$labels['quicksearch'] = 'Recherche rapide';
-$labels['resetsearch'] = 'Réinitialiser la recherche';
-$labels['compose'] = 'Composer un nouveau message';
-$labels['savemessage'] = 'Sauvegarder ce brouillon';
-$labels['sendmessage'] = 'Envoyer le message maintenant';
-$labels['addattachment'] = 'Joindre un fichier';
-$labels['charset'] = 'Encodage';
-$labels['editortype'] = 'Type d\'éditeur';
-$labels['returnreceipt'] = 'Accusé de réception';
-$labels['checkspelling'] = 'Vérifier l\'orthographe';
-$labels['resumeediting'] = 'Retourner à l\'édition';
-$labels['revertto'] = 'Revenir à';
-$labels['attachments'] = 'Fichiers joints';
-$labels['upload'] = 'Joindre';
-$labels['close'] = 'Fermer';
-$labels['low'] = 'Basse';
-$labels['lowest'] = 'La plus basse';
-$labels['normal'] = 'Normale';
-$labels['high'] = 'Élevée';
-$labels['highest'] = 'La plus élevée';
-$labels['nosubject'] = '(pas de sujet)';
-$labels['showimages'] = 'Afficher les images';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'texte brut';
-$labels['addcc'] = 'Ajouter Cc';
-$labels['addbcc'] = 'Ajouter Cci';
-$labels['addreplyto'] = 'Ajouter Répondre à';
-$labels['mdnrequest'] = 'L\'expéditeur de ce message a demandé d\'être prévenu quand vous lirez ce message. Souhaitez-vous prévenir l\'expéditeur ?';
-$labels['receiptread'] = 'Accusé de réception (lire)';
-$labels['yourmessage'] = 'Ceci est un accusé de réception pour votre message';
-$labels['receiptnote'] = 'Note : Cet accusé de réception indique seulement que le message a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire a lu ou compris le contenu du message.';
-$labels['name'] = 'Nom à afficher';
-$labels['firstname'] = 'Prénom';
-$labels['surname'] = 'Nom';
-$labels['email'] = 'Courriel';
-$labels['addcontact'] = 'Ajouter le contact sélectionné à votre Carnet d\'adresses';
-$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'] = 'Écrire un message à';
-$labels['contactsfromto'] = 'Contacts de $from à $to sur $count';
-$labels['print'] = 'Imprimer';
-$labels['export'] = 'Exporter';
-$labels['previouspage'] = 'Montrer page précédente';
-$labels['firstpage'] = 'Voir la première page';
-$labels['nextpage'] = 'Montrer page suivante';
-$labels['lastpage'] = 'Voir la dernière page';
-$labels['groups'] = 'Groupes';
-$labels['personaladrbook'] = 'Adresses personnelles';
-$labels['settingsfor'] = 'Paramètres pour';
-$labels['preferences'] = 'Préférences';
-$labels['userpreferences'] = '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'] = 'Modifier l\'élément';
-$labels['setdefault'] = 'Paramètres par défaut';
-$labels['language'] = 'Langue';
-$labels['timezone'] = 'Fuseau horaire';
-$labels['pagesize'] = 'Nombre de lignes par page';
-$labels['signature'] = 'Signature';
-$labels['dstactive'] = 'Heure d\'été';
-$labels['htmleditor'] = 'Composer un message au format HTML';
-$labels['htmlsignature'] = 'Signature HTML';
-$labels['previewpane'] = 'Afficher le panneau d\'aperçu';
-$labels['autosavedraft'] = 'Sauvegarde automatique des brouillons';
-$labels['everynminutes'] = 'toutes les $n minutes';
-$labels['never'] = 'jamais';
-$labels['folder'] = 'Dossier';
-$labels['folders'] = 'Dossiers';
-$labels['foldername'] = 'Nom du dossier';
-$labels['subscribed'] = 'Abonné';
-$labels['messagecount'] = 'Messages';
-$labels['create'] = 'Créer';
-$labels['createfolder'] = 'Créer un nouveau dossier';
-$labels['rename'] = 'Renommer';
-$labels['renamefolder'] = 'Renommer le dossier';
-$labels['deletefolder'] = 'Supprimer le dossier';
-$labels['managefolders'] = 'Organiser les dossiers';
-$labels['sortby'] = 'Trier par';
-$labels['sortasc'] = 'Tri ascendant';
-$labels['sortdesc'] = 'Tri descendant';
-
-?>
diff --git a/program/localization/fr/messages.inc b/program/localization/fr/messages.inc
deleted file mode 100644 (file)
index d91e093..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/fr/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Joel S. <joel.s@spijoprod.net>                                |
- |         Jerome Lipowicz <jerome@yayel.com>                            |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Erreur d\'authentification';
-$messages['cookiesdisabled'] = 'Votre navigateur n\'accepte pas les cookies';
-$messages['sessionerror'] = 'Votre session est invalide ou a expiré';
-$messages['imaperror'] = 'Erreur de connexion au serveur IMAP';
-$messages['nomessagesfound'] = 'Aucun message trouvé dans cette boîte aux lettres';
-$messages['loggedout'] = 'Vous venez de vous déconnecter avec succès. Au revoir !';
-$messages['mailboxempty'] = 'Boîte aux lettres vide';
-$messages['loading'] = 'Chargement...';
-$messages['loadingdata'] = 'Chargement des données...';
-$messages['checkingmail'] = 'Vérification des nouveaux messages...';
-$messages['sendingmessage'] = 'Message en cours d\'envoi...';
-$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 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 n\'a pu être trouvé';
-$messages['contactnotfound'] = 'Le contact demandé n\'a pas été trouvé';
-$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 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 de ce dossier ?';
-$messages['formincomplete'] = 'Le formulaire n\'a pas été entièrement rempli';
-$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['nocontactsreturned'] = 'Aucun contact trouvé';
-$messages['nosearchname'] = 'Entrez un nom de contact ou un courriel';
-$messages['searchsuccessful'] = '$nr messages trouvés';
-$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 de la mise en forme...';
-$messages['messageopenerror'] = 'Impossible de charger le message depuis serveur';
-$messages['fileuploaderror'] = 'Transfert du fichier echoué';
-$messages['filesizeerror'] = 'Le fichier transféré dépasse la taille maximale de $size';
-$messages['copysuccess'] = 'Succès de la copie des $nr adresses';
-$messages['copyerror'] = 'Ne peut pas copier les adresses';
-$messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule';
-$messages['errorsavingcontact'] = 'Ne peut pas enregistrer l\'adresse du contact';
-$messages['movingmessage'] = 'Déplacement du message...';
-$messages['receiptsent'] = 'L\'accusé de réception a bien été envoyé';
-$messages['errorsendingreceipt'] = 'L\'accusé de réception n\'a pas pu être envoyé';
-$messages['nodeletelastidentity'] = 'Vous ne pouvez pas effacer votre seule identité.';
-$messages['addsubfolderhint'] = 'Ce dossier sera créé comme sous-dossier de celui sélectionné.';
-
-?>
\ No newline at end of file
diff --git a/program/localization/fr_FR/labels.inc b/program/localization/fr_FR/labels.inc
new file mode 100644 (file)
index 0000000..01bc6f0
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/fr/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Joel S. <joel.s@spijoprod.net>                                |
+ |         Jerome Lipowicz <jerome@yayel.com>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Bienvenue sur $product';
+$labels['username'] = 'Utilisateur';
+$labels['password'] = 'Mot de passe';
+$labels['server'] = 'Serveur';
+$labels['login'] = 'Authentification';
+$labels['logout'] = 'Quitter';
+$labels['mail'] = 'Courriel';
+$labels['settings'] = 'Préférences';
+$labels['addressbook'] = 'Carnet d\'adresses';
+$labels['inbox'] = 'Messages reçus';
+$labels['drafts'] = 'Brouillons';
+$labels['sent'] = 'Messages envoyés';
+$labels['trash'] = 'Corbeille';
+$labels['junk'] = 'Indésirables';
+$labels['subject'] = 'Objet';
+$labels['from'] = 'De';
+$labels['to'] = 'À';
+$labels['cc'] = 'Cc';
+$labels['bcc'] = 'Cci';
+$labels['replyto'] = 'Répondre à';
+$labels['date'] = 'Date';
+$labels['size'] = 'Taille';
+$labels['priority'] = 'Priorité';
+$labels['organization'] = 'Organisation';
+$labels['reply-to'] = 'Répondre à';
+$labels['mailboxlist'] = 'Dossiers';
+$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'] = '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';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mer';
+$labels['thu'] = 'Jeu';
+$labels['fri'] = 'Ven';
+$labels['sat'] = 'Sam';
+$labels['sunday'] = 'Dimanche';
+$labels['monday'] = 'Lundi';
+$labels['tuesday'] = 'Mardi';
+$labels['wednesday'] = 'Mercredi';
+$labels['thursday'] = 'Jeudi';
+$labels['friday'] = 'Vendredi';
+$labels['saturday'] = 'Samedi';
+$labels['today'] = 'Aujourd\'hui';
+$labels['checkmail'] = 'Vérification des nouveaux messages';
+$labels['writenewmessage'] = 'Écrire un nouveau message';
+$labels['replytomessage'] = 'Répondre au message';
+$labels['replytoallmessage'] = 'Répondre à tous';
+$labels['forwardmessage'] = 'Transmettre le message';
+$labels['deletemessage'] = 'Déplacer le message dans la corbeille';
+$labels['movemessagetotrash'] = 'Déplacer le message dans la corbeille';
+$labels['printmessage'] = 'Imprimer ce message';
+$labels['previousmessage'] = 'Voir le message précédent';
+$labels['previousmessages'] = 'Voir les messages précédents';
+$labels['firstmessage'] = 'Voir le premier message';
+$labels['firstmessages'] = 'Voir la première page de messages';
+$labels['nextmessage'] = 'Voir le message suivant';
+$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 source';
+$labels['markmessages'] = 'Marquer les messages';
+$labels['markread'] = 'Comme lus';
+$labels['markunread'] = 'Comme non lus';
+$labels['select'] = 'Sélectionner';
+$labels['all'] = 'Tous';
+$labels['none'] = 'Aucun';
+$labels['unread'] = 'Non lus';
+$labels['compact'] = 'Compacter';
+$labels['empty'] = 'Vider';
+$labels['purge'] = 'Purger';
+$labels['quota'] = 'Utilisation disque';
+$labels['unknown'] = 'inconnue';
+$labels['unlimited'] = 'illimitée';
+$labels['quicksearch'] = 'Recherche rapide';
+$labels['resetsearch'] = 'Réinitialiser la recherche';
+$labels['compose'] = 'Composer un nouveau message';
+$labels['savemessage'] = 'Sauvegarder ce brouillon';
+$labels['sendmessage'] = 'Envoyer le message maintenant';
+$labels['addattachment'] = 'Joindre un fichier';
+$labels['charset'] = 'Encodage';
+$labels['editortype'] = 'Type d\'éditeur';
+$labels['returnreceipt'] = 'Accusé de réception';
+$labels['checkspelling'] = 'Vérifier l\'orthographe';
+$labels['resumeediting'] = 'Retourner à l\'édition';
+$labels['revertto'] = 'Revenir à';
+$labels['attachments'] = 'Fichiers joints';
+$labels['upload'] = 'Joindre';
+$labels['close'] = 'Fermer';
+$labels['low'] = 'Basse';
+$labels['lowest'] = 'La plus basse';
+$labels['normal'] = 'Normale';
+$labels['high'] = 'Élevée';
+$labels['highest'] = 'La plus élevée';
+$labels['nosubject'] = '(pas de sujet)';
+$labels['showimages'] = 'Afficher les images';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'texte brut';
+$labels['addcc'] = 'Ajouter Cc';
+$labels['addbcc'] = 'Ajouter Cci';
+$labels['addreplyto'] = 'Ajouter Répondre à';
+$labels['mdnrequest'] = 'L\'expéditeur de ce message a demandé d\'être prévenu quand vous lirez ce message. Souhaitez-vous prévenir l\'expéditeur ?';
+$labels['receiptread'] = 'Accusé de réception (lire)';
+$labels['yourmessage'] = 'Ceci est un accusé de réception pour votre message';
+$labels['receiptnote'] = 'Note : Cet accusé de réception indique seulement que le message a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire a lu ou compris le contenu du message.';
+$labels['name'] = 'Nom à afficher';
+$labels['firstname'] = 'Prénom';
+$labels['surname'] = 'Nom';
+$labels['email'] = 'Courriel';
+$labels['addcontact'] = 'Ajouter le contact sélectionné à votre Carnet d\'adresses';
+$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'] = 'Écrire un message à';
+$labels['contactsfromto'] = 'Contacts de $from à $to sur $count';
+$labels['print'] = 'Imprimer';
+$labels['export'] = 'Exporter';
+$labels['previouspage'] = 'Montrer page précédente';
+$labels['firstpage'] = 'Voir la première page';
+$labels['nextpage'] = 'Montrer page suivante';
+$labels['lastpage'] = 'Voir la dernière page';
+$labels['groups'] = 'Groupes';
+$labels['personaladrbook'] = 'Adresses personnelles';
+$labels['settingsfor'] = 'Paramètres pour';
+$labels['preferences'] = 'Préférences';
+$labels['userpreferences'] = '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'] = 'Modifier l\'élément';
+$labels['setdefault'] = 'Paramètres par défaut';
+$labels['language'] = 'Langue';
+$labels['timezone'] = 'Fuseau horaire';
+$labels['pagesize'] = 'Nombre de lignes par page';
+$labels['signature'] = 'Signature';
+$labels['dstactive'] = 'Heure d\'été';
+$labels['htmleditor'] = 'Composer un message au format HTML';
+$labels['htmlsignature'] = 'Signature HTML';
+$labels['previewpane'] = 'Afficher le panneau d\'aperçu';
+$labels['autosavedraft'] = 'Sauvegarde automatique des brouillons';
+$labels['everynminutes'] = 'toutes les $n minutes';
+$labels['never'] = 'jamais';
+$labels['folder'] = 'Dossier';
+$labels['folders'] = 'Dossiers';
+$labels['foldername'] = 'Nom du dossier';
+$labels['subscribed'] = 'Abonné';
+$labels['messagecount'] = 'Messages';
+$labels['create'] = 'Créer';
+$labels['createfolder'] = 'Créer un nouveau dossier';
+$labels['rename'] = 'Renommer';
+$labels['renamefolder'] = 'Renommer le dossier';
+$labels['deletefolder'] = 'Supprimer le dossier';
+$labels['managefolders'] = 'Organiser les dossiers';
+$labels['sortby'] = 'Trier par';
+$labels['sortasc'] = 'Tri ascendant';
+$labels['sortdesc'] = 'Tri descendant';
+
+?>
diff --git a/program/localization/fr_FR/messages.inc b/program/localization/fr_FR/messages.inc
new file mode 100644 (file)
index 0000000..d91e093
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/fr/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Joel S. <joel.s@spijoprod.net>                                |
+ |         Jerome Lipowicz <jerome@yayel.com>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Erreur d\'authentification';
+$messages['cookiesdisabled'] = 'Votre navigateur n\'accepte pas les cookies';
+$messages['sessionerror'] = 'Votre session est invalide ou a expiré';
+$messages['imaperror'] = 'Erreur de connexion au serveur IMAP';
+$messages['nomessagesfound'] = 'Aucun message trouvé dans cette boîte aux lettres';
+$messages['loggedout'] = 'Vous venez de vous déconnecter avec succès. Au revoir !';
+$messages['mailboxempty'] = 'Boîte aux lettres vide';
+$messages['loading'] = 'Chargement...';
+$messages['loadingdata'] = 'Chargement des données...';
+$messages['checkingmail'] = 'Vérification des nouveaux messages...';
+$messages['sendingmessage'] = 'Message en cours d\'envoi...';
+$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 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 n\'a pu être trouvé';
+$messages['contactnotfound'] = 'Le contact demandé n\'a pas été trouvé';
+$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 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 de ce dossier ?';
+$messages['formincomplete'] = 'Le formulaire n\'a pas été entièrement rempli';
+$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['nocontactsreturned'] = 'Aucun contact trouvé';
+$messages['nosearchname'] = 'Entrez un nom de contact ou un courriel';
+$messages['searchsuccessful'] = '$nr messages trouvés';
+$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 de la mise en forme...';
+$messages['messageopenerror'] = 'Impossible de charger le message depuis serveur';
+$messages['fileuploaderror'] = 'Transfert du fichier echoué';
+$messages['filesizeerror'] = 'Le fichier transféré dépasse la taille maximale de $size';
+$messages['copysuccess'] = 'Succès de la copie des $nr adresses';
+$messages['copyerror'] = 'Ne peut pas copier les adresses';
+$messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule';
+$messages['errorsavingcontact'] = 'Ne peut pas enregistrer l\'adresse du contact';
+$messages['movingmessage'] = 'Déplacement du message...';
+$messages['receiptsent'] = 'L\'accusé de réception a bien été envoyé';
+$messages['errorsendingreceipt'] = 'L\'accusé de réception n\'a pas pu être envoyé';
+$messages['nodeletelastidentity'] = 'Vous ne pouvez pas effacer votre seule identité.';
+$messages['addsubfolderhint'] = 'Ce dossier sera créé comme sous-dossier de celui sélectionné.';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ge/labels.inc b/program/localization/ge/labels.inc
deleted file mode 100755 (executable)
index 6d37223..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ge/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Zaza Zviadadze <zviadadze@gmail.com>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 842 2007-10-20 13:55:02Z  zaza$
-
-*/
-
-$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['movemessagetotrash'] = 'შეტყობინების წაშლილებში გადატანა';
-$labels['printmessage'] = 'შეტყობინების ამობეჭვდა';
-$labels['previousmessage'] = 'წინა შეტყობინების ნახვა';
-$labels['previousmessages'] = 'წინა შეტყობინებების ნახვა';
-$labels['firstmessage'] = 'პირველი შეტყობინების ნახვა';
-$labels['firstmessages'] = 'პრველი შეტყობინებები';
-$labels['nextmessage'] = 'შემდეგი შეტყობინების ნახვა';
-$labels['nextmessages'] = 'შემდეგი შეტყობინებების ნახვა';
-$labels['lastmessage'] = 'ბოლო შეტყობინების ნახვა';
-$labels['lastmessages'] = 'ბოლო შეტყობინებების ნახვა';
-$labels['backtolist'] = 'უკან ჩამონათვალში';
-$labels['viewsource'] = 'შიგთავსი';
-$labels['markmessages'] = 'მონიშნეთ შეტყობინებები';
-$labels['markread'] = 'როგორც წაკითხული';
-$labels['markunread'] = 'როგორც წაუკითხავი';
-$labels['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['savemessage'] = 'დროებით შენახვა';
-$labels['sendmessage'] = 'შეტყობინების გაგზავნა';
-$labels['addattachment'] = 'ფაილის ატვირთვა';
-$labels['charset'] = 'კოდირება';
-$labels['editortype'] = 'რედაქტორი';
-$labels['returnreceipt'] = 'პასუხის მოთხოვნა';
-$labels['checkspelling'] = 'ორთოგრაფიული შემოწმება';
-$labels['resumeediting'] = 'რედაქტირების გაგრძელება';
-$labels['revertto'] = 'გაუქმება';
-$labels['attachments'] = 'გზავნილები';
-$labels['upload'] = 'ატვირთვა';
-$labels['close'] = 'დახურვა';
-$labels['low'] = 'დაბალი';
-$labels['lowest'] = 'უდაბლესი';
-$labels['normal'] = 'საშუალო';
-$labels['high'] = 'მაღალი';
-$labels['highest'] = 'უმაღლესი';
-$labels['nosubject'] = '(უსათაურო)';
-$labels['showimages'] = 'გამოსახულების ჩვენება';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'ტექსტური';
-$labels['addcc'] = 'დაამატე კოპიო';
-$labels['addbcc'] = 'დაამატე ფარული კოპიო';
-$labels['addreplyto'] = 'დაამატე გამომგზავნი';
-$labels['mdnrequest'] = 'გამომგზავნს სურს შეიტყოს წერილის მიღება. გსურთ შეატყობინოთ გამომგზავნს?';
-$labels['receiptread'] = 'გზავნილის დაბრუნება';
-$labels['yourmessage'] = 'ეს არის მიღების დასტური თქვენს შეტყობინებაზე';
-$labels['receiptnote'] = 'განმარტება: ეს ნიშნავს რომ ადრესატმა მიიღო შეტყობინება. მაგრამ, არ ნიშნავს რომ წაიკითხა ან გაიგო ტექსტი';
-$labels['name'] = 'სრული სახელი';
-$labels['firstname'] = 'სახელი';
-$labels['surname'] = 'გვარი';
-$labels['email'] = 'ელ–ფოსტა';
-$labels['addcontact'] = 'კონტაქტებში დამატება';
-$labels['editcontact'] = 'კონტაქტის რედაქტირება';
-$labels['edit'] = 'რედაქტირება';
-$labels['cancel'] = 'გაუქმება';
-$labels['save'] = 'შენახვა';
-$labels['delete'] = 'წაშლა';
-$labels['newcontact'] = 'კონტაქტის შექმნა';
-$labels['deletecontact'] = 'მონიშნელი კონტაქტის წაშლა';
-$labels['composeto'] = 'ფოსტის გაგზავნა შერჩეულ ადრესატებთან';
-$labels['contactsfromto'] = 'კონტაქტები $from დან $to ში $count';
-$labels['print'] = 'დაბეჭვდა';
-$labels['export'] = 'ექსპორტი';
-$labels['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['messagecount'] = 'შეტყობინებები';
-$labels['create'] = 'შექმნა';
-$labels['createfolder'] = 'საქაღალდის შექმნა';
-$labels['rename'] = 'სახელის გადარქმევა';
-$labels['renamefolder'] = 'სახელის გადარქმევა საქაღალდისთვის';
-$labels['deletefolder'] = 'საქაღალდის წაშლა';
-$labels['managefolders'] = 'საქაღალდეების მართვა';
-$labels['sortby'] = 'დალაგება';
-$labels['sortasc'] = 'დალაგება ზრდადობით';
-$labels['sortdesc'] = 'დალაგება კლებადობით';
-
-?>
diff --git a/program/localization/ge/messages.inc b/program/localization/ge/messages.inc
deleted file mode 100755 (executable)
index d2c29ca..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ge/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Zaza Zviadadze <zviadadze@gmail.com>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 842 2007-10-20 13:55:02Z  zaza $
-
-*/
-
-$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'] = 'შეტყობინების გადატანა...';
-$messages['receiptsent'] = 'წარმატებით გაიგზავნა';
-$messages['errorsendingreceipt'] = 'არ გაიგზავნა';
-$messages['nodeletelastidentity'] = 'წაშლა შეუძლებელია, ის თქვენთვის ერთადერთია';
-$messages['addsubfolderhint'] = 'საქაღალდე შეიქმნება როგორც ქვესაქაღალდე მონიშნულ საქაღალდეში';
-
-?>
diff --git a/program/localization/gl/labels.inc b/program/localization/gl/labels.inc
deleted file mode 100644 (file)
index 4203d25..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/gl/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube 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['markmessages'] = 'Marcar mensaxes';
-$labels['markread'] = 'Coma lidos';
-$labels['markunread'] = 'Coma non lidos';
-$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['mdnrequest'] = 'O remitente desta mensaxe pediu ser notificado cando vostede lea esta mensaxe. Quere notificar ao remitente?';
-$labels['receiptread'] = 'Notificación da disposición da mensaxe (lectura)';
-$labels['yourmessage'] = 'Esta é unha notificación de disposición para a súa mensaxe';
-$labels['receiptnote'] = 'Nota: Esta notificación só confirma que a mensaxe se abriu no computador do destinatario. Non asegura que o destinatario o lera ou entendera o seu contido.';
-$labels['name'] = 'Nome completo';
-$labels['firstname'] = 'Nome';
-$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['messagecount'] = 'Mensaxes';
-$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
deleted file mode 100644 (file)
index 2ba57d0..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/gl/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube 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...';
-$messages['receiptsent'] = 'A notificación de disposición enviouse correctamente';
-$messages['errorsendingreceipt'] = 'Non se puido enviar a notificación';
-$messages['nodeletelastidentity'] = 'Non pode borrar esta identidade, é a última';
-$messages['addsubfolderhint'] = 'Este cartafol vaise crear coma un subcartafol do seleccionado';
-
-?>
diff --git a/program/localization/gl_ES/labels.inc b/program/localization/gl_ES/labels.inc
new file mode 100644 (file)
index 0000000..4203d25
--- /dev/null
@@ -0,0 +1,189 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/gl/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube 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['markmessages'] = 'Marcar mensaxes';
+$labels['markread'] = 'Coma lidos';
+$labels['markunread'] = 'Coma non lidos';
+$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['mdnrequest'] = 'O remitente desta mensaxe pediu ser notificado cando vostede lea esta mensaxe. Quere notificar ao remitente?';
+$labels['receiptread'] = 'Notificación da disposición da mensaxe (lectura)';
+$labels['yourmessage'] = 'Esta é unha notificación de disposición para a súa mensaxe';
+$labels['receiptnote'] = 'Nota: Esta notificación só confirma que a mensaxe se abriu no computador do destinatario. Non asegura que o destinatario o lera ou entendera o seu contido.';
+$labels['name'] = 'Nome completo';
+$labels['firstname'] = 'Nome';
+$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['messagecount'] = 'Mensaxes';
+$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_ES/messages.inc b/program/localization/gl_ES/messages.inc
new file mode 100644 (file)
index 0000000..2ba57d0
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/gl/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube 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...';
+$messages['receiptsent'] = 'A notificación de disposición enviouse correctamente';
+$messages['errorsendingreceipt'] = 'Non se puido enviar a notificación';
+$messages['nodeletelastidentity'] = 'Non pode borrar esta identidade, é a última';
+$messages['addsubfolderhint'] = 'Este cartafol vaise crear coma un subcartafol do seleccionado';
+
+?>
diff --git a/program/localization/he/labels.inc b/program/localization/he/labels.inc
deleted file mode 100644 (file)
index b51a586..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | language/he/labels.inc                                                |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Moshe Leibovitch  <moish@mln.co.il>                           |\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['markmessages'] = 'סימון הודעות';\r
-$labels['markread'] = 'כנקראו';\r
-$labels['markunread'] = 'כלא נקראו';\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['mdnrequest'] = 'השולח ביקש לדעת אם המכתב נקרא. האם להודיע לשולח?';\r
-$labels['receiptread'] = '(אישור קבלה (נקרא';\r
-$labels['yourmessage'] = 'זה אישור קבלה למכתבך';\r
-$labels['receiptnote'] = 'זה אישור על כך שהמכתב הוצג אבל אינו מבטיח שהתוכן נקרא או הובן';\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'] = 'יצירת הודעה מעוצבת';\r
-$labels['htmlsignature'] = 'חתימה מעוצבת';\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['messagecount'] = 'הודעות';\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
-?>
\ No newline at end of file
diff --git a/program/localization/he/messages.inc b/program/localization/he/messages.inc
deleted file mode 100644 (file)
index b25ffdc..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | language/he/messages.inc                                              |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Moshe Leibovitch    <moish@mln.co.il>                         |\r
- +-----------------------------------------------------------------------+\r
-\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed'] = 'הכניסה נכשלה';\r
-$messages['cookiesdisabled'] = 'הדפדפן אינו מקבל עוגיות';\r
-$messages['sessionerror'] = 'הקשר שלך אינו חוקי או שפג תוקפו';\r
-$messages['imaperror'] = 'הקשר לשרת נכשל';\r
-$messages['nomessagesfound'] = 'לא נמצאו מכתבים בתיבה זו';\r
-$messages['loggedout'] = 'הקשר הסתיים. להתראות!';\r
-$messages['mailboxempty'] = 'התיבה ריקה';\r
-$messages['loading'] = 'טעינה...';\r
-$messages['loadingdata'] = 'טעינת מידע..';\r
-$messages['checkingmail'] = 'בדיקת קיום מכתבים חדשים...';\r
-$messages['sendingmessage'] = 'משלוח מכתבים';\r
-$messages['messagesent'] = 'מכתב נשלח בהצלחה';\r
-$messages['savingmessage'] = 'שמירת מכתב...';\r
-$messages['messagesaved'] = 'המכתב נשמר כטיוטה';\r
-$messages['successfullysaved'] = 'נשמר בהצלחה';\r
-$messages['addedsuccessfully'] = 'איש הקשר נוסף לפנקס בהצלחה';\r
-$messages['contactexists'] = 'קיים כבר איש קשר עם כתובת דוא"ל זו';\r
-$messages['blockedimages'] = 'תמונות משרת אחר נחסמו כדי לשמור על הפרטיות';\r
-$messages['encryptedmessage'] = 'זו הודעת מוצפנת ולכן לא ניתן להציגה';\r
-$messages['nocontactsfound'] = 'לא נמצאו אנשי קשר';\r
-$messages['contactnotfound'] = 'איש הקשר המבוקש לא נמצא';\r
-$messages['sendingfailed'] = 'שליחת המכתב נכשלה';\r
-$messages['errorsaving'] = 'נגרמה שגיאה במהלך השמירה';\r
-$messages['errormoving'] = 'לא ניתן לתייק את המכתב';\r
-$messages['errordeleting'] = 'לא ניתן למחוק את המכתב';\r
-$messages['deletecontactconfirm'] = 'האם למחוק את איש הקשר?';\r
-$messages['deletemessagesconfirm'] = 'האם למחוק את המכתבים נמסומנים?';\r
-$messages['deletefolderconfirm'] = 'האם למחוק תיק זה?';\r
-$messages['purgefolderconfirm'] = 'האם למחוק את כל ההודעות בתיק זה?';\r
-$messages['formincomplete'] = 'לא הושלמו כל הפרטים בטופס זה';\r
-$messages['noemailwarning'] = 'נא להוסיף כתובת דוא"ל חוקית';\r
-$messages['nonamewarning'] = 'נא להוסיף שם';\r
-$messages['nopagesizewarning'] = 'נא להוסיף גודל דף';\r
-$messages['norecipientwarning'] = 'נא להוסיף לפחות נמען אחד';\r
-$messages['nosubjectwarning'] = 'שורת הנושא ריקה. האם ברצונך להוסיף נושא כעת?';\r
-$messages['nobodywarning'] = 'האם לשלוח מכתב ללא תוכן?';\r
-$messages['notsentwarning'] = 'המכתב לא נשלח. האם לבטלו?';\r
-$messages['noldapserver'] = 'נא לבחור שרת כתובות לחיפוש';\r
-$messages['nocontactsreturned'] = 'לא נמצאו אנשי קשר';\r
-$messages['nosearchname'] = 'נא להוסיף איש קשר או כתובת דוא"ל';\r
-$messages['searchsuccessful'] = 'נמצאו  $nr  מכתבים';\r
-$messages['searchnomatch'] = 'החיפוש לא מצא דבר';\r
-$messages['searching'] = 'חיפוש...';\r
-$messages['checking'] = 'בדיקה...';\r
-$messages['nospellerrors'] = 'לא נמצאו שגיאות כתיב';\r
-$messages['folderdeleted'] = 'התיק נמחק בהצלחה';\r
-$messages['deletedsuccessfully'] = 'המחיקה הסתימה בהצלחה';\r
-$messages['converting'] = 'הסרת העיצוב מהמכתב';\r
-$messages['messageopenerror'] = 'לא ניתן לטעון המכתב מהשרת';\r
-$messages['fileuploaderror'] = 'העלאת הקובץ נכשלה';\r
-$messages['filesizeerror'] = 'הקובץ לטעינה גדול מהגודל המקסימלי שהוא  $size';\r
-$messages['copysuccess'] = '$nr  כתובות הועתקו בהצלחה';\r
-$messages['copyerror'] = 'לא ניתן היה להעתיק כתובת כלשהי';\r
-$messages['sourceisreadonly'] = 'המקור לכתובת הוא לקריאה בלבד';\r
-$messages['errorsavingcontact'] = 'לא ניתן לשמור את כתובת איש הקשר';\r
-$messages['movingmessage'] = 'תיוק המכתב..';\r
-$messages['receiptsent'] = 'אישור הקבלה נשלח בהצלחה';\r
-$messages['errorsendingreceipt'] = 'לא ניתן לשלוח אישור קבלה';\r
-$messages['nodeletelastidentity'] = 'זו הזהות האחרונה ולכן לא ניתן לבטלה';\r
-$messages['addsubfolderhint'] = 'תיקיה זו תוקם תחת התיקיה שנבחרה';\r
-\r
-?>
\ No newline at end of file
diff --git a/program/localization/he_IL/labels.inc b/program/localization/he_IL/labels.inc
new file mode 100644 (file)
index 0000000..4d746ab
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/he/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Moshe Leibovitch  <moish@mln.co.il>                           |
+| Updates: Noor Dawod <noor@comrax.com>                                 |
++-----------------------------------------------------------------------+
+*/
+
+$labels = array();
+$labels['welcome'] = 'ברוך בואך אל $product';
+$labels['username'] = 'שם משתמש';
+$labels['password'] = 'סיסמה';
+$labels['server'] = 'שרת';
+$labels['login'] = 'כניסה';
+$labels['logout'] = 'יציאה';
+$labels['mail'] = 'תיבת דואר';
+$labels['settings'] = 'הגדרות אישיות';
+$labels['addressbook'] = 'פנקס כתובות';
+$labels['inbox'] = 'נכנס';
+$labels['drafts'] = 'טיוטות';
+$labels['sent'] = 'נשלח';
+$labels['trash'] = 'אשפה';
+$labels['junk'] = 'זבל';
+$labels['subject'] = 'נושא';
+$labels['from'] = 'מאת';
+$labels['to'] = 'אל';
+$labels['cc'] = 'לידיעה';
+$labels['bcc'] = 'מכותב מוסתר';
+$labels['replyto'] = 'מענה לשולח';
+$labels['date'] = 'תאריך';
+$labels['size'] = 'גודל';
+$labels['priority'] = 'עדיפות';
+$labels['organization'] = 'ארגון';
+$labels['reply-to'] = 'מענה לשולח';
+$labels['mailboxlist'] = 'תיקים';
+$labels['messagesfromto'] = 'מכתבים $from עד $to מתוך $count';
+$labels['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['jan'] = 'ינו';
+$labels['feb'] = 'פבר';
+$labels['mar'] = 'מרץ';
+$labels['apr'] = 'אפר';
+$labels['may'] = 'מאי';
+$labels['jun'] = 'יונ';
+$labels['jul'] = 'יול';
+$labels['aug'] = 'אוג';
+$labels['sep'] = 'ספט';
+$labels['oct'] = 'אוק';
+$labels['nov'] = 'נוב';
+$labels['dec'] = 'דצמ';
+$labels['longjan'] = 'ינואר';
+$labels['longfeb'] = 'פברואר';
+$labels['longmar'] = 'מרץ';
+$labels['longapr'] = 'אפריל';
+$labels['longmay'] = 'מאי';
+$labels['longjun'] = 'יוני';
+$labels['longjul'] = 'יולי';
+$labels['longaug'] = 'אוגוסט';
+$labels['longsep'] = 'ספטמבר';
+$labels['longoct'] = 'אוקטובר';
+$labels['longnov'] = 'נובמבר';
+$labels['longdec'] = 'דצמבר';
+$labels['today'] = 'היום';
+$labels['checkmail'] = 'בדיקת מכתבים חדשים';
+$labels['writenewmessage'] = 'מכתב חדש';
+$labels['replytomessage'] = 'מענה למכתב';
+$labels['replytoallmessage'] = 'מענה לשולח ולכל הנמענים';
+$labels['forwardmessage'] = 'העבר מכתב';
+$labels['deletemessage'] = 'מחיקה';
+$labels['movemessagetotrash'] = 'השלכה לאשפה';
+$labels['printmessage'] = 'הדפסה';
+$labels['previousmessage'] = 'הצג מכתב קודם';
+$labels['previousmessages'] = 'הצגת רשימה קודמת';
+$labels['firstmessage'] = 'הצג מכתב ראשון';
+$labels['firstmessages'] = 'הצגה של קבוצת המכתבים הראשונה';
+$labels['nextmessage'] = 'הצג מכתב הבא';
+$labels['nextmessages'] = 'הצגה של קבוצת המכתבים הבאה';
+$labels['lastmessage'] = 'הצג מכתב אחרון';
+$labels['lastmessages'] = 'הצגה של קבוצת המכתבים האחרונה';
+$labels['backtolist'] = 'חזרה אל רשימת המכתבים';
+$labels['viewsource'] = 'הצגת קוד מקור';
+$labels['markmessages'] = 'סימון מכתבים';
+$labels['markread'] = 'כנקראו';
+$labels['markunread'] = 'כלא נקראו';
+$labels['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['savemessage'] = 'שמירת טיוטה';
+$labels['sendmessage'] = 'משלוח מיידי';
+$labels['addattachment'] = 'צירוף קובץ';
+$labels['charset'] = 'קידוד';
+$labels['editortype'] = 'סוג עורך';
+$labels['returnreceipt'] = 'אישור קבלה';
+$labels['checkspelling'] = 'בדיקת איות';
+$labels['resumeediting'] = 'המשך עריכה';
+$labels['revertto'] = 'חזור למצב קודם';
+$labels['attachments'] = 'קבצים מצורפים';
+$labels['upload'] = 'העלאה';
+$labels['close'] = 'סגירה';
+$labels['low'] = 'נמוך';
+$labels['lowest'] = 'נמוך ביותר';
+$labels['normal'] = 'רגיל';
+$labels['high'] = 'גבוה';
+$labels['highest'] = 'גבוה ביותר';
+$labels['nosubject'] = '(ללא נושא)';
+$labels['showimages'] = 'הצגת תמונות';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'ללא עיצוב';
+$labels['addcc'] = 'הוספת מכותב לידיעה';
+$labels['addbcc'] = 'הוספת מכותב נסתר';
+$labels['addreplyto'] = 'הוספת כתובת למענה';
+$labels['mdnrequest'] = 'השולח ביקש לדעת אם המכתב נקרא. האם להודיע לשולח?';
+$labels['receiptread'] = '(אישור קבלה (נקרא';
+$labels['yourmessage'] = 'אישור קבלה למכתבך';
+$labels['receiptnote'] = 'הערה: האישור אינו מבטיח שהנמען קרא או הבין את תוכן מכתבך.';
+$labels['name'] = 'שם להצגה';
+$labels['firstname'] = 'שם פרטי';
+$labels['surname'] = 'שם משפחה';
+$labels['email'] = 'כתובת דוא\"ל';
+$labels['addcontact'] = 'הוספת איש קשר';
+$labels['editcontact'] = 'עריכת איש קשר';
+$labels['edit'] = 'עריכה';
+$labels['cancel'] = 'ביטול';
+$labels['save'] = 'שמירה';
+$labels['delete'] = 'מחיקה';
+$labels['newcontact'] = 'איש קשר חדש';
+$labels['deletecontact'] = 'מחיקת אנשי קשר מסומנים';
+$labels['composeto'] = 'משלוח מכתב אל';
+$labels['contactsfromto'] = 'אנשי קשר $from עד $to מתוך $count';
+$labels['print'] = 'הדפסה';
+$labels['export'] = 'ייצוא';
+$labels['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'] = 'צור מכתב מעוצב';
+$labels['htmlsignature'] = 'חתימה מעוצבת';
+$labels['previewpane'] = 'הצג הצצה מוקדמת';
+$labels['logoutclear'] = 'ריקון סל אשפה ביציאה';
+$labels['logoutcompact'] = 'פינוי שטח לא מנוצל ביציאה';
+$labels['uisettings'] = 'ממשק משתמש';
+$labels['serversettings'] = 'הגדרות שרת';
+$labels['mailboxview'] = 'הצצה לתיבת הדוא\"ל';
+$labels['mdnrequests'] = 'הודעות השרת';
+$labels['askuser'] = 'שאל את המשתמש';
+$labels['autosend'] = 'שליחה אוטומטית';
+$labels['ignore'] = 'התעלם';
+$labels['readwhendeleted'] = 'סימון הודעה כנקראה לאחר מחיקה';
+$labels['flagfordeletion'] = 'איתות על מחיקת הודעה';
+$labels['autosavedraft'] = 'שמירה אוטומטית של טיוטה';
+$labels['everynminutes'] = 'כל $n דקות';
+$labels['never'] = 'אף פעם';
+$labels['folder'] = 'תיק';
+$labels['folders'] = 'תיקים';
+$labels['foldername'] = 'שם תיק';
+$labels['subscribed'] = 'מנוי';
+$labels['messagecount'] = 'מכתבים';
+$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/he_IL/messages.inc b/program/localization/he_IL/messages.inc
new file mode 100644 (file)
index 0000000..7689e10
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/he/messages.inc                                              |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Moshe Leibovitch    <moish@mln.co.il>                         |
+| Updates: Noor Dawod <noor@comrax.com>                                 |
++-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'הכניסה נכשלה';
+$messages['cookiesdisabled'] = 'הדפדפן אינו מקבל עוגיות';
+$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'] = 'נא לבחור שרת כתובות לחיפוש';
+$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'] = 'תיוק המכתב...';
+$messages['receiptsent'] = 'אישור הקבלה נשלח בהצלחה';
+$messages['errorsendingreceipt'] = 'לא ניתן לשלוח אישור קבלה';
+$messages['nodeletelastidentity'] = 'זו הזהות האחרונה ולכן לא ניתן לבטלה';
+$messages['addsubfolderhint'] = 'תיקיה זו תוקם תחת התיקיה שנבחרה';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hi/labels.inc b/program/localization/hi/labels.inc
deleted file mode 100644 (file)
index d286659..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | localization/hi/labels.inc                                            |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$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['junk']   = 'स्पैम';
-
-// 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['replyto'];
-
-$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']               = 'मेल';
-
-$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']            = 'आखिरी बन्डल दिखाऐं';
-
-
-// LDAP search
-$labels['ldapsearch']          = 'ऐलडैप (LDAP) डाईरेक्टरी खोजें';
-
-$labels['ldappublicsearchname']        = 'पता का नाम';
-$labels['ldappublicsearchtype']        = 'सख़त मैच?';
-$labels['ldappublicserverselect']      = 'सर्वर चुनें';
-$labels['ldappublicsearchfield']       = 'यहाँ खोजें';
-$labels['ldappublicsearchform']        = 'पता के लिये खोजें';
-$labels['ldappublicsearch']    = 'खोज';
-
-
-// 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/hi/messages.inc b/program/localization/hi/messages.inc
deleted file mode 100644 (file)
index a32a524..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | localization/hi/messages.inc                                          |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$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['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']      = 'खोज के लिये एक ऐलडैप सर्वर चुनें';
-$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 से बड़ा है';
-
-?>
\ No newline at end of file
diff --git a/program/localization/hi_IN/labels.inc b/program/localization/hi_IN/labels.inc
new file mode 100644 (file)
index 0000000..d286659
--- /dev/null
@@ -0,0 +1,239 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | localization/hi/labels.inc                                            |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$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['junk']   = 'स्पैम';
+
+// 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['replyto'];
+
+$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']               = 'मेल';
+
+$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']            = 'आखिरी बन्डल दिखाऐं';
+
+
+// LDAP search
+$labels['ldapsearch']          = 'ऐलडैप (LDAP) डाईरेक्टरी खोजें';
+
+$labels['ldappublicsearchname']        = 'पता का नाम';
+$labels['ldappublicsearchtype']        = 'सख़त मैच?';
+$labels['ldappublicserverselect']      = 'सर्वर चुनें';
+$labels['ldappublicsearchfield']       = 'यहाँ खोजें';
+$labels['ldappublicsearchform']        = 'पता के लिये खोजें';
+$labels['ldappublicsearch']    = 'खोज';
+
+
+// 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/hi_IN/messages.inc b/program/localization/hi_IN/messages.inc
new file mode 100644 (file)
index 0000000..a32a524
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | localization/hi/messages.inc                                          |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$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['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']      = 'खोज के लिये एक ऐलडैप सर्वर चुनें';
+$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 से बड़ा है';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hu/labels.inc b/program/localization/hu/labels.inc
deleted file mode 100644 (file)
index 06f2d4f..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/hu/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Levente Farkas <lfarkas at lfarkas dot org>                   |
- |         Ervin Hegedüs <airween@damson.hu>                             |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1069 2008-02-13 19:33:10Z yllar $
-
-*/
-
-$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['movemessagetotrash'] = 'Üzenet törlése';
-$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['markmessages'] = 'Üzenetek megjelölése';
-$labels['markread'] = 'Olvasottként';
-$labels['markunread'] = 'Olvasatlanként';
-$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['savemessage'] = 'Vázlat mentése';
-$labels['sendmessage'] = 'Üzenet azonnali küldé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['addcc'] = 'Cc (Másolati cím) hozzáadása';
-$labels['addbcc'] = 'Bcc (Titkos másolati cím) hozzáadása';
-$labels['addreplyto'] = 'Válaszcím hozzáadása';
-$labels['mdnrequest'] = 'Az üzenet küldője értesítést kér arról hogy elolvastad a levelet. Elküdjük az Olvasási Értesítést?';
-$labels['receiptread'] = 'Olvasási Értesítés (olvasott)';
-$labels['yourmessage'] = 'Ez az üzeneted Olvasási Értesítése';
-$labels['receiptnote'] = 'Megjegyzés: Ez az Olvasási Értesítés csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát.';
-$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['messagecount'] = 'Üzenet';
-$labels['create'] = 'Létrehozás';
-$labels['createfolder'] = 'Új mappa létrehozása';
-$labels['rename'] = 'Átnevezés';
-$labels['renamefolder'] = 'Mappa átnevezése';
-$labels['deletefolder'] = 'Mappa törlése';
-$labels['managefolders'] = 'Mappák kezelése';
-$labels['sortby'] = 'Rendezés';
-$labels['sortasc'] = 'növekvő';
-$labels['sortdesc'] = 'csökkenő';
-
-?>
\ No newline at end of file
diff --git a/program/localization/hu/messages.inc b/program/localization/hu/messages.inc
deleted file mode 100644 (file)
index 4059162..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/hu/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Levente Farkas <lfarkas at lfarkas dot org>                   |
- |         Ervin Hegedüs <airween@damson.hu>                             |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1255 2008-04-05 12:49:21Z 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';
-$messages['movingmessage'] = 'Üzenet mozgatása...';
-$messages['receiptsent'] = 'Az Olvasási Értesítést elküldtük';
-$messages['errorsendingreceipt'] = 'Az Olvasási Értesítést nem sikerült elküldeni';
-$messages['nodeletelastidentity'] = 'Nem törölheti ezt a profilt, ez az egyetlen';
-$messages['addsubfolderhint'] = 'Az új könyvtárat az aktuálisan kiválasztott alkönyvtáraként fogjuk létrehozni';
-
-?>
\ No newline at end of file
diff --git a/program/localization/hu_HU/labels.inc b/program/localization/hu_HU/labels.inc
new file mode 100644 (file)
index 0000000..06f2d4f
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/hu/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Levente Farkas <lfarkas at lfarkas dot org>                   |
+ |         Ervin Hegedüs <airween@damson.hu>                             |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1069 2008-02-13 19:33:10Z yllar $
+
+*/
+
+$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['movemessagetotrash'] = 'Üzenet törlése';
+$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['markmessages'] = 'Üzenetek megjelölése';
+$labels['markread'] = 'Olvasottként';
+$labels['markunread'] = 'Olvasatlanként';
+$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['savemessage'] = 'Vázlat mentése';
+$labels['sendmessage'] = 'Üzenet azonnali küldé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['addcc'] = 'Cc (Másolati cím) hozzáadása';
+$labels['addbcc'] = 'Bcc (Titkos másolati cím) hozzáadása';
+$labels['addreplyto'] = 'Válaszcím hozzáadása';
+$labels['mdnrequest'] = 'Az üzenet küldője értesítést kér arról hogy elolvastad a levelet. Elküdjük az Olvasási Értesítést?';
+$labels['receiptread'] = 'Olvasási Értesítés (olvasott)';
+$labels['yourmessage'] = 'Ez az üzeneted Olvasási Értesítése';
+$labels['receiptnote'] = 'Megjegyzés: Ez az Olvasási Értesítés csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát.';
+$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['messagecount'] = 'Üzenet';
+$labels['create'] = 'Létrehozás';
+$labels['createfolder'] = 'Új mappa létrehozása';
+$labels['rename'] = 'Átnevezés';
+$labels['renamefolder'] = 'Mappa átnevezése';
+$labels['deletefolder'] = 'Mappa törlése';
+$labels['managefolders'] = 'Mappák kezelése';
+$labels['sortby'] = 'Rendezés';
+$labels['sortasc'] = 'növekvő';
+$labels['sortdesc'] = 'csökkenő';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hu_HU/messages.inc b/program/localization/hu_HU/messages.inc
new file mode 100644 (file)
index 0000000..29a17a6
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/hu/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Levente Farkas <lfarkas at lfarkas dot org>                   |
+ |         Ervin Hegedüs <airween@damson.hu>                             |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1192 2008-03-14 08:11:06Z yllar $
+
+*/
+
+$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';
+$messages['movingmessage'] = 'Üzenet mozgatása...';
+$messages['receiptsent'] = 'Az Olvasási Értesítést elküldtük';
+$messages['errorsendingreceipt'] = 'Az Olvasási Értesítést nem sikerült elküldeni';
+$messages['nodeletelastidentity'] = 'Nem törölheti ezt a profilt, ez az egyetlen';
+$messages['addsubfolderhint'] = 'Az új könyvtárat az aktuálisan kiválasztott alkönyvtáraként fogjuk létrehozni';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hy_AM/labels.inc b/program/localization/hy_AM/labels.inc
new file mode 100644 (file)
index 0000000..04d4987
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/am/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Vahan Yerkanian <vahan@arminco.com>                           |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
+
+$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'] = 'Cc';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Reply-To';
+$labels['date'] = 'Ամսաթիվ';
+$labels['size'] = 'Չափ';
+$labels['priority'] = 'Առավելություն';
+$labels['organization'] = 'Կազմակերպություն';
+$labels['reply-to'] = '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['movemessagetotrash'] = 'Գցել աղբարկղը';
+$labels['printmessage'] = 'Տպել';
+$labels['previousmessage'] = 'Ցուցադրել նախորդ նամակը';
+$labels['previousmessages'] = 'Ցուցադրել նախորդ նամակները';
+$labels['firstmessage'] = 'Ցուցադրել առաջին նամակը';
+$labels['firstmessages'] = 'Ցուցադրել առաջին էջը';
+$labels['nextmessage'] = 'Ցուցադրել հաջորդ նամակը';
+$labels['nextmessages'] = 'Ցուցադրել հաջորդ նամակները';
+$labels['lastmessage'] = 'Ցուցադրել վերջին նամակը';
+$labels['lastmessages'] = 'Ցուցադրել վերջին էջը';
+$labels['backtolist'] = 'Վերադառնալ նամակների ցուցակ';
+$labels['viewsource'] = 'Ցուցադրել նամակի կոդը';
+$labels['markmessages'] = 'Նշել նամակները';
+$labels['markread'] = 'որպես կարդացած';
+$labels['markunread'] = 'որպես չկարդացած';
+$labels['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['savemessage'] = 'Հիշել որպես սևագիր';
+$labels['sendmessage'] = 'Ուղարկել';
+$labels['addattachment'] = 'Կցել ֆայլ';
+$labels['charset'] = 'Տառաշար';
+$labels['editortype'] = 'Խմբագրի տիպը';
+$labels['returnreceipt'] = 'Ստացման հավաստագիր';
+$labels['checkspelling'] = 'Ստուգել ուղագրությունը';
+$labels['resumeediting'] = 'Շարունակել խմբագրումը';
+$labels['revertto'] = 'Վերականգնել';
+$labels['attachments'] = 'Կցումներ';
+$labels['upload'] = 'Բեռնել';
+$labels['close'] = 'Փակել';
+$labels['low'] = 'Ցածր';
+$labels['lowest'] = 'Նվազագույն';
+$labels['normal'] = 'Նորմալ';
+$labels['high'] = 'Կարևոր';
+$labels['highest'] = 'Կարևորագույն';
+$labels['nosubject'] = '(առանց վերնագրի)';
+$labels['showimages'] = 'Ցուցադրել նկարները';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Պարզ տեքստ';
+$labels['addcc'] = 'Ավելացնել Cc';
+$labels['addbcc'] = 'Ավելացնել Bcc';
+$labels['addreplyto'] = 'Ավելացնել Reply-To';
+$labels['mdnrequest'] = 'Նամակի հեղինակը խնդրել է նամակը կարդալուն պես տեղեկացնել իրեն։ Ցանկանում էք Տեղեկացնե՞լ։';
+$labels['receiptread'] = 'Նամակի ընթերցման ծանուցագիր';
+$labels['yourmessage'] = 'Սա Ձեր նամակի ընթերցման ծանուցագիրն է';
+$labels['receiptnote'] = 'Նշում՝ Այս ծանուցագիրը ընդամենը տեղեկացնում է, որ նամակը ցուցադրվել է հասցեատիրոջ համակարչով։ Չկա որևիցե երաշխիք, որ հասցեատերը իսկապես կարդացել է նամակը։';
+$labels['name'] = 'Մականուն';
+$labels['firstname'] = 'Անուն';
+$labels['surname'] = 'Ազգանուն';
+$labels['email'] = 'Էկ–փոստ';
+$labels['addcontact'] = 'Գրանցել նշած հասցեն';
+$labels['editcontact'] = 'Խմբագրել հասցեն';
+$labels['edit'] = 'Խմբագրել';
+$labels['cancel'] = 'Թարգել';
+$labels['save'] = 'Հիշել';
+$labels['delete'] = 'Ջնջել';
+$labels['newcontact'] = 'Ստեղծել նոր հասցեքարտ';
+$labels['deletecontact'] = 'Ջնջել նշած նամակները';
+$labels['composeto'] = 'Գրել նամակ';
+$labels['contactsfromto'] = 'Հասցեներ $from–ից $to–ը եղած $count–ից';
+$labels['print'] = 'Տպել';
+$labels['export'] = 'Արտահանել';
+$labels['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['messagecount'] = 'Նամակներ';
+$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/hy_AM/messages.inc b/program/localization/hy_AM/messages.inc
new file mode 100644 (file)
index 0000000..af16e8f
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/am/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Vahan Yerkanian <vahan@arminco.com>                           |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Մուտքը ձախողվեց';
+$messages['cookiesdisabled'] = 'Сookies–ների ապահովվումը բացակայում է';
+$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'] = 'Նամակը տեղափոխվում է…';
+$messages['receiptsent'] = 'Նամակի ընթերցման ծանուցագիրն ուղարկված է';
+$messages['errorsendingreceipt'] = 'Ծանուցագրի ուղարկումը ձախողվեց';
+$messages['nodeletelastidentity'] = 'Անհնար է ջնջել վերջին տարբերակը';
+$messages['addsubfolderhint'] = 'Այս դարակը կստեղծվի որպես նշվածի ենթադարակ';
+
+?>
\ No newline at end of file
index f2cd2f57adcec4e04a81a6bf86e09c9dcfe92877..51f0d3a19eb7aa94ec6df00577eeb00fedf4f71d 100644 (file)
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
- |   Provide centralized location for keeping track of                   |
- |   available languages                                                 |
+ |   Provide a centralized location table                                |
+ |   for keeping track of available languages                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: index.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: index.inc 1491 2008-06-07 19:31:56Z alec $
 
 */
- $rcube_languages = array(
-     'sq_AL' => 'Albanian',
-     'ar'    => 'Arabic',
-     'am'    => 'Armenian',
-     'bs_BA' => 'Bosnian (Bosanski)',
-     'bg'    => 'Bulgarian',
-     'ca'    => 'Català',
-     'zh_CN' => 'Chinese (Simplified)',
-     'zh_TW' => 'Chinese (Traditional)',
-     'hr'    => 'Croatian (Hrvatski)',
-     'cz'    => 'Czech',
-     'da'    => 'Dansk',
-     'de_DE' => 'Deutsch (Deutsch)',
-     'de_CH' => 'Deutsch (Schweiz)',
-     'en_GB' => 'English (GB)',
-     'en_US' => 'English (US)',
-     'es'    => 'Español',
-     'eo'    => 'Esperanto',
-     'et_EE' => 'Estonian',
-     'eu'    => 'Euskara',
-     'nl_BE' => 'Flemish',
-     'fr'    => 'Français',
-     'gl'    => 'Galego',
-     'ge'    => 'Georgian',
-     'el'    => 'Greek',
-     'he'    => 'Hebrew',
-     'hi'    => 'Hindi',
-     'hu'    => 'Hungarian',
-     'is'    => 'Icelandic',
-     'id_ID' => 'Indonesian',
-     'ga_IE' => 'Irish',
-     'it'    => 'Italiano',
-     'ja'    => 'Japanese (日本語)',
-     'kr'    => 'Korean',
-     'ku'    => 'Kurdish (Kurmancî)',
-     'lv'    => 'Latvian',
-     'lt'    => 'Lithuanian',
-     'mk'    => 'Macedonian',
-     'ms_MY' => 'Malay',
-     'nl_NL' => 'Nederlands',
-     'ne'    => 'Nepali',
-     'nb_NO' => 'Norsk (bokmål)',
-     'nn_NO' => 'Norsk (nynorsk)',
-     'fa'    => 'Persian',
-     'pl'    => 'Polski',
-     'pt_BR' => 'Portuguese (Brazilian)',
-     'pt_PT' => 'Portuguese (Standard)',
-     'ro'    => 'Romanian',
-     'ru'    => 'Russian',
-     'sr_cyrillic'   => 'Serbian Cyrillic',
-     'sr_latin'      => 'Serbian Latin',
-     'si'    => 'Sinhala',
-     'sk'    => 'Slovak',
-     'sl'    => 'Slovenian',
-     'fi'    => 'Suomi',
-     'se'    => 'Svenska',
-     'th_TH' => 'Thai',
-     'tr'    => 'Turkish',
-     'uk'    => 'Ukrainian',
-     'vn'    => 'Vietnamese'
+
+// langage codes according to ISO 639-1
+// country codes according to ISO 3166-1 (Alpha-2)
+
+$rcube_languages = array(
+  'sq_AL' => 'Albanian',
+  'ar_SA' => 'Arabic',
+  'hy_AM' => 'Armenian',
+  'bs_BA' => 'Bosnian (Serbian Latin)',
+  'bg_BG' => 'Bulgarian',
+  'ca_ES' => 'Català',
+  'zh_CN' => 'Chinese (Simplified)',
+  'zh_TW' => 'Chinese (Traditional)',
+  'hr_HR' => 'Croatian (Hrvatski)',
+  'cs_CZ' => 'Czech',
+  'da_DK' => 'Dansk',
+  'de_DE' => 'Deutsch (Deutsch)',
+  'de_CH' => 'Deutsch (Schweiz)',
+  'en_GB' => 'English (GB)',
+  'en_US' => 'English (US)',
+  'es_ES' => 'Español',
+  'eo'    => 'Esperanto',
+  'et_EE' => 'Estonian',
+  'eu_ES' => 'Euskara (Basque)',
+  'fi_FI' => 'Finnish (Suomi)',
+  'nl_BE' => 'Flemish',
+  'fr_FR' => 'Français',
+  'gl_ES' => 'Galego (Galician)',
+  'ka_GE' => 'Georgian (Kartuli)',
+  'el_GR' => 'Greek',
+  'he_IL' => 'Hebrew',
+  'hi_IN' => 'Hindi',
+  'hu_HU' => 'Hungarian',
+  'is_IS' => 'Icelandic',
+  'id_ID' => 'Indonesian',
+  'ga_IE' => 'Irish',
+  'it_IT' => 'Italiano',
+  'ja_JP' => 'Japanese (日本語)',
+  'ko_KR' => 'Korean',
+  'ku'    => 'Kurdish (Kurmancî)',
+  'lv_LV' => 'Latvian',
+  'lt_LT' => 'Lithuanian',
+  'mk_MK' => 'Macedonian',
+  'ms_MY' => 'Malay',
+  'nl_NL' => 'Nederlands',
+  'ne_NP' => 'Nepali',
+  'nb_NO' => 'Norsk (Bokmål)',
+  'nn_NO' => 'Norsk (Nynorsk)',
+  'fa'    => 'Persian (Farsi)',
+  'pl_PL' => 'Polski',
+  'pt_BR' => 'Portuguese (Brazilian)',
+  'pt_PT' => 'Portuguese (Standard)',
+  'ro_RO' => 'Romanian',
+  'ru_RU' => 'Russian',
+  'sr_CS' => 'Serbian (Cyrillic)',
+  'si_LK' => 'Sinhala',
+  'sk_SK' => 'Slovak',
+  'sl_SI' => 'Slovenian',
+  'sv_SE' => 'Swedish (Svenska)',
+  'th_TH' => 'Thai',
+  'tr_TR' => 'Turkish',
+  'uk_UA' => 'Ukrainian',
+  'vi_VN' => 'Vietnamese',
 );
 
 $rcube_language_aliases = array(
-    'ee' => 'et_EE',
-    'bs' => 'bs_BA',
-    'cn' => 'zh_CN',
-    'de' => 'de_DE',
-    'en' => 'en_US',
-    'ga' => 'ga_IE',
-    'nl' => 'nl_NL',
-    'no' => 'nn_NO',
-    'pt' => 'pt_PT',
-    'th' => 'th_TH',
-    'tw' => 'zh_TW'
+  'ar' => 'ar_SA',
+  'am' => 'hy_AM',
+  'bg' => 'bg_BG',
+  'bs' => 'bs_BA',
+  'ca' => 'ca_ES',
+  'cn' => 'zh_CN',
+  'cs' => 'cs_CZ',
+  'cz' => 'cs_CZ',
+  'da' => 'da_DK',
+  'de' => 'de_DE',
+  'ee' => 'et_EE',
+  'el' => 'el_GR',
+  'en' => 'en_US',
+  'eu' => 'eu_ES',
+  'ga' => 'ga_IE',
+  'ge' => 'ka_GE',
+  'gl' => 'gl_ES',
+  'he' => 'he_IL',
+  'hi' => 'hi_IN',
+  'hr' => 'hr_HR',
+  'ja' => 'ja_JP',
+  'ko' => 'ko_KR',
+  'kr' => 'ko_KR',
+  'ne' => 'ne_NP',
+  'no' => 'nn_NO',
+  'ms' => 'ms_MY',
+  'pl' => 'pl_PL',
+  'tw' => 'zh_TW',
+  'si' => 'si_LK',
+  'sl' => 'sl_SI',
+  'sr' => 'sr_CS',
+  'sr_cyrillic' => 'sr_CS',
+  'sr_latin' => 'bs_BA',
+  'se' => 'sv_SE',
+  'sv' => 'sv_SE',
+  'uk' => 'uk_UA',
+  'vn' => 'vi_VN',
+  'vi' => 'vi_VN',
+  'zh' => 'zh_CN',
 );
 
-$rcube_charsets = array();
 
 ?>
diff --git a/program/localization/is/labels.inc b/program/localization/is/labels.inc
deleted file mode 100644 (file)
index c6b8b0a..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/en_GB/labels.inc                                             |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
-
-*/
-
-$labels = array();
-
-// login page
-$labels['welcome']   = 'Vefpóstur Vodafone';
-$labels['username']  = 'Netfang';
-$labels['password']  = 'Lykilorð';
-$labels['server']    = 'Server';
-$labels['login']     = 'Innskrá';
-
-// taskbar
-$labels['logout']   = 'Útskrá';
-$labels['mail']     = 'Tölvupóstur';
-$labels['settings'] = 'Stillingar';
-$labels['addressbook'] = 'Netfangaskrá';
-
-// mailbox names
-$labels['inbox']  = 'Innhólf';
-$labels['drafts'] = 'Drög';
-$labels['sent']   = 'Sent';
-$labels['trash']  = 'Eyddir hlutir';
-$labels['junk']   = 'Ruslpóstur';
-
-// message listing
-$labels['subject'] = 'Efni';
-$labels['from']    = 'Sendandi';
-$labels['to']      = 'Viðtakandi';
-$labels['cc']      = 'Afrit';
-$labels['bcc']     = 'Blint afrit';
-$labels['replyto'] = 'Reply-To';
-$labels['date']    = 'Dags';
-$labels['size']    = 'Stærð';
-$labels['priority'] = 'Forgangur';
-$labels['organization'] = 'Stofnun';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
-$labels['mailboxlist'] = 'Möppur';
-$labels['messagesfromto'] = 'Skeyti $from til $to af $count';
-$labels['messagenrof'] = 'Skeyti $nr af $count';
-
-$labels['moveto']   = 'færa í...';
-$labels['download'] = 'sækja';
-
-$labels['filename'] = 'Skrárnafn';
-$labels['filesize'] = 'Skrárstærð';
-
-$labels['preferhtml'] = 'Vil HTML';
-$labels['htmlmessage'] = 'HTML skeyti';
-$labels['prettydate'] = 'Fallegar dagsetningar';
-
-$labels['addtoaddressbook'] = 'Bæta í netfangaskrá';
-
-// weekdays short
-$labels['sun'] = 'sun';
-$labels['mon'] = 'mán';
-$labels['tue'] = 'þri';
-$labels['wed'] = 'mið';
-$labels['thu'] = 'fim';
-$labels['fri'] = 'fös';
-$labels['sat'] = 'lau';
-
-// weekdays long
-$labels['sunday']    = 'sunnudagur';
-$labels['monday']    = 'mánudagur';
-$labels['tuesday']   = 'þriðjudagur';
-$labels['wednesday'] = 'miðvikudagur';
-$labels['thursday']  = 'fimmtudagur';
-$labels['friday']    = 'föstudagur';
-$labels['saturday']  = 'laugardagur';
-
-$labels['today'] = 'í dag';
-
-// toolbar buttons
-$labels['checkmail']        = 'Gá að nýjum skeytum';
-$labels['writenewmessage']  = 'Búa til nýtt skeyti';
-$labels['replytomessage']   = 'Svara skeyti';
-$labels['replytoallmessage'] = 'Svara sendanda og öllum viðtakendum';
-$labels['forwardmessage']   = 'Framsenda skeyti';
-$labels['deletemessage']    = 'Færa skeyti í rusl';
-$labels['printmessage']     = 'Prenta skeyti';
-$labels['previousmessages'] = 'Sýna fyrri skammt af skeytum';
-$labels['nextmessages']     = 'Sýna næsta skammt af skeytum';
-$labels['backtolist']       = 'Til baka í skeytalista';
-$labels['viewsource']       = 'Skoða kóða';
-
-$labels['select'] = 'Velja';
-$labels['all'] = 'Allt';
-$labels['none'] = 'Ekkert';
-$labels['unread'] = 'Ólesið';
-
-$labels['compact'] = 'Pakka';
-$labels['empty'] = 'Tæma';
-$labels['purge'] = 'Hreinsa';
-
-$labels['quota'] = 'Gagnamagn';
-
-
-// message compose
-$labels['compose']  = 'Semja skeyti';
-$labels['savemessage']  = 'Vista drög';
-$labels['sendmessage']  = 'Senda skeytið núna';
-$labels['addattachment']  = 'Hengja við';
-$labels['charset']  = 'Stafasett';
-
-$labels['returnreceipt']  = 'Kvittun við lestur';
-
-$labels['attachments'] = 'Viðhengi';
-$labels['upload'] = 'Senda';
-$labels['close']  = 'Loka';
-
-$labels['low']     = 'Lágt';
-$labels['lowest']  = 'Lægst';
-$labels['normal']  = 'Venjulegt';
-$labels['high']    = 'Hátt';
-$labels['highest'] = 'Hæst';
-
-$labels['nosubject']  = '(ekkert efni)';
-$labels['showimages'] = 'Birta myndir';
-
-$labels['editortype'] = 'Gerð ritils';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Einfaldur';
-
-$labels['checkspelling'] = 'Villuleita';
-$labels['resumeediting'] = 'Aftur í ritham';
-$labels['revertto']      = 'Hverfa til';
-
-$labels['addcc'] = 'Bæta við Cc';
-$labels['addbcc'] = 'Bæta við Bcc';
-$labels['addreplyto'] = 'Bæta við Reply-To';
-
-
-// address boook
-$labels['name']      = 'Nafn til birtingar';
-$labels['firstname'] = 'Fornafn';
-$labels['surname']   = 'Eftirnafn';
-$labels['email']     = 'Netfang';
-$labels['mobile']    = 'Farsími';
-
-$labels['addcontact'] = 'Bæta við nýju';
-$labels['editcontact'] = 'Lagfæra';
-
-$labels['edit']   = 'Laga';
-$labels['cancel'] = 'Hætta við';
-$labels['save']   = 'Vista';
-$labels['delete'] = 'Eyða';
-
-$labels['newcontact']     = 'Búa til nýtt nafnspjald';
-$labels['deletecontact']  = 'Eyða völdum netföngum';
-$labels['composeto']      = 'Skrifa skeyti til';
-$labels['contactsfromto'] = 'Netföng $from til $to af $count';
-$labels['print']          = 'Prenta';
-$labels['export']         = 'Flytja út';
-
-
-// settings
-$labels['settingsfor']  = 'Stillingar fyrir';
-
-$labels['preferences']  = 'Stillingar';
-$labels['userpreferences']  = 'Notendastillingar';
-$labels['editpreferences']  = 'Breyta notendastillingum';
-
-$labels['identities']  = 'Identities';
-$labels['manageidentities']  = 'Manage identities for this account';
-$labels['newidentity']  = 'New identity';
-
-$labels['newitem']  = 'Nýtt';
-$labels['edititem']  = 'Laga';
-
-$labels['setdefault']  = 'Gera sjálfgilt';
-$labels['language']  = 'Tungumál';
-$labels['timezone']  = 'Tímabelti';
-$labels['pagesize']  = 'Línur á síðu';
-$labels['signature'] = 'Undirskrift';
-$labels['dstactive']  = 'Sumar-/vetratími';
-$labels['htmleditor'] = 'Skrifa HTML-skeyti';
-$labels['htmlsignature'] = 'HTML-undirskrift';
-$labels['previewpane'] = 'Sýna forskoðunarglugga';
-
-$labels['autosavedraft']  = 'Vista sjálfkrafa sem drög';
-$labels['everynminutes']  = 'á $n mínútna fresti';
-$labels['never']  = 'aldrei';
-
-$labels['folder']  = 'Mappa';
-$labels['folders']  = 'Möppur';
-$labels['foldername']  = 'Nafn möppu';
-$labels['subscribed']  = 'Valin';
-$labels['create']  = 'Búa til';
-$labels['createfolder']  = 'Búa til nýja möppu';
-$labels['deletefolder']  = 'Eyða möppu';
-$labels['managefolders']  = 'Sýsla með möppum';
-$labels['renamefolder'] = 'Breyta nafni möppu';
-
-
-
-$labels['sortby'] = 'Raða eftir';
-$labels['sortasc']  = 'Raða vaxandi';
-$labels['sortdesc'] = 'Raða minnkandi';
-
-?>
diff --git a/program/localization/is/messages.inc b/program/localization/is/messages.inc
deleted file mode 100644 (file)
index fdc1abb..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/en_GB/messages.inc                                           |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 466 2007-02-06 09:17:01Z tomekp $
-
-*/
-
-$messages = array();
-$messages['loginfailed']  = 'Innskráning mistókst';
-$messages['cookiesdisabled'] = 'Vafrinn þinn vill ekki taka við kökum (cookies)';
-$messages['sessionerror'] = 'Innskráningin þín ógild eða útrunnin';
-$messages['imaperror'] = 'Tengin við IMAP-miðlara mistókst';
-$messages['nomessagesfound'] = 'Engin skeyti eru í þessu pósthólfi';
-$messages['loggedout'] = 'Þú hefur útskráðst. Bless!';
-$messages['mailboxempty'] = 'Pósthólfið er tómt';
-$messages['loading'] = 'Hleð...';
-$messages['loadingdata'] = 'Hleð gögn...';
-$messages['checkingmail'] = 'Gái að nýjum skeytum...';
-$messages['messagesent'] = 'Skeyti var sent';
-$messages['savingmessage'] = 'Vista skeyti...';
-$messages['messagesaved'] = 'Skeytið vistað í Drög';
-$messages['successfullysaved'] = 'Vistun heppnaðist!';
-$messages['addedsuccessfully'] = 'Netfangi var bætt í netfangaskrá';
-$messages['contactexists'] = 'Þetta netfang er þegar skráð í netfangaskrána';
-$messages['blockedimages'] = 'Til verndar hafa allar myndir í þessu skeyti verið blokkaðar.';
-$messages['encryptedmessage'] = 'Þetta er dulkóðað skeyti og því miður er ekki hægt að birta það';
-$messages['nocontactsfound'] = 'Engin netföng';
-$messages['sendingfailed'] = 'Sending misheppnaðist';
-$messages['errorsaving'] = 'Villa kom upp þegar var verið að vista';
-$messages['errormoving'] = 'Gat ekki fært skeytið';
-$messages['errordeleting'] = 'Gat ekki eytt skeytinu';
-$messages['deletecontactconfirm']  = 'Ertu viss um að þú viljir eyða völdum netföngum?';
-$messages['deletefolderconfirm']  = 'Ertu viss um að vilja eyða þessari möppu?';
-$messages['formincomplete'] = 'Formið var ekki fyllt út að fullu';
-$messages['noemailwarning'] = 'Sláðu inn gildt netfang';
-$messages['nonamewarning']  = 'Sláðu inn nafn';
-$messages['nopagesizewarning'] = 'Sláðu inn síðustærð';
-$messages['norecipientwarning'] = 'Í það minnsta einn viðtakandi verður að vera';
-$messages['nosubjectwarning']  = 'Efnislínan er tóm. Viltu slá eitthvað inn í hana?';
-$messages['nobodywarning'] = 'Viltu senda tómt skeyti?';
-$messages['notsentwarning'] = 'Skeytið hefur ekki verið send. Viltu henda skeytinu?';
-$messages['noldapserver'] = 'Please select an ldap server to search';
-$messages['nocontactsreturned'] = 'Engin netföng fundust';
-$messages['nosearchname'] = 'Sláðu inn nafn eða netfang';
-$messages['searchsuccessful'] = '$nr skeyti fundust';
-$messages['searchnomatch'] = 'Leit skilaði engu';
-$messages['searching'] = 'Leita...';
-$messages['checking'] = 'Gái...';
-$messages['nospellerrors'] = 'Engar innsláttarvillur fundust';
-$messages['folderdeleted'] = 'Möppu var eytt';
-
-?>
\ No newline at end of file
diff --git a/program/localization/is_IS/labels.inc b/program/localization/is_IS/labels.inc
new file mode 100644 (file)
index 0000000..c6b8b0a
--- /dev/null
@@ -0,0 +1,220 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/en_GB/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Vefpóstur Vodafone';
+$labels['username']  = 'Netfang';
+$labels['password']  = 'Lykilorð';
+$labels['server']    = 'Server';
+$labels['login']     = 'Innskrá';
+
+// taskbar
+$labels['logout']   = 'Útskrá';
+$labels['mail']     = 'Tölvupóstur';
+$labels['settings'] = 'Stillingar';
+$labels['addressbook'] = 'Netfangaskrá';
+
+// mailbox names
+$labels['inbox']  = 'Innhólf';
+$labels['drafts'] = 'Drög';
+$labels['sent']   = 'Sent';
+$labels['trash']  = 'Eyddir hlutir';
+$labels['junk']   = 'Ruslpóstur';
+
+// message listing
+$labels['subject'] = 'Efni';
+$labels['from']    = 'Sendandi';
+$labels['to']      = 'Viðtakandi';
+$labels['cc']      = 'Afrit';
+$labels['bcc']     = 'Blint afrit';
+$labels['replyto'] = 'Reply-To';
+$labels['date']    = 'Dags';
+$labels['size']    = 'Stærð';
+$labels['priority'] = 'Forgangur';
+$labels['organization'] = 'Stofnun';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Möppur';
+$labels['messagesfromto'] = 'Skeyti $from til $to af $count';
+$labels['messagenrof'] = 'Skeyti $nr af $count';
+
+$labels['moveto']   = 'færa í...';
+$labels['download'] = 'sækja';
+
+$labels['filename'] = 'Skrárnafn';
+$labels['filesize'] = 'Skrárstærð';
+
+$labels['preferhtml'] = 'Vil HTML';
+$labels['htmlmessage'] = 'HTML skeyti';
+$labels['prettydate'] = 'Fallegar dagsetningar';
+
+$labels['addtoaddressbook'] = 'Bæta í netfangaskrá';
+
+// weekdays short
+$labels['sun'] = 'sun';
+$labels['mon'] = 'mán';
+$labels['tue'] = 'þri';
+$labels['wed'] = 'mið';
+$labels['thu'] = 'fim';
+$labels['fri'] = 'fös';
+$labels['sat'] = 'lau';
+
+// weekdays long
+$labels['sunday']    = 'sunnudagur';
+$labels['monday']    = 'mánudagur';
+$labels['tuesday']   = 'þriðjudagur';
+$labels['wednesday'] = 'miðvikudagur';
+$labels['thursday']  = 'fimmtudagur';
+$labels['friday']    = 'föstudagur';
+$labels['saturday']  = 'laugardagur';
+
+$labels['today'] = 'í dag';
+
+// toolbar buttons
+$labels['checkmail']        = 'Gá að nýjum skeytum';
+$labels['writenewmessage']  = 'Búa til nýtt skeyti';
+$labels['replytomessage']   = 'Svara skeyti';
+$labels['replytoallmessage'] = 'Svara sendanda og öllum viðtakendum';
+$labels['forwardmessage']   = 'Framsenda skeyti';
+$labels['deletemessage']    = 'Færa skeyti í rusl';
+$labels['printmessage']     = 'Prenta skeyti';
+$labels['previousmessages'] = 'Sýna fyrri skammt af skeytum';
+$labels['nextmessages']     = 'Sýna næsta skammt af skeytum';
+$labels['backtolist']       = 'Til baka í skeytalista';
+$labels['viewsource']       = 'Skoða kóða';
+
+$labels['select'] = 'Velja';
+$labels['all'] = 'Allt';
+$labels['none'] = 'Ekkert';
+$labels['unread'] = 'Ólesið';
+
+$labels['compact'] = 'Pakka';
+$labels['empty'] = 'Tæma';
+$labels['purge'] = 'Hreinsa';
+
+$labels['quota'] = 'Gagnamagn';
+
+
+// message compose
+$labels['compose']  = 'Semja skeyti';
+$labels['savemessage']  = 'Vista drög';
+$labels['sendmessage']  = 'Senda skeytið núna';
+$labels['addattachment']  = 'Hengja við';
+$labels['charset']  = 'Stafasett';
+
+$labels['returnreceipt']  = 'Kvittun við lestur';
+
+$labels['attachments'] = 'Viðhengi';
+$labels['upload'] = 'Senda';
+$labels['close']  = 'Loka';
+
+$labels['low']     = 'Lágt';
+$labels['lowest']  = 'Lægst';
+$labels['normal']  = 'Venjulegt';
+$labels['high']    = 'Hátt';
+$labels['highest'] = 'Hæst';
+
+$labels['nosubject']  = '(ekkert efni)';
+$labels['showimages'] = 'Birta myndir';
+
+$labels['editortype'] = 'Gerð ritils';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Einfaldur';
+
+$labels['checkspelling'] = 'Villuleita';
+$labels['resumeediting'] = 'Aftur í ritham';
+$labels['revertto']      = 'Hverfa til';
+
+$labels['addcc'] = 'Bæta við Cc';
+$labels['addbcc'] = 'Bæta við Bcc';
+$labels['addreplyto'] = 'Bæta við Reply-To';
+
+
+// address boook
+$labels['name']      = 'Nafn til birtingar';
+$labels['firstname'] = 'Fornafn';
+$labels['surname']   = 'Eftirnafn';
+$labels['email']     = 'Netfang';
+$labels['mobile']    = 'Farsími';
+
+$labels['addcontact'] = 'Bæta við nýju';
+$labels['editcontact'] = 'Lagfæra';
+
+$labels['edit']   = 'Laga';
+$labels['cancel'] = 'Hætta við';
+$labels['save']   = 'Vista';
+$labels['delete'] = 'Eyða';
+
+$labels['newcontact']     = 'Búa til nýtt nafnspjald';
+$labels['deletecontact']  = 'Eyða völdum netföngum';
+$labels['composeto']      = 'Skrifa skeyti til';
+$labels['contactsfromto'] = 'Netföng $from til $to af $count';
+$labels['print']          = 'Prenta';
+$labels['export']         = 'Flytja út';
+
+
+// settings
+$labels['settingsfor']  = 'Stillingar fyrir';
+
+$labels['preferences']  = 'Stillingar';
+$labels['userpreferences']  = 'Notendastillingar';
+$labels['editpreferences']  = 'Breyta notendastillingum';
+
+$labels['identities']  = 'Identities';
+$labels['manageidentities']  = 'Manage identities for this account';
+$labels['newidentity']  = 'New identity';
+
+$labels['newitem']  = 'Nýtt';
+$labels['edititem']  = 'Laga';
+
+$labels['setdefault']  = 'Gera sjálfgilt';
+$labels['language']  = 'Tungumál';
+$labels['timezone']  = 'Tímabelti';
+$labels['pagesize']  = 'Línur á síðu';
+$labels['signature'] = 'Undirskrift';
+$labels['dstactive']  = 'Sumar-/vetratími';
+$labels['htmleditor'] = 'Skrifa HTML-skeyti';
+$labels['htmlsignature'] = 'HTML-undirskrift';
+$labels['previewpane'] = 'Sýna forskoðunarglugga';
+
+$labels['autosavedraft']  = 'Vista sjálfkrafa sem drög';
+$labels['everynminutes']  = 'á $n mínútna fresti';
+$labels['never']  = 'aldrei';
+
+$labels['folder']  = 'Mappa';
+$labels['folders']  = 'Möppur';
+$labels['foldername']  = 'Nafn möppu';
+$labels['subscribed']  = 'Valin';
+$labels['create']  = 'Búa til';
+$labels['createfolder']  = 'Búa til nýja möppu';
+$labels['deletefolder']  = 'Eyða möppu';
+$labels['managefolders']  = 'Sýsla með möppum';
+$labels['renamefolder'] = 'Breyta nafni möppu';
+
+
+
+$labels['sortby'] = 'Raða eftir';
+$labels['sortasc']  = 'Raða vaxandi';
+$labels['sortdesc'] = 'Raða minnkandi';
+
+?>
diff --git a/program/localization/is_IS/messages.inc b/program/localization/is_IS/messages.inc
new file mode 100644 (file)
index 0000000..fdc1abb
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/en_GB/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 466 2007-02-06 09:17:01Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Innskráning mistókst';
+$messages['cookiesdisabled'] = 'Vafrinn þinn vill ekki taka við kökum (cookies)';
+$messages['sessionerror'] = 'Innskráningin þín ógild eða útrunnin';
+$messages['imaperror'] = 'Tengin við IMAP-miðlara mistókst';
+$messages['nomessagesfound'] = 'Engin skeyti eru í þessu pósthólfi';
+$messages['loggedout'] = 'Þú hefur útskráðst. Bless!';
+$messages['mailboxempty'] = 'Pósthólfið er tómt';
+$messages['loading'] = 'Hleð...';
+$messages['loadingdata'] = 'Hleð gögn...';
+$messages['checkingmail'] = 'Gái að nýjum skeytum...';
+$messages['messagesent'] = 'Skeyti var sent';
+$messages['savingmessage'] = 'Vista skeyti...';
+$messages['messagesaved'] = 'Skeytið vistað í Drög';
+$messages['successfullysaved'] = 'Vistun heppnaðist!';
+$messages['addedsuccessfully'] = 'Netfangi var bætt í netfangaskrá';
+$messages['contactexists'] = 'Þetta netfang er þegar skráð í netfangaskrána';
+$messages['blockedimages'] = 'Til verndar hafa allar myndir í þessu skeyti verið blokkaðar.';
+$messages['encryptedmessage'] = 'Þetta er dulkóðað skeyti og því miður er ekki hægt að birta það';
+$messages['nocontactsfound'] = 'Engin netföng';
+$messages['sendingfailed'] = 'Sending misheppnaðist';
+$messages['errorsaving'] = 'Villa kom upp þegar var verið að vista';
+$messages['errormoving'] = 'Gat ekki fært skeytið';
+$messages['errordeleting'] = 'Gat ekki eytt skeytinu';
+$messages['deletecontactconfirm']  = 'Ertu viss um að þú viljir eyða völdum netföngum?';
+$messages['deletefolderconfirm']  = 'Ertu viss um að vilja eyða þessari möppu?';
+$messages['formincomplete'] = 'Formið var ekki fyllt út að fullu';
+$messages['noemailwarning'] = 'Sláðu inn gildt netfang';
+$messages['nonamewarning']  = 'Sláðu inn nafn';
+$messages['nopagesizewarning'] = 'Sláðu inn síðustærð';
+$messages['norecipientwarning'] = 'Í það minnsta einn viðtakandi verður að vera';
+$messages['nosubjectwarning']  = 'Efnislínan er tóm. Viltu slá eitthvað inn í hana?';
+$messages['nobodywarning'] = 'Viltu senda tómt skeyti?';
+$messages['notsentwarning'] = 'Skeytið hefur ekki verið send. Viltu henda skeytinu?';
+$messages['noldapserver'] = 'Please select an ldap server to search';
+$messages['nocontactsreturned'] = 'Engin netföng fundust';
+$messages['nosearchname'] = 'Sláðu inn nafn eða netfang';
+$messages['searchsuccessful'] = '$nr skeyti fundust';
+$messages['searchnomatch'] = 'Leit skilaði engu';
+$messages['searching'] = 'Leita...';
+$messages['checking'] = 'Gái...';
+$messages['nospellerrors'] = 'Engar innsláttarvillur fundust';
+$messages['folderdeleted'] = 'Möppu var eytt';
+
+?>
\ No newline at end of file
diff --git a/program/localization/it/labels.inc b/program/localization/it/labels.inc
deleted file mode 100644 (file)
index 1e29225..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/it/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
- |         Yusef Maali <contact@yusefmaali.net>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Benvenuto in $product';
-$labels['username'] = 'Utente';
-$labels['password'] = 'Password';
-$labels['server'] = 'Server';
-$labels['login'] = 'Entra';
-$labels['logout'] = 'Esci';
-$labels['mail'] = 'E-Mail';
-$labels['settings'] = 'Impostazioni';
-$labels['addressbook'] = 'Rubrica';
-$labels['inbox'] = 'Posta in arrivo';
-$labels['drafts'] = 'Bozze';
-$labels['sent'] = 'Inviata';
-$labels['trash'] = 'Cestino';
-$labels['junk'] = 'Spam';
-$labels['subject'] = 'Oggetto';
-$labels['from'] = 'Mittente';
-$labels['to'] = 'Destinatario';
-$labels['cc'] = 'Cc';
-$labels['bcc'] = 'Ccn';
-$labels['replyto'] = 'Rispondi a';
-$labels['date'] = 'Data';
-$labels['size'] = 'Dimensione';
-$labels['priority'] = 'Priorità';
-$labels['organization'] = 'Società';
-$labels['reply-to'] = 'Rispondi a';
-$labels['mailboxlist'] = 'Cartelle';
-$labels['messagesfromto'] = 'Messaggi da $from a $to di $count';
-$labels['messagenrof'] = 'Messaggio $nr di $count';
-$labels['moveto'] = 'sposta...';
-$labels['download'] = 'download';
-$labels['filename'] = 'Nome file';
-$labels['filesize'] = 'Dimensione file';
-$labels['preferhtml'] = 'Mostra HTML';
-$labels['htmlmessage'] = 'Messaggio HTML';
-$labels['prettydate'] = 'Date più leggibili';
-$labels['addtoaddressbook'] = 'Aggiungi alla rubrica';
-$labels['sun'] = 'Dom';
-$labels['mon'] = 'Lun';
-$labels['tue'] = 'Mar';
-$labels['wed'] = 'Mer';
-$labels['thu'] = 'Gio';
-$labels['fri'] = 'Ven';
-$labels['sat'] = 'Sab';
-$labels['sunday'] = 'Domenica';
-$labels['monday'] = 'Lunedì';
-$labels['tuesday'] = 'Martedì';
-$labels['wednesday'] = 'Mercoledì';
-$labels['thursday'] = 'Giovedì';
-$labels['friday'] = 'Venerdì';
-$labels['saturday'] = 'Sabato';
-$labels['today'] = 'Oggi';
-$labels['checkmail'] = 'Controlla nuovi messaggi';
-$labels['writenewmessage'] = 'Scrivi un nuovo messaggio';
-$labels['replytomessage'] = 'Rispondi al messaggio';
-$labels['replytoallmessage'] = 'Rispondi a tutti';
-$labels['forwardmessage'] = 'Inoltra il messaggio';
-$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';
-$labels['firstmessage'] = 'Visualizza il primo messaggio';
-$labels['firstmessages'] = 'Visualizza il primo set di messaggi';
-$labels['nextmessage'] = 'Visualizza il messaggio successivo';
-$labels['nextmessages'] = 'Visualizza messaggi successivi';
-$labels['lastmessage'] = 'Visualizza l\'ultimo messaggio';
-$labels['lastmessages'] = 'Visualizza l\'ultimo set di messaggi';
-$labels['backtolist'] = 'Torna alla lista messaggi';
-$labels['viewsource'] = 'Visualizza sorgente messaggio';
-$labels['markmessages'] = 'Marca i messaggi';
-$labels['markread'] = 'Letti';
-$labels['markunread'] = 'Non letti';
-$labels['select'] = 'Seleziona';
-$labels['all'] = 'Tutti';
-$labels['none'] = 'Nessuno';
-$labels['unread'] = 'Non letti';
-$labels['compact'] = 'Compatta';
-$labels['empty'] = 'Svuota';
-$labels['purge'] = 'Pulisci';
-$labels['quota'] = 'Spazio utilizzato';
-$labels['unknown'] = 'sconosciuto';
-$labels['unlimited'] = 'illimitato';
-$labels['quicksearch'] = 'Ricerca veloce';
-$labels['resetsearch'] = 'Annulla ricerca';
-$labels['compose'] = 'Scrivi un messaggio';
-$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';
-$labels['returnreceipt'] = 'Ricevuta di ritorno';
-$labels['checkspelling'] = 'Controlla ortografia';
-$labels['resumeediting'] = 'Torna al messaggio';
-$labels['revertto'] = 'Ripristina';
-$labels['attachments'] = 'Allegati';
-$labels['upload'] = 'Aggiungi';
-$labels['close'] = 'Chiudi';
-$labels['low'] = 'Bassa';
-$labels['lowest'] = 'Molto bassa';
-$labels['normal'] = 'Normale';
-$labels['high'] = 'Alta';
-$labels['highest'] = 'Molto alta';
-$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['mdnrequest'] = 'Il mittente richiede di ricevere una notifica dell\'avvenuta lettura del messaggio. Si desidera inviare tale notifica?';
-$labels['receiptread'] = 'Ricevuta di ritorno (letto)';
-$labels['yourmessage'] = 'Questa è la ricevuta di ritorno del mesaggio inviato';
-$labels['receiptnote'] = 'Nota: questa Ricevuta di ritorno attesta solamente che il messaggio è stato visualizzato nel computer del destinatario. Non c\'è pertanto alcuna garanzia che il destinatario abbia letto o compreso il suo contenuto.';
-$labels['name'] = 'Nome visualizzato';
-$labels['firstname'] = 'Nome';
-$labels['surname'] = 'Cognome';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Aggiungi contatto alla rubrica';
-$labels['editcontact'] = 'Modifica contatto';
-$labels['edit'] = 'Modifica';
-$labels['cancel'] = 'Annulla';
-$labels['save'] = 'Salva';
-$labels['delete'] = 'Elimina';
-$labels['newcontact'] = 'Crea un nuovo contatto';
-$labels['deletecontact'] = 'Elimina i contatti selezionati';
-$labels['composeto'] = 'Invia email a';
-$labels['contactsfromto'] = 'Contatti da $from a $to di $count';
-$labels['print'] = 'Stampa';
-$labels['export'] = 'Esporta';
-$labels['previouspage'] = 'Pagina precedente';
-$labels['firstpage'] = 'Prima pagina';
-$labels['nextpage'] = 'Pagina successiva';
-$labels['lastpage'] = 'Ultima pagina';
-$labels['groups'] = 'Gruppi';
-$labels['personaladrbook'] = 'Rubrica Personale';
-$labels['settingsfor'] = 'Impostazioni per ';
-$labels['preferences'] = 'Preferenze';
-$labels['userpreferences'] = 'Preferenze utente';
-$labels['editpreferences'] = 'Modifica le preferenze per l\'utente';
-$labels['identities'] = 'Identità';
-$labels['manageidentities'] = 'Gestisci le identità per questo account';
-$labels['newidentity'] = 'Nuova identità';
-$labels['newitem'] = 'Nuovo elemento';
-$labels['edititem'] = 'Modifica elemento';
-$labels['setdefault'] = 'Imposta predefinita';
-$labels['language'] = 'Lingua';
-$labels['timezone'] = 'Fuso orario';
-$labels['pagesize'] = 'Righe per pagina';
-$labels['signature'] = 'Firma';
-$labels['dstactive'] = 'Gestione ora legale / ora solare';
-$labels['htmleditor'] = 'Scrivi i messaggi in HTML';
-$labels['htmlsignature'] = 'Firma in HTML';
-$labels['previewpane'] = 'Mostra l\'anteprima';
-$labels['autosavedraft'] = 'Salva le bozze automaticamente';
-$labels['everynminutes'] = 'ogni $n minuti';
-$labels['never'] = 'mai';
-$labels['folder'] = 'Cartella';
-$labels['folders'] = 'Cartelle';
-$labels['foldername'] = 'Nome cartella';
-$labels['subscribed'] = 'Sottoscritta';
-$labels['messagecount'] = 'Messaggi';
-$labels['create'] = 'Crea';
-$labels['createfolder'] = 'Crea nuova cartella';
-$labels['rename'] = 'Rinomina';
-$labels['renamefolder'] = 'Rinomina cartella';
-$labels['deletefolder'] = 'Cancella cartella';
-$labels['managefolders'] = 'Gestione cartelle';
-$labels['sortby'] = 'Ordina per';
-$labels['sortasc'] = 'Ordinamento crescente';
-$labels['sortdesc'] = 'Ordinamento decrescente';
-
-?>
\ No newline at end of file
diff --git a/program/localization/it/messages.inc b/program/localization/it/messages.inc
deleted file mode 100644 (file)
index 6b8cd51..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/it/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
- |         Yusef Maali <contact@yusefmaali.net>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Impossibile accedere. Utente o password non corretti';
-$messages['cookiesdisabled'] = 'Il tuo browser non accetta i cookies';
-$messages['sessionerror'] = 'Sessione non valida o scaduta';
-$messages['imaperror'] = 'Impossibile connettersi al server IMAP';
-$messages['nomessagesfound'] = 'Nessun messaggio trovato in questa cartella';
-$messages['loggedout'] = 'Sessione chiusa correttamente. Arrivederci!';
-$messages['mailboxempty'] = 'Cartella vuota';
-$messages['loading'] = 'Caricamento...';
-$messages['loadingdata'] = 'Caricamento dati...';
-$messages['checkingmail'] = 'Controllo nuovi messaggi...';
-$messages['sendingmessage'] = 'Invio messaggio in corso...';
-$messages['messagesent'] = 'Messaggio inviato correttamente';
-$messages['savingmessage'] = 'Salvataggio messaggio...';
-$messages['messagesaved'] = 'Messaggio salvato nelle bozze';
-$messages['successfullysaved'] = 'Salvato correttamente';
-$messages['addedsuccessfully'] = 'Contatto aggiunto alla rubrica';
-$messages['contactexists'] = 'Esiste già un contatto con questo indirizzo e-mail';
-$messages['blockedimages'] = 'Per proteggere la tua privacy, le immagini remote di questo messaggio sono state bloccate.';
-$messages['encryptedmessage'] = 'Questo messaggio é cifrato e non può essere visualizzato';
-$messages['nocontactsfound'] = 'Nessun contatto trovato';
-$messages['contactnotfound'] = 'Il contatto richiesto non è stato trovato';
-$messages['sendingfailed'] = 'Impossibile inviare il messaggio';
-$messages['errorsaving'] = 'Impossibile salvare';
-$messages['errormoving'] = 'Impossibile spostare il messaggio';
-$messages['errordeleting'] = 'Impossibile cancellare il messaggio';
-$messages['deletecontactconfirm'] = 'Sei sicuro di voler cancellare i contatti selezionati?';
-$messages['deletemessagesconfirm'] = 'Sei sicuro di voler cancellare i messaggi selezionati?';
-$messages['deletefolderconfirm'] = 'Sei sicuro di voler cancellare la cartella selezionata?';
-$messages['purgefolderconfirm'] = 'Sei sicuro di voler cancellare tutti i messaggi in questa cartella?';
-$messages['formincomplete'] = 'Per favore, compila tutti i campi';
-$messages['noemailwarning'] = 'Per favore, immetti un indirizzo e-mail valido';
-$messages['nonamewarning'] = 'Per favore, immetti un nome';
-$messages['nopagesizewarning'] = 'Per favore, immetti il numero di righe per pagina';
-$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?';
-$messages['noldapserver'] = 'Per favore, scegli un server LDAP in cui ricercare';
-$messages['nocontactsreturned'] = 'Nessun contatto trovato';
-$messages['nosearchname'] = 'Per favore, immetti un nome o un indirizzo e-mail';
-$messages['searchsuccessful'] = '$nr messaggi trovati';
-$messages['searchnomatch'] = 'La ricerca non ha dato nessun risultato';
-$messages['searching'] = 'Ricerca...';
-$messages['checking'] = 'Controllo...';
-$messages['nospellerrors'] = 'Nessun errore ortografico trovato';
-$messages['folderdeleted'] = 'Cartella eliminata';
-$messages['deletedsuccessfully'] = 'Eliminato con successo';
-$messages['converting'] = 'Rimozione della formattazione dal messaggio...';
-$messages['messageopenerror'] = 'Impossibile caricare il messaggio dal server';
-$messages['fileuploaderror'] = 'Errore durante il caricamento del file';
-$messages['filesizeerror'] = 'Il file da caricare supera il limite massimo di $size';
-$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...';
-$messages['receiptsent'] = 'Ricevuta di ritorno inviata con successo';
-$messages['errorsendingreceipt'] = 'Impossibile spedire la ricevuta di ritorno';
-$messages['nodeletelastidentity'] = 'Impossibile eliminare l\'unica identità disponibile';
-$messages['addsubfolderhint'] = 'La cartella verrà creata come sotto cartella della cartella corrente';
-
-?>
\ No newline at end of file
diff --git a/program/localization/it_IT/labels.inc b/program/localization/it_IT/labels.inc
new file mode 100644 (file)
index 0000000..1e29225
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/it/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
+ |         Yusef Maali <contact@yusefmaali.net>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Benvenuto in $product';
+$labels['username'] = 'Utente';
+$labels['password'] = 'Password';
+$labels['server'] = 'Server';
+$labels['login'] = 'Entra';
+$labels['logout'] = 'Esci';
+$labels['mail'] = 'E-Mail';
+$labels['settings'] = 'Impostazioni';
+$labels['addressbook'] = 'Rubrica';
+$labels['inbox'] = 'Posta in arrivo';
+$labels['drafts'] = 'Bozze';
+$labels['sent'] = 'Inviata';
+$labels['trash'] = 'Cestino';
+$labels['junk'] = 'Spam';
+$labels['subject'] = 'Oggetto';
+$labels['from'] = 'Mittente';
+$labels['to'] = 'Destinatario';
+$labels['cc'] = 'Cc';
+$labels['bcc'] = 'Ccn';
+$labels['replyto'] = 'Rispondi a';
+$labels['date'] = 'Data';
+$labels['size'] = 'Dimensione';
+$labels['priority'] = 'Priorità';
+$labels['organization'] = 'Società';
+$labels['reply-to'] = 'Rispondi a';
+$labels['mailboxlist'] = 'Cartelle';
+$labels['messagesfromto'] = 'Messaggi da $from a $to di $count';
+$labels['messagenrof'] = 'Messaggio $nr di $count';
+$labels['moveto'] = 'sposta...';
+$labels['download'] = 'download';
+$labels['filename'] = 'Nome file';
+$labels['filesize'] = 'Dimensione file';
+$labels['preferhtml'] = 'Mostra HTML';
+$labels['htmlmessage'] = 'Messaggio HTML';
+$labels['prettydate'] = 'Date più leggibili';
+$labels['addtoaddressbook'] = 'Aggiungi alla rubrica';
+$labels['sun'] = 'Dom';
+$labels['mon'] = 'Lun';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mer';
+$labels['thu'] = 'Gio';
+$labels['fri'] = 'Ven';
+$labels['sat'] = 'Sab';
+$labels['sunday'] = 'Domenica';
+$labels['monday'] = 'Lunedì';
+$labels['tuesday'] = 'Martedì';
+$labels['wednesday'] = 'Mercoledì';
+$labels['thursday'] = 'Giovedì';
+$labels['friday'] = 'Venerdì';
+$labels['saturday'] = 'Sabato';
+$labels['today'] = 'Oggi';
+$labels['checkmail'] = 'Controlla nuovi messaggi';
+$labels['writenewmessage'] = 'Scrivi un nuovo messaggio';
+$labels['replytomessage'] = 'Rispondi al messaggio';
+$labels['replytoallmessage'] = 'Rispondi a tutti';
+$labels['forwardmessage'] = 'Inoltra il messaggio';
+$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';
+$labels['firstmessage'] = 'Visualizza il primo messaggio';
+$labels['firstmessages'] = 'Visualizza il primo set di messaggi';
+$labels['nextmessage'] = 'Visualizza il messaggio successivo';
+$labels['nextmessages'] = 'Visualizza messaggi successivi';
+$labels['lastmessage'] = 'Visualizza l\'ultimo messaggio';
+$labels['lastmessages'] = 'Visualizza l\'ultimo set di messaggi';
+$labels['backtolist'] = 'Torna alla lista messaggi';
+$labels['viewsource'] = 'Visualizza sorgente messaggio';
+$labels['markmessages'] = 'Marca i messaggi';
+$labels['markread'] = 'Letti';
+$labels['markunread'] = 'Non letti';
+$labels['select'] = 'Seleziona';
+$labels['all'] = 'Tutti';
+$labels['none'] = 'Nessuno';
+$labels['unread'] = 'Non letti';
+$labels['compact'] = 'Compatta';
+$labels['empty'] = 'Svuota';
+$labels['purge'] = 'Pulisci';
+$labels['quota'] = 'Spazio utilizzato';
+$labels['unknown'] = 'sconosciuto';
+$labels['unlimited'] = 'illimitato';
+$labels['quicksearch'] = 'Ricerca veloce';
+$labels['resetsearch'] = 'Annulla ricerca';
+$labels['compose'] = 'Scrivi un messaggio';
+$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';
+$labels['returnreceipt'] = 'Ricevuta di ritorno';
+$labels['checkspelling'] = 'Controlla ortografia';
+$labels['resumeediting'] = 'Torna al messaggio';
+$labels['revertto'] = 'Ripristina';
+$labels['attachments'] = 'Allegati';
+$labels['upload'] = 'Aggiungi';
+$labels['close'] = 'Chiudi';
+$labels['low'] = 'Bassa';
+$labels['lowest'] = 'Molto bassa';
+$labels['normal'] = 'Normale';
+$labels['high'] = 'Alta';
+$labels['highest'] = 'Molto alta';
+$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['mdnrequest'] = 'Il mittente richiede di ricevere una notifica dell\'avvenuta lettura del messaggio. Si desidera inviare tale notifica?';
+$labels['receiptread'] = 'Ricevuta di ritorno (letto)';
+$labels['yourmessage'] = 'Questa è la ricevuta di ritorno del mesaggio inviato';
+$labels['receiptnote'] = 'Nota: questa Ricevuta di ritorno attesta solamente che il messaggio è stato visualizzato nel computer del destinatario. Non c\'è pertanto alcuna garanzia che il destinatario abbia letto o compreso il suo contenuto.';
+$labels['name'] = 'Nome visualizzato';
+$labels['firstname'] = 'Nome';
+$labels['surname'] = 'Cognome';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Aggiungi contatto alla rubrica';
+$labels['editcontact'] = 'Modifica contatto';
+$labels['edit'] = 'Modifica';
+$labels['cancel'] = 'Annulla';
+$labels['save'] = 'Salva';
+$labels['delete'] = 'Elimina';
+$labels['newcontact'] = 'Crea un nuovo contatto';
+$labels['deletecontact'] = 'Elimina i contatti selezionati';
+$labels['composeto'] = 'Invia email a';
+$labels['contactsfromto'] = 'Contatti da $from a $to di $count';
+$labels['print'] = 'Stampa';
+$labels['export'] = 'Esporta';
+$labels['previouspage'] = 'Pagina precedente';
+$labels['firstpage'] = 'Prima pagina';
+$labels['nextpage'] = 'Pagina successiva';
+$labels['lastpage'] = 'Ultima pagina';
+$labels['groups'] = 'Gruppi';
+$labels['personaladrbook'] = 'Rubrica Personale';
+$labels['settingsfor'] = 'Impostazioni per ';
+$labels['preferences'] = 'Preferenze';
+$labels['userpreferences'] = 'Preferenze utente';
+$labels['editpreferences'] = 'Modifica le preferenze per l\'utente';
+$labels['identities'] = 'Identità';
+$labels['manageidentities'] = 'Gestisci le identità per questo account';
+$labels['newidentity'] = 'Nuova identità';
+$labels['newitem'] = 'Nuovo elemento';
+$labels['edititem'] = 'Modifica elemento';
+$labels['setdefault'] = 'Imposta predefinita';
+$labels['language'] = 'Lingua';
+$labels['timezone'] = 'Fuso orario';
+$labels['pagesize'] = 'Righe per pagina';
+$labels['signature'] = 'Firma';
+$labels['dstactive'] = 'Gestione ora legale / ora solare';
+$labels['htmleditor'] = 'Scrivi i messaggi in HTML';
+$labels['htmlsignature'] = 'Firma in HTML';
+$labels['previewpane'] = 'Mostra l\'anteprima';
+$labels['autosavedraft'] = 'Salva le bozze automaticamente';
+$labels['everynminutes'] = 'ogni $n minuti';
+$labels['never'] = 'mai';
+$labels['folder'] = 'Cartella';
+$labels['folders'] = 'Cartelle';
+$labels['foldername'] = 'Nome cartella';
+$labels['subscribed'] = 'Sottoscritta';
+$labels['messagecount'] = 'Messaggi';
+$labels['create'] = 'Crea';
+$labels['createfolder'] = 'Crea nuova cartella';
+$labels['rename'] = 'Rinomina';
+$labels['renamefolder'] = 'Rinomina cartella';
+$labels['deletefolder'] = 'Cancella cartella';
+$labels['managefolders'] = 'Gestione cartelle';
+$labels['sortby'] = 'Ordina per';
+$labels['sortasc'] = 'Ordinamento crescente';
+$labels['sortdesc'] = 'Ordinamento decrescente';
+
+?>
\ No newline at end of file
diff --git a/program/localization/it_IT/messages.inc b/program/localization/it_IT/messages.inc
new file mode 100644 (file)
index 0000000..6b8cd51
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/it/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
+ |         Yusef Maali <contact@yusefmaali.net>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Impossibile accedere. Utente o password non corretti';
+$messages['cookiesdisabled'] = 'Il tuo browser non accetta i cookies';
+$messages['sessionerror'] = 'Sessione non valida o scaduta';
+$messages['imaperror'] = 'Impossibile connettersi al server IMAP';
+$messages['nomessagesfound'] = 'Nessun messaggio trovato in questa cartella';
+$messages['loggedout'] = 'Sessione chiusa correttamente. Arrivederci!';
+$messages['mailboxempty'] = 'Cartella vuota';
+$messages['loading'] = 'Caricamento...';
+$messages['loadingdata'] = 'Caricamento dati...';
+$messages['checkingmail'] = 'Controllo nuovi messaggi...';
+$messages['sendingmessage'] = 'Invio messaggio in corso...';
+$messages['messagesent'] = 'Messaggio inviato correttamente';
+$messages['savingmessage'] = 'Salvataggio messaggio...';
+$messages['messagesaved'] = 'Messaggio salvato nelle bozze';
+$messages['successfullysaved'] = 'Salvato correttamente';
+$messages['addedsuccessfully'] = 'Contatto aggiunto alla rubrica';
+$messages['contactexists'] = 'Esiste già un contatto con questo indirizzo e-mail';
+$messages['blockedimages'] = 'Per proteggere la tua privacy, le immagini remote di questo messaggio sono state bloccate.';
+$messages['encryptedmessage'] = 'Questo messaggio é cifrato e non può essere visualizzato';
+$messages['nocontactsfound'] = 'Nessun contatto trovato';
+$messages['contactnotfound'] = 'Il contatto richiesto non è stato trovato';
+$messages['sendingfailed'] = 'Impossibile inviare il messaggio';
+$messages['errorsaving'] = 'Impossibile salvare';
+$messages['errormoving'] = 'Impossibile spostare il messaggio';
+$messages['errordeleting'] = 'Impossibile cancellare il messaggio';
+$messages['deletecontactconfirm'] = 'Sei sicuro di voler cancellare i contatti selezionati?';
+$messages['deletemessagesconfirm'] = 'Sei sicuro di voler cancellare i messaggi selezionati?';
+$messages['deletefolderconfirm'] = 'Sei sicuro di voler cancellare la cartella selezionata?';
+$messages['purgefolderconfirm'] = 'Sei sicuro di voler cancellare tutti i messaggi in questa cartella?';
+$messages['formincomplete'] = 'Per favore, compila tutti i campi';
+$messages['noemailwarning'] = 'Per favore, immetti un indirizzo e-mail valido';
+$messages['nonamewarning'] = 'Per favore, immetti un nome';
+$messages['nopagesizewarning'] = 'Per favore, immetti il numero di righe per pagina';
+$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?';
+$messages['noldapserver'] = 'Per favore, scegli un server LDAP in cui ricercare';
+$messages['nocontactsreturned'] = 'Nessun contatto trovato';
+$messages['nosearchname'] = 'Per favore, immetti un nome o un indirizzo e-mail';
+$messages['searchsuccessful'] = '$nr messaggi trovati';
+$messages['searchnomatch'] = 'La ricerca non ha dato nessun risultato';
+$messages['searching'] = 'Ricerca...';
+$messages['checking'] = 'Controllo...';
+$messages['nospellerrors'] = 'Nessun errore ortografico trovato';
+$messages['folderdeleted'] = 'Cartella eliminata';
+$messages['deletedsuccessfully'] = 'Eliminato con successo';
+$messages['converting'] = 'Rimozione della formattazione dal messaggio...';
+$messages['messageopenerror'] = 'Impossibile caricare il messaggio dal server';
+$messages['fileuploaderror'] = 'Errore durante il caricamento del file';
+$messages['filesizeerror'] = 'Il file da caricare supera il limite massimo di $size';
+$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...';
+$messages['receiptsent'] = 'Ricevuta di ritorno inviata con successo';
+$messages['errorsendingreceipt'] = 'Impossibile spedire la ricevuta di ritorno';
+$messages['nodeletelastidentity'] = 'Impossibile eliminare l\'unica identità disponibile';
+$messages['addsubfolderhint'] = 'La cartella verrà creata come sotto cartella della cartella corrente';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ja/labels.inc b/program/localization/ja/labels.inc
deleted file mode 100644 (file)
index 142c97f..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ja/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tadashi Jokagi <elf2000@users.sourceforge.net>                |
- |         Takashi Takamatsu <taka717@gmail.com>                         |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1154 2008-02-28 20:05:47Z 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'] = '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['movemessagetotrash'] = 'ごみ箱に移動';
-$labels['printmessage'] = '印刷';
-$labels['previousmessage'] = '前のメッセージへ';
-$labels['previousmessages'] = '前の一覧へ';
-$labels['firstmessage'] = '最初のメッセージへ';
-$labels['firstmessages'] = '最初の一覧へ';
-$labels['nextmessage'] = '次のメッセージへ';
-$labels['nextmessages'] = '次の一覧へ';
-$labels['lastmessage'] = '最後のメッセージへ';
-$labels['lastmessages'] = '最後の一覧へ';
-$labels['backtolist'] = '一覧に戻る';
-$labels['viewsource'] = 'ソースの表示';
-$labels['markmessages'] = 'マークを付ける';
-$labels['markread'] = '既読にする';
-$labels['markunread'] = '未読にする';
-$labels['select'] = '選択';
-$labels['all'] = 'すべて';
-$labels['none'] = 'なし';
-$labels['unread'] = '未読';
-$labels['compact'] = 'コンパクト';
-$labels['empty'] = '空';
-$labels['purge'] = '破棄';
-$labels['quota'] = 'ディスク使用量';
-$labels['unknown'] = '不明';
-$labels['unlimited'] = '無制限';
-$labels['quicksearch'] = 'Quick search';
-$labels['resetsearch'] = 'Reset search';
-$labels['compose'] = 'メッセージの作成';
-$labels['savemessage'] = '草稿に保存';
-$labels['sendmessage'] = '今すぐ送信';
-$labels['addattachment'] = 'ファイルの添付';
-$labels['charset'] = '文字エンコード';
-$labels['editortype'] = 'エディターの種類';
-$labels['returnreceipt'] = '開封確認';
-$labels['checkspelling'] = 'スペルチェック';
-$labels['resumeediting'] = '編集の中断';
-$labels['revertto'] = '元に戻す';
-$labels['attachments'] = '添付ファイル';
-$labels['upload'] = 'アップロード';
-$labels['close'] = '閉じる';
-$labels['low'] = '低い';
-$labels['lowest'] = '最低';
-$labels['normal'] = '通常';
-$labels['high'] = '高い';
-$labels['highest'] = '最高';
-$labels['nosubject'] = '(件名なし)';
-$labels['showimages'] = '画像の表示';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'テキスト';
-$labels['addcc'] = 'Cc 追加';
-$labels['addbcc'] = 'Bcc 追加';
-$labels['addreplyto'] = 'Reply-To 追加';
-$labels['mdnrequest'] = 'メッセージの送信者は開封確認の送付を求めています。開封確認のメッセージを送付しますか?';
-$labels['receiptread'] = '開封確認 (表示済)';
-$labels['yourmessage'] = 'これはあなたが送信したメッセージに対する開封確認です。';
-$labels['receiptnote'] = '注意: この開封確認はメッセージが受信者に表示されたことの通知です。受信者がメッセージを読んだこと、内容を理解したことを保証するものではありません。';
-$labels['name'] = '表示名';
-$labels['firstname'] = '名前';
-$labels['surname'] = '名字';
-$labels['email'] = 'メールアドレス';
-$labels['addcontact'] = '連絡先の新規追加';
-$labels['editcontact'] = '連絡先の編集';
-$labels['edit'] = '編集';
-$labels['cancel'] = 'キャンセル';
-$labels['save'] = '保存';
-$labels['delete'] = '削除';
-$labels['newcontact'] = '連絡先の新規作成';
-$labels['deletecontact'] = '連絡先の削除';
-$labels['composeto'] = 'この連絡先へメールを送信';
-$labels['contactsfromto'] = '連絡先: $from ~ $to (全: $count 件)';
-$labels['print'] = '印刷';
-$labels['export'] = 'エクスポート';
-$labels['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['messagecount'] = 'メッセージ';
-$labels['create'] = '作成';
-$labels['createfolder'] = 'フォルダの新規作成';
-$labels['rename'] = '名前の変更';
-$labels['renamefolder'] = 'フォルダ名の変更';
-$labels['deletefolder'] = 'フォルダの削除';
-$labels['managefolders'] = 'フォルダの管理';
-$labels['sortby'] = '整列の基準にする';
-$labels['sortasc'] = '昇順で整列';
-$labels['sortdesc'] = '降順で整列';
-
-?>
diff --git a/program/localization/ja/messages.inc b/program/localization/ja/messages.inc
deleted file mode 100644 (file)
index 46ea7fe..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ja/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tadashi Jokagi <elf2000@users.sourceforge.net>                |
- |         Takashi Takamatsu <taka717@gmail.com>                         |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1154 2008-02-28 20:05:47Z thomasb $
-
-*/
-
-$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'] = 'このメールアドレスは既にアドレス帳に存在します。';
-$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'] = '受信者を最低 1 人は入力して下さい。';
-$messages['nosubjectwarning'] = '件名が空です。今すぐ入力しますか?';
-$messages['nobodywarning'] = '本文が無いメールを送信しますか?';
-$messages['notsentwarning'] = 'メールは送信されませんでした。破棄しますか?';
-$messages['noldapserver'] = '検索する LDAP サーバーを選択して下さい。';
-$messages['nocontactsreturned'] = '連絡先が見つかりません。';
-$messages['nosearchname'] = '連絡先の名前かメールアドレスを入力して下さい。';
-$messages['searchsuccessful'] = ' $nr 件のメールが見つかりました。';
-$messages['searchnomatch'] = '一致するメールはありません。';
-$messages['searching'] = '検索中です...';
-$messages['checking'] = '確認中です...';
-$messages['nospellerrors'] = 'スペルミスは見つかりませんでした。';
-$messages['folderdeleted'] = 'フォルダを削除しました。';
-$messages['deletedsuccessfully'] = '削除しました。';
-$messages['converting'] = 'メールから書式を削除中です...';
-$messages['messageopenerror'] = 'サーバからメールを取得できません。';
-$messages['fileuploaderror'] = 'ファイルのアップロードに失敗しました。';
-$messages['filesizeerror'] = 'アップロードしたファイルのサイズが上限 $size を超えました。';
-$messages['copysuccess'] = 'アドレス $nr 個のコピーに成功しました。';
-$messages['copyerror'] = 'アドレスをコピーできません。';
-$messages['sourceisreadonly'] = 'このアドレス情報は読み取り専用です。';
-$messages['errorsavingcontact'] = '連絡先のアドレスを保存できません。';
-$messages['movingmessage'] = '移動中です...';
-$messages['receiptsent'] = '開封確認を送信しました。';
-$messages['errorsendingreceipt'] = '開封確認を送信できません。';
-$messages['nodeletelastidentity'] = '削除できません。少なくとも1つの個人情報が必要です。';
-$messages['addsubfolderhint'] = '現在選択しているフォルダのサブフォルダとして作成されます。';
-
-?>
diff --git a/program/localization/ja_JP/labels.inc b/program/localization/ja_JP/labels.inc
new file mode 100644 (file)
index 0000000..4997e8d
--- /dev/null
@@ -0,0 +1,221 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ja/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Tadashi Jokagi <elf2000@users.sourceforge.net>                |
+ |         Takashi Takamatsu <taka717@gmail.com>                         |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1335 2008-04-27 15:18:13Z alec $
+
+*/
+
+$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'] = '表示中のメッセージ: $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['jan'] = '1月';
+$labels['feb'] = '2月';
+$labels['mar'] = '3月';
+$labels['apr'] = '4月';
+$labels['may'] = '5月';
+$labels['jun'] = '6月';
+$labels['jul'] = '7月';
+$labels['aug'] = '8月';
+$labels['sep'] = '9月';
+$labels['oct'] = '10月';
+$labels['nov'] = '11月';
+$labels['dec'] = '12月';
+$labels['longjan'] = '1月';
+$labels['longfeb'] = '2月';
+$labels['longmar'] = '3月';
+$labels['longapr'] = '4月';
+$labels['longmay'] = '5月';
+$labels['longjun'] = '6月';
+$labels['longjul'] = '7月';
+$labels['longaug'] = '8月';
+$labels['longsep'] = '9月';
+$labels['longoct'] = '10月';
+$labels['longnov'] = '11月';
+$labels['longdec'] = '12月';
+$labels['today'] = '今日';
+$labels['checkmail'] = '新着の確認';
+$labels['writenewmessage'] = '新規メールの作成';
+$labels['replytomessage'] = '返信';
+$labels['replytoallmessage'] = '送信者とすべての受信者に返信';
+$labels['forwardmessage'] = '転送';
+$labels['deletemessage'] = '削除';
+$labels['movemessagetotrash'] = 'ごみ箱に移動';
+$labels['printmessage'] = '印刷';
+$labels['previousmessage'] = '前のメッセージへ';
+$labels['previousmessages'] = '前の一覧へ';
+$labels['firstmessage'] = '最初のメッセージへ';
+$labels['firstmessages'] = '最初の一覧へ';
+$labels['nextmessage'] = '次のメッセージへ';
+$labels['nextmessages'] = '次の一覧へ';
+$labels['lastmessage'] = '最後のメッセージへ';
+$labels['lastmessages'] = '最後の一覧へ';
+$labels['backtolist'] = '一覧に戻る';
+$labels['viewsource'] = 'ソースの表示';
+$labels['markmessages'] = 'マークを付ける';
+$labels['markread'] = '既読にする';
+$labels['markunread'] = '未読にする';
+$labels['select'] = '選択';
+$labels['all'] = 'すべて';
+$labels['none'] = 'なし';
+$labels['unread'] = '未読';
+$labels['compact'] = 'コンパクト';
+$labels['empty'] = '空';
+$labels['purge'] = '破棄';
+$labels['quota'] = 'ディスク使用量';
+$labels['unknown'] = '不明';
+$labels['unlimited'] = '無制限';
+$labels['quicksearch'] = 'Quick search';
+$labels['resetsearch'] = 'Reset search';
+$labels['compose'] = 'メッセージの作成';
+$labels['savemessage'] = '草稿に保存';
+$labels['sendmessage'] = '今すぐ送信';
+$labels['addattachment'] = 'ファイルの添付';
+$labels['charset'] = '文字エンコード';
+$labels['editortype'] = 'エディターの種類';
+$labels['returnreceipt'] = '開封確認';
+$labels['checkspelling'] = 'スペルチェック';
+$labels['resumeediting'] = '編集の中断';
+$labels['revertto'] = '元に戻す';
+$labels['attachments'] = '添付ファイル';
+$labels['upload'] = 'アップロード';
+$labels['close'] = '閉じる';
+$labels['low'] = '低い';
+$labels['lowest'] = '最低';
+$labels['normal'] = '通常';
+$labels['high'] = '高い';
+$labels['highest'] = '最高';
+$labels['nosubject'] = '(件名なし)';
+$labels['showimages'] = '画像の表示';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'テキスト';
+$labels['addcc'] = 'Cc 追加';
+$labels['addbcc'] = 'Bcc 追加';
+$labels['addreplyto'] = 'Reply-To 追加';
+$labels['mdnrequest'] = 'メッセージの送信者は開封確認の送付を求めています。開封確認のメッセージを送付しますか?';
+$labels['receiptread'] = '開封確認 (表示済)';
+$labels['yourmessage'] = 'これはあなたが送信したメッセージに対する開封確認です。';
+$labels['receiptnote'] = '注意: この開封確認はメッセージが受信者に表示されたことの通知です。受信者がメッセージを読んだこと、内容を理解したことを保証するものではありません。';
+$labels['name'] = '表示名';
+$labels['firstname'] = '名前';
+$labels['surname'] = '名字';
+$labels['email'] = 'メールアドレス';
+$labels['addcontact'] = '連絡先の新規追加';
+$labels['editcontact'] = '連絡先の編集';
+$labels['edit'] = '編集';
+$labels['cancel'] = 'キャンセル';
+$labels['save'] = '保存';
+$labels['delete'] = '削除';
+$labels['newcontact'] = '連絡先の新規作成';
+$labels['deletecontact'] = '連絡先の削除';
+$labels['composeto'] = 'この連絡先へメールを送信';
+$labels['contactsfromto'] = '連絡先: $from ~ $to (全: $count 件)';
+$labels['print'] = '印刷';
+$labels['export'] = 'エクスポート';
+$labels['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['logoutclear'] = 'ログアウト時にごみ箱を空にする';
+$labels['logoutcompact'] = 'ログアウト時にフォルダのコンパクト化を実行';
+$labels['uisettings'] = 'ユーザーインターフェース';
+$labels['serversettings'] = 'サーバの設定';
+$labels['autosavedraft'] = '自動的に草稿を保存';
+$labels['everynminutes'] = ' $n 分毎';
+$labels['never'] = 'しない';
+$labels['folder'] = 'フォルダ';
+$labels['folders'] = 'フォルダ一覧';
+$labels['foldername'] = 'フォルダ名';
+$labels['subscribed'] = '購読済';
+$labels['messagecount'] = 'メッセージ';
+$labels['create'] = '作成';
+$labels['createfolder'] = 'フォルダの新規作成';
+$labels['rename'] = '名前の変更';
+$labels['renamefolder'] = 'フォルダ名の変更';
+$labels['deletefolder'] = 'フォルダの削除';
+$labels['managefolders'] = 'フォルダの管理';
+$labels['sortby'] = '整列の基準にする';
+$labels['sortasc'] = '昇順で整列';
+$labels['sortdesc'] = '降順で整列';
+
+?>
diff --git a/program/localization/ja_JP/messages.inc b/program/localization/ja_JP/messages.inc
new file mode 100644 (file)
index 0000000..2deba4a
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ja/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Tadashi Jokagi <elf2000@users.sourceforge.net>                |
+ |         Takashi Takamatsu <taka717@gmail.com>                         |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1335 2008-04-27 15:18:13Z alec $
+
+*/
+
+$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'] = 'このメールアドレスは既にアドレス帳に存在します。';
+$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'] = '受信者を最低 1 人は入力して下さい。';
+$messages['nosubjectwarning'] = '件名が空です。今すぐ入力しますか?';
+$messages['nobodywarning'] = '本文が無いメールを送信しますか?';
+$messages['notsentwarning'] = 'メールは送信されませんでした。破棄しますか?';
+$messages['noldapserver'] = '検索する LDAP サーバーを選択して下さい。';
+$messages['nocontactsreturned'] = '連絡先がありません。';
+$messages['nosearchname'] = '連絡先の名前かメールアドレスを入力して下さい。';
+$messages['searchsuccessful'] = ' $nr 件のメールが見つかりました。';
+$messages['searchnomatch'] = '一致するメールはありません。';
+$messages['searching'] = '検索中です...';
+$messages['checking'] = '確認中です...';
+$messages['nospellerrors'] = 'スペルミスは見つかりませんでした。';
+$messages['folderdeleted'] = 'フォルダを削除しました。';
+$messages['deletedsuccessfully'] = '削除しました。';
+$messages['converting'] = 'メールから書式を削除中です...';
+$messages['messageopenerror'] = 'サーバからメールを取得できません。';
+$messages['fileuploaderror'] = 'ファイルのアップロードに失敗しました。';
+$messages['filesizeerror'] = 'アップロードしたファイルのサイズが上限 $size を超えました。';
+$messages['copysuccess'] = 'アドレス $nr 個のコピーに成功しました。';
+$messages['copyerror'] = 'アドレスをコピーできません。';
+$messages['sourceisreadonly'] = 'このアドレス情報は読み取り専用です。';
+$messages['errorsavingcontact'] = '連絡先のアドレスを保存できません。';
+$messages['movingmessage'] = '移動中です...';
+$messages['receiptsent'] = '開封確認を送信しました。';
+$messages['errorsendingreceipt'] = '開封確認を送信できません。';
+$messages['nodeletelastidentity'] = '削除できません。少なくとも1つの個人情報が必要です。';
+$messages['addsubfolderhint'] = '現在選択しているフォルダのサブフォルダとして作成されます。';
+
+?>
diff --git a/program/localization/ka_GE/labels.inc b/program/localization/ka_GE/labels.inc
new file mode 100755 (executable)
index 0000000..6d37223
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ge/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Zaza Zviadadze <zviadadze@gmail.com>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 842 2007-10-20 13:55:02Z  zaza$
+
+*/
+
+$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['movemessagetotrash'] = 'შეტყობინების წაშლილებში გადატანა';
+$labels['printmessage'] = 'შეტყობინების ამობეჭვდა';
+$labels['previousmessage'] = 'წინა შეტყობინების ნახვა';
+$labels['previousmessages'] = 'წინა შეტყობინებების ნახვა';
+$labels['firstmessage'] = 'პირველი შეტყობინების ნახვა';
+$labels['firstmessages'] = 'პრველი შეტყობინებები';
+$labels['nextmessage'] = 'შემდეგი შეტყობინების ნახვა';
+$labels['nextmessages'] = 'შემდეგი შეტყობინებების ნახვა';
+$labels['lastmessage'] = 'ბოლო შეტყობინების ნახვა';
+$labels['lastmessages'] = 'ბოლო შეტყობინებების ნახვა';
+$labels['backtolist'] = 'უკან ჩამონათვალში';
+$labels['viewsource'] = 'შიგთავსი';
+$labels['markmessages'] = 'მონიშნეთ შეტყობინებები';
+$labels['markread'] = 'როგორც წაკითხული';
+$labels['markunread'] = 'როგორც წაუკითხავი';
+$labels['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['savemessage'] = 'დროებით შენახვა';
+$labels['sendmessage'] = 'შეტყობინების გაგზავნა';
+$labels['addattachment'] = 'ფაილის ატვირთვა';
+$labels['charset'] = 'კოდირება';
+$labels['editortype'] = 'რედაქტორი';
+$labels['returnreceipt'] = 'პასუხის მოთხოვნა';
+$labels['checkspelling'] = 'ორთოგრაფიული შემოწმება';
+$labels['resumeediting'] = 'რედაქტირების გაგრძელება';
+$labels['revertto'] = 'გაუქმება';
+$labels['attachments'] = 'გზავნილები';
+$labels['upload'] = 'ატვირთვა';
+$labels['close'] = 'დახურვა';
+$labels['low'] = 'დაბალი';
+$labels['lowest'] = 'უდაბლესი';
+$labels['normal'] = 'საშუალო';
+$labels['high'] = 'მაღალი';
+$labels['highest'] = 'უმაღლესი';
+$labels['nosubject'] = '(უსათაურო)';
+$labels['showimages'] = 'გამოსახულების ჩვენება';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'ტექსტური';
+$labels['addcc'] = 'დაამატე კოპიო';
+$labels['addbcc'] = 'დაამატე ფარული კოპიო';
+$labels['addreplyto'] = 'დაამატე გამომგზავნი';
+$labels['mdnrequest'] = 'გამომგზავნს სურს შეიტყოს წერილის მიღება. გსურთ შეატყობინოთ გამომგზავნს?';
+$labels['receiptread'] = 'გზავნილის დაბრუნება';
+$labels['yourmessage'] = 'ეს არის მიღების დასტური თქვენს შეტყობინებაზე';
+$labels['receiptnote'] = 'განმარტება: ეს ნიშნავს რომ ადრესატმა მიიღო შეტყობინება. მაგრამ, არ ნიშნავს რომ წაიკითხა ან გაიგო ტექსტი';
+$labels['name'] = 'სრული სახელი';
+$labels['firstname'] = 'სახელი';
+$labels['surname'] = 'გვარი';
+$labels['email'] = 'ელ–ფოსტა';
+$labels['addcontact'] = 'კონტაქტებში დამატება';
+$labels['editcontact'] = 'კონტაქტის რედაქტირება';
+$labels['edit'] = 'რედაქტირება';
+$labels['cancel'] = 'გაუქმება';
+$labels['save'] = 'შენახვა';
+$labels['delete'] = 'წაშლა';
+$labels['newcontact'] = 'კონტაქტის შექმნა';
+$labels['deletecontact'] = 'მონიშნელი კონტაქტის წაშლა';
+$labels['composeto'] = 'ფოსტის გაგზავნა შერჩეულ ადრესატებთან';
+$labels['contactsfromto'] = 'კონტაქტები $from დან $to ში $count';
+$labels['print'] = 'დაბეჭვდა';
+$labels['export'] = 'ექსპორტი';
+$labels['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['messagecount'] = 'შეტყობინებები';
+$labels['create'] = 'შექმნა';
+$labels['createfolder'] = 'საქაღალდის შექმნა';
+$labels['rename'] = 'სახელის გადარქმევა';
+$labels['renamefolder'] = 'სახელის გადარქმევა საქაღალდისთვის';
+$labels['deletefolder'] = 'საქაღალდის წაშლა';
+$labels['managefolders'] = 'საქაღალდეების მართვა';
+$labels['sortby'] = 'დალაგება';
+$labels['sortasc'] = 'დალაგება ზრდადობით';
+$labels['sortdesc'] = 'დალაგება კლებადობით';
+
+?>
diff --git a/program/localization/ka_GE/messages.inc b/program/localization/ka_GE/messages.inc
new file mode 100755 (executable)
index 0000000..d2c29ca
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ge/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Zaza Zviadadze <zviadadze@gmail.com>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 842 2007-10-20 13:55:02Z  zaza $
+
+*/
+
+$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'] = 'შეტყობინების გადატანა...';
+$messages['receiptsent'] = 'წარმატებით გაიგზავნა';
+$messages['errorsendingreceipt'] = 'არ გაიგზავნა';
+$messages['nodeletelastidentity'] = 'წაშლა შეუძლებელია, ის თქვენთვის ერთადერთია';
+$messages['addsubfolderhint'] = 'საქაღალდე შეიქმნება როგორც ქვესაქაღალდე მონიშნულ საქაღალდეში';
+
+?>
diff --git a/program/localization/ko_KR/labels.inc b/program/localization/ko_KR/labels.inc
new file mode 100644 (file)
index 0000000..4df78c6
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | localization/kr/labels.inc                                            |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: lordmiss <lordmiss@lordmiss.com>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+
+*/
+
+$labels['welcome'] = '$product에 오신 것을 환영합니다';
+$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'] = '메시지 $count 개 중 $nr 개';
+$labels['moveto'] = '이동...';
+$labels['download'] = '다운로드';
+$labels['filename'] = '파일 이름';
+$labels['filesize'] = '파일 크기';
+$labels['preferhtml'] = 'HTML 보이기';
+$labels['htmlmessage'] = 'HTML 메시지';
+$labels['prettydate'] = '날짜 형식';
+$labels['addtoaddressbook'] = '주소록에 추가';
+$labels['sun'] = '일';
+$labels['mon'] = '월';
+$labels['tue'] = '화';
+$labels['wed'] = '수';
+$labels['thu'] = '목';
+$labels['fri'] = '금';
+$labels['sat'] = '토';
+$labels['sunday'] = '일요일';
+$labels['monday'] = '월요일';
+$labels['tuesday'] = '화요일';
+$labels['wednesday'] = '수요일';
+$labels['thursday'] = '목요일';
+$labels['friday'] = '금요일';
+$labels['saturday'] = '토요일';
+$labels['today'] = '오늘';
+$labels['checkmail'] = '새 메일 확인';
+$labels['writenewmessage'] = '새 메일 작성';
+$labels['replytomessage'] = '회신 작성';
+$labels['replytoallmessage'] = '보낸이와 모든 수신자에게 회신';
+$labels['forwardmessage'] = '메일 전달';
+$labels['deletemessage'] = '메일 삭제';
+$labels['movemessagetotrash'] = '메일 휴지통으로 이동';
+$labels['printmessage'] = '메일 인쇄';
+$labels['previousmessage'] = '이전 메일 보기';
+$labels['previousmessages'] = '이전 메일 세트 보기';
+$labels['firstmessage'] = '처음 메일 보기';
+$labels['firstmessages'] = '처음 메일 세트 보기';
+$labels['nextmessage'] = '다음 메일 보기';
+$labels['nextmessages'] = '다음 메일 세트 보기';
+$labels['lastmessage'] = '마지막 메일 보기';
+$labels['lastmessages'] = '마지막 메일 세트 보기';
+$labels['backtolist'] = '메일 목록으로';
+$labels['viewsource'] = '소스 보기';
+$labels['markmessages'] = '메시지 표시';
+$labels['markread'] = '읽은 것으로';
+$labels['markunread'] = '읽지 않은 것으로';
+$labels['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['savemessage'] = '드래프트 저장';
+$labels['sendmessage'] = '메일 지금 보냄';
+$labels['addattachment'] = '파일 첨부';
+$labels['charset'] = '문자셋';
+$labels['editortype'] = '편집기 형태';
+$labels['returnreceipt'] = '수신 확인';
+$labels['checkspelling'] = '스펠링 체크';
+$labels['resumeediting'] = '편집 계속';
+$labels['revertto'] = '돌아감';
+$labels['attachments'] = '첨부 파일';
+$labels['upload'] = '업로드';
+$labels['close'] = '닫기';
+$labels['low'] = '낮음';
+$labels['lowest'] = '가장 낮음';
+$labels['normal'] = '보통';
+$labels['high'] = '높음';
+$labels['highest'] = '가장 높음';
+$labels['nosubject'] = '(제목 없음)';
+$labels['showimages'] = '이미지 표시';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = '일반 텍스트';
+$labels['addcc'] = '참조 넣기';
+$labels['addbcc'] = '숨은참조 넣기';
+$labels['addreplyto'] = '회신주소 넣기';
+$labels['mdnrequest'] = '이 메시지를 보낸 분이 읽음 확인 요청을 했습니다. 확인할까요?';
+$labels['receiptread'] = '읽음 확인 보내기';
+$labels['yourmessage'] = '당신의 메시지를 읽었습니다.';
+$labels['receiptnote'] = '주의: 이 확인은 이 메시지가 수신자의 컴퓨터에 표시된 것만을 의미합니다. 수신자가 반드시 이 메일을 읽거나 이해했다는 것은 아닙니다.';
+$labels['name'] = '표시 이름';
+$labels['firstname'] = '이름';
+$labels['surname'] = '성';
+$labels['email'] = '이메일';
+$labels['addcontact'] = '새 연락처 추가';
+$labels['editcontact'] = '연락처 편집';
+$labels['edit'] = '편집';
+$labels['cancel'] = '취소';
+$labels['save'] = '저장';
+$labels['delete'] = '삭제';
+$labels['newcontact'] = '새 연락처 카드 만들기';
+$labels['deletecontact'] = '선택한 연락처 삭제';
+$labels['composeto'] = '새 메일 작성';
+$labels['contactsfromto'] = '$from 에서 $to 로의 연락처 $count 개';
+$labels['print'] = '인쇄';
+$labels['export'] = '내보내기';
+$labels['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['messagecount'] = '메시지';
+$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/ko_KR/messages.inc b/program/localization/ko_KR/messages.inc
new file mode 100644 (file)
index 0000000..95d591e
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | localization/kr/messages.inc                                            |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: lordmiss <lordmiss@lordmiss.com>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+
+*/
+
+$messages['loginfailed'] = '로그인 실패';
+$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'] = '메시지 이동 중...';
+$messages['receiptsent'] = '메일 읽음 확인을 보냈습니다';
+$messages['errorsendingreceipt'] = '읽음 확인을 보낼 수 없습니다';
+$messages['nodeletelastidentity'] = '이 정보는 마지막 남은 것이므로 지울 수 없습니다';
+$messages['addsubfolderhint'] = '이 폴더는 현재 선택된 폴더의 서브 폴더로 만들어질 것입니다';
+
+?>
\ No newline at end of file
diff --git a/program/localization/kr/labels.inc b/program/localization/kr/labels.inc
deleted file mode 100644 (file)
index 4df78c6..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | localization/kr/labels.inc                                            |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: lordmiss <lordmiss@lordmiss.com>                              |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
-
-*/
-
-$labels['welcome'] = '$product에 오신 것을 환영합니다';
-$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'] = '메시지 $count 개 중 $nr 개';
-$labels['moveto'] = '이동...';
-$labels['download'] = '다운로드';
-$labels['filename'] = '파일 이름';
-$labels['filesize'] = '파일 크기';
-$labels['preferhtml'] = 'HTML 보이기';
-$labels['htmlmessage'] = 'HTML 메시지';
-$labels['prettydate'] = '날짜 형식';
-$labels['addtoaddressbook'] = '주소록에 추가';
-$labels['sun'] = '일';
-$labels['mon'] = '월';
-$labels['tue'] = '화';
-$labels['wed'] = '수';
-$labels['thu'] = '목';
-$labels['fri'] = '금';
-$labels['sat'] = '토';
-$labels['sunday'] = '일요일';
-$labels['monday'] = '월요일';
-$labels['tuesday'] = '화요일';
-$labels['wednesday'] = '수요일';
-$labels['thursday'] = '목요일';
-$labels['friday'] = '금요일';
-$labels['saturday'] = '토요일';
-$labels['today'] = '오늘';
-$labels['checkmail'] = '새 메일 확인';
-$labels['writenewmessage'] = '새 메일 작성';
-$labels['replytomessage'] = '회신 작성';
-$labels['replytoallmessage'] = '보낸이와 모든 수신자에게 회신';
-$labels['forwardmessage'] = '메일 전달';
-$labels['deletemessage'] = '메일 삭제';
-$labels['movemessagetotrash'] = '메일 휴지통으로 이동';
-$labels['printmessage'] = '메일 인쇄';
-$labels['previousmessage'] = '이전 메일 보기';
-$labels['previousmessages'] = '이전 메일 세트 보기';
-$labels['firstmessage'] = '처음 메일 보기';
-$labels['firstmessages'] = '처음 메일 세트 보기';
-$labels['nextmessage'] = '다음 메일 보기';
-$labels['nextmessages'] = '다음 메일 세트 보기';
-$labels['lastmessage'] = '마지막 메일 보기';
-$labels['lastmessages'] = '마지막 메일 세트 보기';
-$labels['backtolist'] = '메일 목록으로';
-$labels['viewsource'] = '소스 보기';
-$labels['markmessages'] = '메시지 표시';
-$labels['markread'] = '읽은 것으로';
-$labels['markunread'] = '읽지 않은 것으로';
-$labels['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['savemessage'] = '드래프트 저장';
-$labels['sendmessage'] = '메일 지금 보냄';
-$labels['addattachment'] = '파일 첨부';
-$labels['charset'] = '문자셋';
-$labels['editortype'] = '편집기 형태';
-$labels['returnreceipt'] = '수신 확인';
-$labels['checkspelling'] = '스펠링 체크';
-$labels['resumeediting'] = '편집 계속';
-$labels['revertto'] = '돌아감';
-$labels['attachments'] = '첨부 파일';
-$labels['upload'] = '업로드';
-$labels['close'] = '닫기';
-$labels['low'] = '낮음';
-$labels['lowest'] = '가장 낮음';
-$labels['normal'] = '보통';
-$labels['high'] = '높음';
-$labels['highest'] = '가장 높음';
-$labels['nosubject'] = '(제목 없음)';
-$labels['showimages'] = '이미지 표시';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = '일반 텍스트';
-$labels['addcc'] = '참조 넣기';
-$labels['addbcc'] = '숨은참조 넣기';
-$labels['addreplyto'] = '회신주소 넣기';
-$labels['mdnrequest'] = '이 메시지를 보낸 분이 읽음 확인 요청을 했습니다. 확인할까요?';
-$labels['receiptread'] = '읽음 확인 보내기';
-$labels['yourmessage'] = '당신의 메시지를 읽었습니다.';
-$labels['receiptnote'] = '주의: 이 확인은 이 메시지가 수신자의 컴퓨터에 표시된 것만을 의미합니다. 수신자가 반드시 이 메일을 읽거나 이해했다는 것은 아닙니다.';
-$labels['name'] = '표시 이름';
-$labels['firstname'] = '이름';
-$labels['surname'] = '성';
-$labels['email'] = '이메일';
-$labels['addcontact'] = '새 연락처 추가';
-$labels['editcontact'] = '연락처 편집';
-$labels['edit'] = '편집';
-$labels['cancel'] = '취소';
-$labels['save'] = '저장';
-$labels['delete'] = '삭제';
-$labels['newcontact'] = '새 연락처 카드 만들기';
-$labels['deletecontact'] = '선택한 연락처 삭제';
-$labels['composeto'] = '새 메일 작성';
-$labels['contactsfromto'] = '$from 에서 $to 로의 연락처 $count 개';
-$labels['print'] = '인쇄';
-$labels['export'] = '내보내기';
-$labels['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['messagecount'] = '메시지';
-$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/kr/messages.inc b/program/localization/kr/messages.inc
deleted file mode 100644 (file)
index 95d591e..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | localization/kr/messages.inc                                            |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: lordmiss <lordmiss@lordmiss.com>                              |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
-
-*/
-
-$messages['loginfailed'] = '로그인 실패';
-$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'] = '메시지 이동 중...';
-$messages['receiptsent'] = '메일 읽음 확인을 보냈습니다';
-$messages['errorsendingreceipt'] = '읽음 확인을 보낼 수 없습니다';
-$messages['nodeletelastidentity'] = '이 정보는 마지막 남은 것이므로 지울 수 없습니다';
-$messages['addsubfolderhint'] = '이 폴더는 현재 선택된 폴더의 서브 폴더로 만들어질 것입니다';
-
-?>
\ No newline at end of file
diff --git a/program/localization/lt/labels.inc b/program/localization/lt/labels.inc
deleted file mode 100644 (file)
index 6f161d6..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/lt/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Martynas Bendorius <martynas@evanet.lt>                       |
- +-----------------------------------------------------------------------+'
-
- @version $Id: labels.inc 1128 2008-02-21 07:43:23Z yllar $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Sveiki atvykę į $product';
-$labels['username'] = 'Vartotojas';
-$labels['password'] = 'Slaptažodis';
-$labels['server'] = 'Serveris';
-$labels['login'] = 'Prisijungti';
-$labels['logout'] = 'Atsijungti';
-$labels['mail'] = 'El. paštas';
-$labels['settings'] = 'Nustatymai';
-$labels['addressbook'] = 'Adresų knyga';
-$labels['inbox'] = 'Gauti';
-$labels['drafts'] = 'Juodraščiai';
-$labels['sent'] = 'Išsiųsti';
-$labels['trash'] = 'Šiukšliadėžė';
-$labels['junk'] = 'Nereikalingi';
-$labels['subject'] = 'Tema';
-$labels['from'] = 'Siuntėjas';
-$labels['to'] = 'Gavėjas';
-$labels['cc'] = 'Kopija';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Atsakyti į';
-$labels['date'] = 'Data';
-$labels['size'] = 'Dydis';
-$labels['priority'] = 'Svarbumas';
-$labels['organization'] = 'Organizacija';
-$labels['reply-to'] = 'Atsakyti į';
-$labels['mailboxlist'] = 'Aplankai';
-$labels['messagesfromto'] = 'Laiškai nuo $from iki $to iš $count';
-$labels['messagenrof'] = 'Laiškas $nr iš $count';
-$labels['moveto'] = 'perkelti į ...';
-$labels['download'] = 'parsisiųsti';
-$labels['filename'] = 'Bylos vardas';
-$labels['filesize'] = 'Bylos dydis';
-$labels['preferhtml'] = 'Rodyti HTML';
-$labels['htmlmessage'] = 'HTML Laiškas';
-$labels['prettydate'] = 'Gražios datos';
-$labels['addtoaddressbook'] = 'Įtraukti į adresų knygą';
-$labels['sun'] = 'Sek';
-$labels['mon'] = 'Pir';
-$labels['tue'] = 'Ant';
-$labels['wed'] = 'Tre';
-$labels['thu'] = 'Ket';
-$labels['fri'] = 'Pen';
-$labels['sat'] = 'Šeš';
-$labels['sunday'] = 'Sekmadienis';
-$labels['monday'] = 'Pirmadienis';
-$labels['tuesday'] = 'Antradienis';
-$labels['wednesday'] = 'Trečiadienis';
-$labels['thursday'] = 'Ketvirtadienis';
-$labels['friday'] = 'Penktadienis';
-$labels['saturday'] = 'Šeštadienis';
-$labels['today'] = 'Šiandien';
-$labels['checkmail'] = 'Tikrinti ar nėra naujų laiškų';
-$labels['writenewmessage'] = 'Rašyti naują laišką';
-$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';
-$labels['firstmessage'] = 'Rodyti pirmąjį laišką';
-$labels['firstmessages'] = 'Rodyti pirmuosius laiškus';
-$labels['nextmessage'] = 'Rodyti tolesnį laišką';
-$labels['nextmessages'] = 'Rodyti tolesnius laiškus';
-$labels['lastmessage'] = 'Rodyti paskutinį laišką';
-$labels['lastmessages'] = 'Rodyti paskutinius laiškus';
-$labels['backtolist'] = 'Grižti į laiškų sarašą';
-$labels['viewsource'] = 'Rodyti šaltinį';
-$labels['markmessages'] = 'Pažymėti laiškus';
-$labels['markread'] = 'Kaip perskaitytus';
-$labels['markunread'] = 'Kaip neperskaitytus';
-$labels['select'] = 'Pažymėti';
-$labels['all'] = 'Visus';
-$labels['none'] = 'Nieko';
-$labels['unread'] = 'Neskaitytas';
-$labels['compact'] = 'Suspausti';
-$labels['empty'] = 'Ištuštinti';
-$labels['purge'] = 'Išvalyti';
-$labels['quota'] = 'Disko naudojimas';
-$labels['unknown'] = 'nežinomas';
-$labels['unlimited'] = 'neribotas';
-$labels['quicksearch'] = 'Greita paieška';
-$labels['resetsearch'] = 'Atšaukti paiešką';
-$labels['compose'] = 'Rašyti nauja laiška';
-$labels['savemessage'] = 'Išsaugoti šį juodraštį';
-$labels['sendmessage'] = 'Išsiųsti laiską';
-$labels['addattachment'] = 'Prisegti bylą';
-$labels['charset'] = 'Koduotė';
-$labels['editortype'] = 'Redagavimo tipas';
-$labels['returnreceipt'] = 'Atgalinis gavėjas';
-$labels['checkspelling'] = 'Tikrinti rašybą';
-$labels['resumeediting'] = 'Tęsti redagavimą';
-$labels['revertto'] = 'Atstatyti į';
-$labels['attachments'] = 'Prisegtos bylos';
-$labels['upload'] = 'Įkelti';
-$labels['close'] = 'Uždaryti';
-$labels['low'] = 'Žemas';
-$labels['lowest'] = 'Žemiausias';
-$labels['normal'] = 'Normalus';
-$labels['high'] = 'Aukštas';
-$labels['highest'] = 'Aukščiausias';
-$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['mdnrequest'] = 'Žinutės siuntėjas paprašė patvirtinti, kad jūs ją perskaitėte. Ar norite išsiųsti patvirtinimą?';
-$labels['receiptread'] = 'Patvirtinimas (skaitymo)';
-$labels['yourmessage'] = 'Jūsų laiško perskaitymo patvirtinimas';
-$labels['receiptnote'] = 'Pastaba: šis laiško perskaitymo patvirtinimas nurodo, jog laiškas buvo atidarytas gavėjo kompiuteryje, tačiau negarantuoja, jog gavėjas perskaitė ir suprato laiško turinį.';
-$labels['name'] = 'Rodomas vardas';
-$labels['firstname'] = 'Vardas';
-$labels['surname'] = 'Pavardė';
-$labels['email'] = 'El. paštas';
-$labels['addcontact'] = 'Pridėti kontaktą';
-$labels['editcontact'] = 'Redaguoti kontaktą';
-$labels['edit'] = 'Redaguoti';
-$labels['cancel'] = 'Atšaukti';
-$labels['save'] = 'Išsaugoti';
-$labels['delete'] = 'Ištrinti';
-$labels['newcontact'] = 'Sukurti naują kontaktą';
-$labels['deletecontact'] = 'Ištrinti pažymėtus kontaktus';
-$labels['composeto'] = 'Rašyti laišką';
-$labels['contactsfromto'] = 'Kontaktai nuo $from iki $to iš $count';
-$labels['print'] = 'Atspausdinti';
-$labels['export'] = 'Eksportuoti';
-$labels['previouspage'] = 'Rodyti ankstesnį puslapį';
-$labels['firstpage'] = 'Rodyti pirmąjį puslapį';
-$labels['nextpage'] = 'Rodyti tolesnį puslapį';
-$labels['lastpage'] = 'Rodyti paskutinį puslapį';
-$labels['groups'] = 'Grupės';
-$labels['personaladrbook'] = 'Asmeniniai adresai';
-$labels['settingsfor'] = 'Nustatymai';
-$labels['preferences'] = 'Nustatymai';
-$labels['userpreferences'] = 'Vartotojo nustatymai';
-$labels['editpreferences'] = 'Redaguoti vartotojo nustatymus';
-$labels['identities'] = 'Tapatybės';
-$labels['manageidentities'] = 'Tvarkyti tapatybes šiai sąskaitai';
-$labels['newidentity'] = 'Nauja tapatybė';
-$labels['newitem'] = 'Naujas įrašas';
-$labels['edititem'] = 'Redaguoti įrašą';
-$labels['setdefault'] = 'Nustatyti pagrindiniu';
-$labels['language'] = 'Kalba';
-$labels['timezone'] = 'Laiko juosta';
-$labels['pagesize'] = 'Eilučių skaičius puslapyje';
-$labels['signature'] = 'Parašas';
-$labels['dstactive'] = 'Vasaros/Žiemos laikas';
-$labels['htmleditor'] = 'Kurti HTML laiškus';
-$labels['htmlsignature'] = 'HTML parašas';
-$labels['previewpane'] = 'Rodyti peržiūros lauką';
-$labels['autosavedraft'] = 'Automatiškai išsaugoti juodraščius';
-$labels['everynminutes'] = 'kas $n minutes(-ių)';
-$labels['never'] = 'niekada';
-$labels['folder'] = 'Aplankas';
-$labels['folders'] = 'Aplankai';
-$labels['foldername'] = 'Aplanko vardas';
-$labels['subscribed'] = 'Užsakytas';
-$labels['messagecount'] = 'Laiškai';
-$labels['create'] = 'Sukurti';
-$labels['createfolder'] = 'Sukurti naują aplanką';
-$labels['rename'] = 'Pervadinti';
-$labels['renamefolder'] = 'Pervadinti aplanką';
-$labels['deletefolder'] = 'Ištrinti aplanką';
-$labels['managefolders'] = 'Tvarkyti aplankus';
-$labels['sortby'] = 'Rikiuoti pagal';
-$labels['sortasc'] = 'Rikiuoti didėjančia tvarka';
-$labels['sortdesc'] = 'Rikiuoti mažėjančia tvarka';
-
-?>
\ No newline at end of file
diff --git a/program/localization/lt/messages.inc b/program/localization/lt/messages.inc
deleted file mode 100644 (file)
index 24cd96f..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/lt/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Martynas Bendorius <martynas@evanet.lt>                       |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1128 2008-02-21 07:43:23Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Prisijungti nepavyko';
-$messages['cookiesdisabled'] = 'Jūsų naršyklė nepriima slapukų';
-$messages['sessionerror'] = 'Jūsų sesija negaliojanti';
-$messages['imaperror'] = 'Nepavyko prisijungti prie IMAP serverio';
-$messages['nomessagesfound'] = 'Šioje pašto dėžutėje laiškų nėra ';
-$messages['loggedout'] = 'Jus sėkmingai atsijungėte. Viso gero!';
-$messages['mailboxempty'] = 'Pašto dėžutė tuščia';
-$messages['loading'] = 'Įkeliama...';
-$messages['loadingdata'] = 'Įkeliami duomenys...';
-$messages['checkingmail'] = 'Tikrinama ar nėra naujų pranešimų...';
-$messages['sendingmessage'] = 'Siunčiamas laiškas...';
-$messages['messagesent'] = 'Laiškas sėkmingai nusiųstas';
-$messages['savingmessage'] = 'Išsaugomas laiškas...';
-$messages['messagesaved'] = 'Laiškas išsaugotas į Juodraščius';
-$messages['successfullysaved'] = 'Sėkmingai išsaugota';
-$messages['addedsuccessfully'] = 'Kontaktas sėkmingai įtrauktas į adresų knygą';
-$messages['contactexists'] = 'Kontaktas, turintis šį el. pašto adresą, jau egzistuoja';
-$messages['blockedimages'] = 'Saugant jūsų privatumą su laišku neatsiųsti paveikslėliai nerodomi';
-$messages['encryptedmessage'] = 'Apgailestaujame, tačiau šis laiškas užšifruotas ir negali būti parodytas.';
-$messages['nocontactsfound'] = 'Kontaktų nerasta';
-$messages['contactnotfound'] = 'Reikalautas kontaktas nerastas';
-$messages['sendingfailed'] = 'Laiško išsiųsti nepavyko';
-$messages['errorsaving'] = 'Išsaugant įvyko klaida';
-$messages['errormoving'] = 'Laiško perkelti nepavyko';
-$messages['errordeleting'] = 'Laiško ištrinti nepavyko';
-$messages['deletecontactconfirm'] = 'Ar jūs tikrai norite ištrinti pasirinktą(-us) kontaktą(-us)?';
-$messages['deletemessagesconfirm'] = 'Ar jūs tikrai norite ištrinti pasirinktą(-us) žinutę(-es)?';
-$messages['deletefolderconfirm'] = 'Ar jūs tikrai norite ištrinti šį aplanką?';
-$messages['purgefolderconfirm'] = 'Ar jūs tikrai norite ištrinti visus laiškus, esančius šiame aplanke?';
-$messages['formincomplete'] = 'Šios formos laukai yra nepilnai užpildyti';
-$messages['noemailwarning'] = 'Prašome įvesti teisingą el. pašto adresą';
-$messages['nonamewarning'] = 'Prašome įvesti vardą';
-$messages['nopagesizewarning'] = 'Prašome įvesti puslapio dydį';
-$messages['norecipientwarning'] = 'Prašome įvesti bent vieną gavėją';
-$messages['nosubjectwarning'] = 'Temos laukelis tuščias. Ar norite temą įvesti dabar?';
-$messages['nobodywarning'] = 'Išsiųsti šį laišką be teksto?';
-$messages['notsentwarning'] = 'Laiškas neišsiųstas. Ar jūs tikrai norite jo atsikratyti?';
-$messages['noldapserver'] = 'Prašome pasirinkti LDAP serverį paieškai';
-$messages['nocontactsreturned'] = 'Kontaktas(-ai) nerastas(-i)';
-$messages['nosearchname'] = 'Prašom įvesti vardą arba el. pašto adresą';
-$messages['searchsuccessful'] = 'Surasta $nr žinučių';
-$messages['searchnomatch'] = 'Rezultatų nerasta';
-$messages['searching'] = 'Ieškoma...';
-$messages['checking'] = 'Tikrinama...';
-$messages['nospellerrors'] = 'Rašybos klaidų nerasta';
-$messages['folderdeleted'] = 'Aplankas sėkmingai ištrintas';
-$messages['deletedsuccessfully'] = 'Sėkmingai ištrintas';
-$messages['converting'] = 'Pašalinamas laiško formatavimas...';
-$messages['messageopenerror'] = 'Nepavyko įkelti laišką iš serverio';
-$messages['fileuploaderror'] = 'Nepavyko įkelti bylos';
-$messages['filesizeerror'] = 'Įkelta byla viršija maksimalų vietos limitą — $size';
-$messages['copysuccess'] = 'Sėkmingai nukopijuoti $nr adresai';
-$messages['copyerror'] = 'Adresų kopijuoti negalima';
-$messages['sourceisreadonly'] = 'Šis adreso šaltinis yra tik skaitymui';
-$messages['errorsavingcontact'] = 'Kontakto adreso išsaugoti negalima';
-$messages['movingmessage'] = 'Perkeliamas laiškas...';
-$messages['receiptsent'] = 'Sėkmingai išsiųstas laiško perskaitymo patvirtinimas';
-$messages['errorsendingreceipt'] = 'Nepavyko išsiųsti laiško perskaitymo patvirtinimo';
-$messages['nodeletelastidentity'] = 'Jūs negalite ištrinti šios tapatybės, kadangi ji yra vienintelė likusi.';
-$messages['addsubfolderhint'] = 'Šis aplankas bus sukurtas kaip poaplankis, kurį esate pažymėjęs';
-
-?>
diff --git a/program/localization/lt_LT/labels.inc b/program/localization/lt_LT/labels.inc
new file mode 100644 (file)
index 0000000..4568158
--- /dev/null
@@ -0,0 +1,227 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/lt/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Martynas Bendorius <martynas@evanet.lt>                       |
++-----------------------------------------------------------------------+'
+
+@version $Id: labels.inc 1445 2008-05-28 09:42:08Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Sveiki atvykę į $product';
+$labels['username'] = 'Vartotojas';
+$labels['password'] = 'Slaptažodis';
+$labels['server'] = 'Serveris';
+$labels['login'] = 'Prisijungti';
+$labels['logout'] = 'Atsijungti';
+$labels['mail'] = 'El. paštas';
+$labels['settings'] = 'Nustatymai';
+$labels['addressbook'] = 'Adresų knyga';
+$labels['inbox'] = 'Gauti';
+$labels['drafts'] = 'Juodraščiai';
+$labels['sent'] = 'Išsiųsti';
+$labels['trash'] = 'Šiukšliadėžė';
+$labels['junk'] = 'Nereikalingi';
+$labels['subject'] = 'Tema';
+$labels['from'] = 'Siuntėjas';
+$labels['to'] = 'Gavėjas';
+$labels['cc'] = 'Kopija';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Atsakyti į';
+$labels['date'] = 'Data';
+$labels['size'] = 'Dydis';
+$labels['priority'] = 'Svarbumas';
+$labels['organization'] = 'Organizacija';
+$labels['reply-to'] = 'Atsakyti į';
+$labels['mailboxlist'] = 'Aplankai';
+$labels['messagesfromto'] = 'Laiškai nuo $from iki $to iš $count';
+$labels['messagenrof'] = 'Laiškas $nr iš $count';
+$labels['moveto'] = 'perkelti į ...';
+$labels['download'] = 'parsisiųsti';
+$labels['filename'] = 'Bylos vardas';
+$labels['filesize'] = 'Bylos dydis';
+$labels['preferhtml'] = 'Rodyti HTML';
+$labels['htmlmessage'] = 'HTML Laiškas';
+$labels['prettydate'] = 'Gražios datos';
+$labels['addtoaddressbook'] = 'Įtraukti į adresų knygą';
+$labels['sun'] = 'Sek';
+$labels['mon'] = 'Pir';
+$labels['tue'] = 'Ant';
+$labels['wed'] = 'Tre';
+$labels['thu'] = 'Ket';
+$labels['fri'] = 'Pen';
+$labels['sat'] = 'Šeš';
+$labels['sunday'] = 'Sekmadienis';
+$labels['monday'] = 'Pirmadienis';
+$labels['tuesday'] = 'Antradienis';
+$labels['wednesday'] = 'Trečiadienis';
+$labels['thursday'] = 'Ketvirtadienis';
+$labels['friday'] = 'Penktadienis';
+$labels['saturday'] = 'Šeštadienis';
+$labels['jan'] = 'Sau';
+$labels['feb'] = 'Vas';
+$labels['mar'] = 'Kov';
+$labels['apr'] = 'Bal';
+$labels['may'] = 'Geg';
+$labels['jun'] = 'Bir';
+$labels['jul'] = 'Lie';
+$labels['aug'] = 'Rugp';
+$labels['sep'] = 'Rugs';
+$labels['oct'] = 'Spa';
+$labels['nov'] = 'Lap';
+$labels['dec'] = 'Gruo';
+$labels['longjan'] = 'Sausis';
+$labels['longfeb'] = 'Vasaris';
+$labels['longmar'] = 'Kovas';
+$labels['longapr'] = 'Balandis';
+$labels['longmay'] = 'Gegužė';
+$labels['longjun'] = 'Biržėlis';
+$labels['longjul'] = 'Liepa';
+$labels['longaug'] = 'Rugpjūtis';
+$labels['longsep'] = 'Rugsėjis';
+$labels['longoct'] = 'Spalis';
+$labels['longnov'] = 'Lapkritis';
+$labels['longdec'] = 'Gruodis';
+$labels['today'] = 'Šiandien';
+$labels['checkmail'] = 'Tikrinti ar nėra naujų laiškų';
+$labels['writenewmessage'] = 'Rašyti naują laišką';
+$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';
+$labels['firstmessage'] = 'Rodyti pirmąjį laišką';
+$labels['firstmessages'] = 'Rodyti pirmuosius laiškus';
+$labels['nextmessage'] = 'Rodyti tolesnį laišką';
+$labels['nextmessages'] = 'Rodyti tolesnius laiškus';
+$labels['lastmessage'] = 'Rodyti paskutinį laišką';
+$labels['lastmessages'] = 'Rodyti paskutinius laiškus';
+$labels['backtolist'] = 'Grižti į laiškų sarašą';
+$labels['viewsource'] = 'Rodyti šaltinį';
+$labels['markmessages'] = 'Pažymėti laiškus';
+$labels['markread'] = 'Kaip perskaitytus';
+$labels['markunread'] = 'Kaip neperskaitytus';
+$labels['select'] = 'Pažymėti';
+$labels['all'] = 'Visus';
+$labels['none'] = 'Nieko';
+$labels['unread'] = 'Neskaitytas';
+$labels['compact'] = 'Suspausti';
+$labels['empty'] = 'Ištuštinti';
+$labels['purge'] = 'Išvalyti';
+$labels['quota'] = 'Disko naudojimas';
+$labels['unknown'] = 'nežinomas';
+$labels['unlimited'] = 'neribotas';
+$labels['quicksearch'] = 'Greita paieška';
+$labels['resetsearch'] = 'Atšaukti paiešką';
+$labels['compose'] = 'Rašyti nauja laiška';
+$labels['savemessage'] = 'Išsaugoti šį juodraštį';
+$labels['sendmessage'] = 'Išsiųsti laiską';
+$labels['addattachment'] = 'Prisegti bylą';
+$labels['charset'] = 'Koduotė';
+$labels['editortype'] = 'Redagavimo tipas';
+$labels['returnreceipt'] = 'Atgalinis gavėjas';
+$labels['checkspelling'] = 'Tikrinti rašybą';
+$labels['resumeediting'] = 'Tęsti redagavimą';
+$labels['revertto'] = 'Atstatyti į';
+$labels['attachments'] = 'Prisegtos bylos';
+$labels['upload'] = 'Įkelti';
+$labels['close'] = 'Uždaryti';
+$labels['low'] = 'Žemas';
+$labels['lowest'] = 'Žemiausias';
+$labels['normal'] = 'Normalus';
+$labels['high'] = 'Aukštas';
+$labels['highest'] = 'Aukščiausias';
+$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['mdnrequest'] = 'Žinutės siuntėjas paprašė patvirtinti, kad jūs ją perskaitėte. Ar norite išsiųsti patvirtinimą?';
+$labels['receiptread'] = 'Patvirtinimas (skaitymo)';
+$labels['yourmessage'] = 'Jūsų laiško perskaitymo patvirtinimas';
+$labels['receiptnote'] = 'Pastaba: šis laiško perskaitymo patvirtinimas nurodo, jog laiškas buvo atidarytas gavėjo kompiuteryje, tačiau negarantuoja, jog gavėjas perskaitė ir suprato laiško turinį.';
+$labels['name'] = 'Rodomas vardas';
+$labels['firstname'] = 'Vardas';
+$labels['surname'] = 'Pavardė';
+$labels['email'] = 'El. paštas';
+$labels['addcontact'] = 'Pridėti kontaktą';
+$labels['editcontact'] = 'Redaguoti kontaktą';
+$labels['edit'] = 'Redaguoti';
+$labels['cancel'] = 'Atšaukti';
+$labels['save'] = 'Išsaugoti';
+$labels['delete'] = 'Ištrinti';
+$labels['newcontact'] = 'Sukurti naują kontaktą';
+$labels['deletecontact'] = 'Ištrinti pažymėtus kontaktus';
+$labels['composeto'] = 'Rašyti laišką';
+$labels['contactsfromto'] = 'Kontaktai nuo $from iki $to iš $count';
+$labels['print'] = 'Atspausdinti';
+$labels['export'] = 'Eksportuoti';
+$labels['previouspage'] = 'Rodyti ankstesnį puslapį';
+$labels['firstpage'] = 'Rodyti pirmąjį puslapį';
+$labels['nextpage'] = 'Rodyti tolesnį puslapį';
+$labels['lastpage'] = 'Rodyti paskutinį puslapį';
+$labels['groups'] = 'Grupės';
+$labels['personaladrbook'] = 'Asmeniniai adresai';
+$labels['settingsfor'] = 'Nustatymai';
+$labels['preferences'] = 'Nustatymai';
+$labels['userpreferences'] = 'Vartotojo nustatymai';
+$labels['editpreferences'] = 'Redaguoti vartotojo nustatymus';
+$labels['identities'] = 'Tapatybės';
+$labels['manageidentities'] = 'Tvarkyti tapatybes šiai sąskaitai';
+$labels['newidentity'] = 'Nauja tapatybė';
+$labels['newitem'] = 'Naujas įrašas';
+$labels['edititem'] = 'Redaguoti įrašą';
+$labels['setdefault'] = 'Nustatyti pagrindiniu';
+$labels['language'] = 'Kalba';
+$labels['timezone'] = 'Laiko juosta';
+$labels['pagesize'] = 'Eilučių skaičius puslapyje';
+$labels['signature'] = 'Parašas';
+$labels['dstactive'] = 'Vasaros/Žiemos laikas';
+$labels['htmleditor'] = 'Kurti HTML laiškus';
+$labels['htmlsignature'] = 'HTML parašas';
+$labels['previewpane'] = 'Rodyti peržiūros lauką';
+$labels['logoutclear'] = 'Išvalyti šiukšliadėžę atsijungiant';
+$labels['logoutcompact'] = 'Suspausti Gautus atsijungiant';
+$labels['uisettings'] = 'Vartotojo Aplinka';
+$labels['serversettings'] = 'Serverio Nuostatos';
+$labels['mailboxview'] = 'Pašto Dėžutės Peržiūra';
+$labels['mdnrequests'] = 'Siuntėjo perspėjimai';
+$labels['askuser'] = 'prašyti vartotojo';
+$labels['autosend'] = 'siųsti automatiškai';
+$labels['ignore'] = 'ignoruoti';
+$labels['readwhendeleted'] = 'Pažymėti laišką kaip perskaitytu trinant';
+$labels['flagfordeletion'] = 'Pažymėti laišką trynimui vietoje ištrynimo';
+$labels['autosavedraft'] = 'Automatiškai išsaugoti juodraščius';
+$labels['everynminutes'] = 'kas $n minutes(-ių)';
+$labels['never'] = 'niekada';
+$labels['folder'] = 'Aplankas';
+$labels['folders'] = 'Aplankai';
+$labels['foldername'] = 'Aplanko vardas';
+$labels['subscribed'] = 'Užsakytas';
+$labels['messagecount'] = 'Laiškai';
+$labels['create'] = 'Sukurti';
+$labels['createfolder'] = 'Sukurti naują aplanką';
+$labels['rename'] = 'Pervadinti';
+$labels['renamefolder'] = 'Pervadinti aplanką';
+$labels['deletefolder'] = 'Ištrinti aplanką';
+$labels['managefolders'] = 'Tvarkyti aplankus';
+$labels['sortby'] = 'Rikiuoti pagal';
+$labels['sortasc'] = 'Rikiuoti didėjančia tvarka';
+$labels['sortdesc'] = 'Rikiuoti mažėjančia tvarka';
+
+?>
diff --git a/program/localization/lt_LT/messages.inc b/program/localization/lt_LT/messages.inc
new file mode 100644 (file)
index 0000000..24cd96f
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/lt/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Martynas Bendorius <martynas@evanet.lt>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1128 2008-02-21 07:43:23Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Prisijungti nepavyko';
+$messages['cookiesdisabled'] = 'Jūsų naršyklė nepriima slapukų';
+$messages['sessionerror'] = 'Jūsų sesija negaliojanti';
+$messages['imaperror'] = 'Nepavyko prisijungti prie IMAP serverio';
+$messages['nomessagesfound'] = 'Šioje pašto dėžutėje laiškų nėra ';
+$messages['loggedout'] = 'Jus sėkmingai atsijungėte. Viso gero!';
+$messages['mailboxempty'] = 'Pašto dėžutė tuščia';
+$messages['loading'] = 'Įkeliama...';
+$messages['loadingdata'] = 'Įkeliami duomenys...';
+$messages['checkingmail'] = 'Tikrinama ar nėra naujų pranešimų...';
+$messages['sendingmessage'] = 'Siunčiamas laiškas...';
+$messages['messagesent'] = 'Laiškas sėkmingai nusiųstas';
+$messages['savingmessage'] = 'Išsaugomas laiškas...';
+$messages['messagesaved'] = 'Laiškas išsaugotas į Juodraščius';
+$messages['successfullysaved'] = 'Sėkmingai išsaugota';
+$messages['addedsuccessfully'] = 'Kontaktas sėkmingai įtrauktas į adresų knygą';
+$messages['contactexists'] = 'Kontaktas, turintis šį el. pašto adresą, jau egzistuoja';
+$messages['blockedimages'] = 'Saugant jūsų privatumą su laišku neatsiųsti paveikslėliai nerodomi';
+$messages['encryptedmessage'] = 'Apgailestaujame, tačiau šis laiškas užšifruotas ir negali būti parodytas.';
+$messages['nocontactsfound'] = 'Kontaktų nerasta';
+$messages['contactnotfound'] = 'Reikalautas kontaktas nerastas';
+$messages['sendingfailed'] = 'Laiško išsiųsti nepavyko';
+$messages['errorsaving'] = 'Išsaugant įvyko klaida';
+$messages['errormoving'] = 'Laiško perkelti nepavyko';
+$messages['errordeleting'] = 'Laiško ištrinti nepavyko';
+$messages['deletecontactconfirm'] = 'Ar jūs tikrai norite ištrinti pasirinktą(-us) kontaktą(-us)?';
+$messages['deletemessagesconfirm'] = 'Ar jūs tikrai norite ištrinti pasirinktą(-us) žinutę(-es)?';
+$messages['deletefolderconfirm'] = 'Ar jūs tikrai norite ištrinti šį aplanką?';
+$messages['purgefolderconfirm'] = 'Ar jūs tikrai norite ištrinti visus laiškus, esančius šiame aplanke?';
+$messages['formincomplete'] = 'Šios formos laukai yra nepilnai užpildyti';
+$messages['noemailwarning'] = 'Prašome įvesti teisingą el. pašto adresą';
+$messages['nonamewarning'] = 'Prašome įvesti vardą';
+$messages['nopagesizewarning'] = 'Prašome įvesti puslapio dydį';
+$messages['norecipientwarning'] = 'Prašome įvesti bent vieną gavėją';
+$messages['nosubjectwarning'] = 'Temos laukelis tuščias. Ar norite temą įvesti dabar?';
+$messages['nobodywarning'] = 'Išsiųsti šį laišką be teksto?';
+$messages['notsentwarning'] = 'Laiškas neišsiųstas. Ar jūs tikrai norite jo atsikratyti?';
+$messages['noldapserver'] = 'Prašome pasirinkti LDAP serverį paieškai';
+$messages['nocontactsreturned'] = 'Kontaktas(-ai) nerastas(-i)';
+$messages['nosearchname'] = 'Prašom įvesti vardą arba el. pašto adresą';
+$messages['searchsuccessful'] = 'Surasta $nr žinučių';
+$messages['searchnomatch'] = 'Rezultatų nerasta';
+$messages['searching'] = 'Ieškoma...';
+$messages['checking'] = 'Tikrinama...';
+$messages['nospellerrors'] = 'Rašybos klaidų nerasta';
+$messages['folderdeleted'] = 'Aplankas sėkmingai ištrintas';
+$messages['deletedsuccessfully'] = 'Sėkmingai ištrintas';
+$messages['converting'] = 'Pašalinamas laiško formatavimas...';
+$messages['messageopenerror'] = 'Nepavyko įkelti laišką iš serverio';
+$messages['fileuploaderror'] = 'Nepavyko įkelti bylos';
+$messages['filesizeerror'] = 'Įkelta byla viršija maksimalų vietos limitą — $size';
+$messages['copysuccess'] = 'Sėkmingai nukopijuoti $nr adresai';
+$messages['copyerror'] = 'Adresų kopijuoti negalima';
+$messages['sourceisreadonly'] = 'Šis adreso šaltinis yra tik skaitymui';
+$messages['errorsavingcontact'] = 'Kontakto adreso išsaugoti negalima';
+$messages['movingmessage'] = 'Perkeliamas laiškas...';
+$messages['receiptsent'] = 'Sėkmingai išsiųstas laiško perskaitymo patvirtinimas';
+$messages['errorsendingreceipt'] = 'Nepavyko išsiųsti laiško perskaitymo patvirtinimo';
+$messages['nodeletelastidentity'] = 'Jūs negalite ištrinti šios tapatybės, kadangi ji yra vienintelė likusi.';
+$messages['addsubfolderhint'] = 'Šis aplankas bus sukurtas kaip poaplankis, kurį esate pažymėjęs';
+
+?>
diff --git a/program/localization/lv/labels.inc b/program/localization/lv/labels.inc
deleted file mode 100644 (file)
index 0d2f591..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/lv/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Rudolfs Osins <dev.random@gmail.com>                          |
- |         Mikelis Zalais <mik@prog.lv>                                  |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1093 2008-02-16 11:40:18Z tomekp $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Esiet laipni lūgti $product';
-$labels['username'] = 'Lietotājvārds';
-$labels['password'] = 'Parole';
-$labels['server'] = 'Serveris';
-$labels['login'] = 'Pieslēgties';
-$labels['logout'] = 'Atslēgties';
-$labels['mail'] = 'E-pasts';
-$labels['settings'] = 'Personīgie iestatījumi';
-$labels['addressbook'] = 'Adrešu grāmata';
-$labels['inbox'] = 'Ienākošās';
-$labels['drafts'] = 'Uzmetumi';
-$labels['sent'] = 'Nosūtītās';
-$labels['trash'] = 'Miskaste';
-$labels['junk'] = 'Mēstules';
-$labels['subject'] = 'Temats';
-$labels['from'] = 'No';
-$labels['to'] = 'Kam';
-$labels['cc'] = 'Kopija';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Atbildēt uz';
-$labels['date'] = 'Datums';
-$labels['size'] = 'Izmērs';
-$labels['priority'] = 'Prioritāte';
-$labels['organization'] = 'Organizācija';
-$labels['reply-to'] = 'Atbildēt uz';
-$labels['mailboxlist'] = 'Mapes';
-$labels['messagesfromto'] = 'Vēstules $from līdz $to no $count';
-$labels['messagenrof'] = '$nr. vēstule  no $count';
-$labels['moveto'] = 'pārvietot uz...';
-$labels['download'] = 'lejupielādēt';
-$labels['filename'] = 'Faila nosaukums';
-$labels['filesize'] = 'Faila izmērs';
-$labels['preferhtml'] = 'Dot priekšroku HTML';
-$labels['htmlmessage'] = 'HTML vēstule';
-$labels['prettydate'] = '"Skaists" datums';
-$labels['addtoaddressbook'] = 'Pievienot adrešu grāmatai';
-$labels['sun'] = 'Sv';
-$labels['mon'] = 'P';
-$labels['tue'] = 'O';
-$labels['wed'] = 'T';
-$labels['thu'] = 'C';
-$labels['fri'] = 'P';
-$labels['sat'] = 'Se';
-$labels['sunday'] = 'Svētdiena';
-$labels['monday'] = 'Pirmdiena';
-$labels['tuesday'] = 'Otrdiena';
-$labels['wednesday'] = 'Trešdiena';
-$labels['thursday'] = 'Ceturtdiena';
-$labels['friday'] = 'Piektdiena';
-$labels['saturday'] = 'Sestdiena';
-$labels['today'] = 'Šodien';
-$labels['checkmail'] = 'Pārbaudīt pastu';
-$labels['writenewmessage'] = 'Rakstīt jaunu vēstuli';
-$labels['replytomessage'] = 'Atbildēt uz vēstuli';
-$labels['replytoallmessage'] = 'Atbildēt sūtītājam un visiem saņēmējiem';
-$labels['forwardmessage'] = 'Pārsūtīt vēstuli';
-$labels['deletemessage'] = 'Dzēst vēstuli';
-$labels['movemessagetotrash'] = 'Pārvietot vēstuli uz miskasti';
-$labels['printmessage'] = 'Izdrukāt šo vēstuli';
-$labels['previousmessage'] = 'Parādīt iepriekšējo vēstuli';
-$labels['previousmessages'] = 'Parādīt iepriekšējo vēstuļu kopu';
-$labels['firstmessage'] = 'Parādīt pirmo vēstuli';
-$labels['firstmessages'] = 'Parādīt pirmo vēstuļu kopu';
-$labels['nextmessage'] = 'Parādīt nākamo vēstuli';
-$labels['nextmessages'] = 'Parādīt nākamo vēstuļu kopu';
-$labels['lastmessage'] = 'Parādīt pēdējo vēstuli';
-$labels['lastmessages'] = 'Parādīt pēdējo vēstuļu kopu';
-$labels['backtolist'] = 'Atpakaļ uz vēstuļu sarakstu';
-$labels['viewsource'] = 'Rādīt pirmtekstu';
-$labels['markmessages'] = 'Atzīmēt vēstules';
-$labels['markread'] = 'Kā lasītas';
-$labels['markunread'] = 'Kā nelasītas';
-$labels['select'] = 'Iezīmēt';
-$labels['all'] = 'Visas';
-$labels['none'] = 'Nevienu';
-$labels['unread'] = 'Nelasītās';
-$labels['compact'] = 'Saspiest';
-$labels['empty'] = 'Iztukšot';
-$labels['purge'] = 'Iztīrīt';
-$labels['quota'] = 'Kvota';
-$labels['unknown'] = 'nezināms';
-$labels['unlimited'] = 'neierobežots';
-$labels['quicksearch'] = 'Ārtā meklēšana';
-$labels['resetsearch'] = 'Atstatīt meklēšanu';
-$labels['compose'] = 'Rakstīt vēstuli';
-$labels['savemessage'] = 'Saglabāt uzmetumu';
-$labels['sendmessage'] = 'Sūtīt vēstuli';
-$labels['addattachment'] = 'Pievienot failu';
-$labels['charset'] = 'Rakstzīmju kopa';
-$labels['editortype'] = 'Redaktora tips';
-$labels['returnreceipt'] = 'Saņemšanas apstiprinājums';
-$labels['checkspelling'] = 'Pārbaudīt pareizrakstību';
-$labels['resumeediting'] = 'Turpināt rediģēšanu';
-$labels['revertto'] = 'Atgriezt uz';
-$labels['attachments'] = 'Pielikumi';
-$labels['upload'] = 'Augšupielādēt';
-$labels['close'] = 'Aizvērt';
-$labels['low'] = 'Zema';
-$labels['lowest'] = 'Zemākā';
-$labels['normal'] = 'Normāla';
-$labels['high'] = 'Augsta';
-$labels['highest'] = 'Augstākā';
-$labels['nosubject'] = '(no subject)';
-$labels['showimages'] = 'Rādīt attēlus';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Vienkāršs teksts';
-$labels['addcc'] = 'Pievienot Cc';
-$labels['addbcc'] = 'Pievienot Bcc';
-$labels['addreplyto'] = 'Pievienot Reply-To';
-$labels['mdnrequest'] = 'Šīs vēstules sūtītājs vēlas redzēt vēstules saņemšanas apstiprinājumu. Vai jūs vēlaties nosūtīt apstiprinājumu?';
-$labels['receiptread'] = 'Saņemšanas apstiprinājums';
-$labels['yourmessage'] = 'Šīs ir jūsu vēstules saņemšanas apstiprinājums';
-$labels['receiptnote'] = 'Piezīme: Šīs apsiprinājums nozīmē tikai to, ka vēstule tika parādīta uz saņēmāja datora. Tas nenozīmē, ka saņēmējs ir izlasījis vai izpratis vēstules saturu.';
-$labels['name'] = 'Uzrādītais vārds';
-$labels['firstname'] = 'Vārds';
-$labels['surname'] = 'Uzvārds';
-$labels['email'] = 'E-pasts';
-$labels['addcontact'] = 'Pievienot iezīmēto ierakstu adrešu grāmatai';
-$labels['editcontact'] = 'Rediģēt adrešu grāmatas ierakstu';
-$labels['edit'] = 'Rediģēt';
-$labels['cancel'] = 'Atcelt';
-$labels['save'] = 'Saglabāt';
-$labels['delete'] = 'Dzēst';
-$labels['newcontact'] = 'Izveidot jaunu ierakstu adrešu grāmatā';
-$labels['deletecontact'] = 'Dzēst iezīmētos ierakstus';
-$labels['composeto'] = 'Rakstīt vēstuli';
-$labels['contactsfromto'] = 'Ieraksti $from līdz $to no $count';
-$labels['print'] = 'Drukāt';
-$labels['export'] = 'Eksportēt';
-$labels['previouspage'] = 'Parādīt iepriekšējo kopu';
-$labels['firstpage'] = 'Parādīt pirmo kopu';
-$labels['nextpage'] = 'Parādīt nākamo kopu';
-$labels['lastpage'] = 'Parādīt pēdējo kopu';
-$labels['groups'] = 'Grupas';
-$labels['personaladrbook'] = 'Personīgās adreses';
-$labels['settingsfor'] = 'Iestatījumi';
-$labels['preferences'] = 'Preferences';
-$labels['userpreferences'] = 'Lietotāja preferences';
-$labels['editpreferences'] = 'Rediģēt lietotāja preferences';
-$labels['identities'] = 'Identitātes';
-$labels['manageidentities'] = 'Rediģēt šī konta identitātes';
-$labels['newidentity'] = 'Jauna identitāte';
-$labels['newitem'] = 'Jauns';
-$labels['edititem'] = 'Rediģēt';
-$labels['setdefault'] = 'Uzlikt kā noklusēto';
-$labels['language'] = 'Valoda';
-$labels['timezone'] = 'Laika zona';
-$labels['pagesize'] = 'Rindas lapā';
-$labels['signature'] = 'Paraksts';
-$labels['dstactive'] = 'Vasaras/ziemas laiks';
-$labels['htmleditor'] = 'Rakstīt HTML vēstules';
-$labels['htmlsignature'] = 'HTML paraksts';
-$labels['previewpane'] = 'Rādīt priekšskatījuma paneli';
-$labels['autosavedraft'] = 'Automātiski saglabāt uzmetumu';
-$labels['everynminutes'] = 'katras $n minūtes';
-$labels['never'] = 'nekad';
-$labels['folder'] = 'Mape';
-$labels['folders'] = 'Mapes';
-$labels['foldername'] = 'Mapes nosaukums';
-$labels['subscribed'] = 'Abonētās';
-$labels['messagecount'] = 'Vēstules';
-$labels['create'] = 'Izveidot';
-$labels['createfolder'] = 'Izveidot jaunu mapi';
-$labels['rename'] = 'Pārsaukt';
-$labels['renamefolder'] = 'Pārsaukt mapi';
-$labels['deletefolder'] = 'Dzēst mapi';
-$labels['managefolders'] = 'Rediģēt mapes';
-$labels['sortby'] = 'Kārtot pēc';
-$labels['sortasc'] = 'Kārtot augošā secībā';
-$labels['sortdesc'] = 'Kārtot dilstošā secībā';
-
-?>
\ No newline at end of file
diff --git a/program/localization/lv/messages.inc b/program/localization/lv/messages.inc
deleted file mode 100644 (file)
index 7ba47ed..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/lv/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Rudolfs Osins <dev.random@gmail.com>                          |
- |         Mikelis Zalais <mik@prog.lv>                                  |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1093 2008-02-16 11:40:18Z tomekp $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Neizdevās pieslēgties';
-$messages['cookiesdisabled'] = 'Jūsu pārlūkprogramma neatbalsta sīkdatnes (cookies)';
-$messages['sessionerror'] = 'Jūsu sessija ir beigusies';
-$messages['imaperror'] = 'Neizdevās pieslēgties IMAP serverim';
-$messages['nomessagesfound'] = 'Šajā pastkastē nav vēstuļu';
-$messages['loggedout'] = 'Jūs esat veiksmīgi atslēdzies';
-$messages['mailboxempty'] = 'Pastkaste tukša';
-$messages['loading'] = 'Notiek ielāde...';
-$messages['loadingdata'] = 'Tiek ielādēti dati...';
-$messages['checkingmail'] = 'Notiek pasta pārbaude...';
-$messages['sendingmessage'] = 'Tiek sūtīta vēstule...';
-$messages['messagesent'] = 'Vēstule nosūtīta veiksmīgi';
-$messages['savingmessage'] = 'Vēstule tiek saglabāta...';
-$messages['messagesaved'] = 'Vēstule saglabāta pie uzmetumiem';
-$messages['successfullysaved'] = 'Saglabāts veiksmīgi';
-$messages['addedsuccessfully'] = 'Ieraksts veiksmīgi pievienots adrešu grāmatai';
-$messages['contactexists'] = 'Ieraksts ar šādu e-pasta adresi jau eksistē';
-$messages['blockedimages'] = 'Drošības nolūkos attēli, kas tiek ielādēti no cita servera, šajā vēstulē ir bloķēti';
-$messages['encryptedmessage'] = 'Šī ir šifrēta vēstule un diemžēl nevar tikt parādīta';
-$messages['nocontactsfound'] = 'Ieraksti netika atrasti';
-$messages['contactnotfound'] = 'Prasītais kontakts nav atrasts';
-$messages['sendingfailed'] = 'Vēstule netika nosūtīta';
-$messages['errorsaving'] = 'Saglabājot vēstuli notikusi kļūme, vēstule netika saglabāta';
-$messages['errormoving'] = 'Vēstule netika pārvietota';
-$messages['errordeleting'] = 'Vēstule netika dzēsta';
-$messages['deletecontactconfirm'] = 'Vai tiešām vēlaties dzēst iezīmēto(ās) kontaktpersonas?';
-$messages['deletemessagesconfirm'] = 'Vai tiešām vēlaties dzēst iezīmēto(ās) vēstules?';
-$messages['deletefolderconfirm'] = 'Vai tiešām vēlaties dzēst šo mapi?';
-$messages['purgefolderconfirm'] = 'Vai tiešām vēlaties dzēst visas vēstules, kas atrodas šajā mapē?';
-$messages['formincomplete'] = 'Formulārs nav pilnībā aizpildīts';
-$messages['noemailwarning'] = 'Lūdzu ievadiet pareizu e-pasta adresi';
-$messages['nonamewarning'] = 'Lūdzu ievadiet vārdu';
-$messages['nopagesizewarning'] = 'Lūdzu ievadiet lapas izmēru';
-$messages['norecipientwarning'] = 'Lūdzu ievadiet vismaz vienu saņēmēju';
-$messages['nosubjectwarning'] = 'Lauks "temats" ir tukšs. Vai vēlaties to aizpildīt tagad?';
-$messages['nobodywarning'] = 'Sūtīt vēstuli bez satura teksta?';
-$messages['notsentwarning'] = 'Vēstule netika nosūtīta. Vai vēlaties atmest savu vēstuli?';
-$messages['noldapserver'] = 'Lūdzu izvēlaties LDAP serveri';
-$messages['nocontactsreturned'] = 'Neviena kontaktpersona netika atrasta';
-$messages['nosearchname'] = 'Lūdzu ievadiet kontaktpersonas vārdu vai e-pasta adresi';
-$messages['searchsuccessful'] = 'Atrastas $nr vēstules';
-$messages['searchnomatch'] = 'Meklēšanā nekas netika atrasts';
-$messages['searching'] = 'Notiek meklēšana...';
-$messages['checking'] = 'Notiek pārbaude...';
-$messages['nospellerrors'] = 'Netika atrastas pareizrakstības kļudas';
-$messages['folderdeleted'] = 'Mape veiksmīgi izdzēsta';
-$messages['deletedsuccessfully'] = 'Veiksmīgi izdzēsts';
-$messages['converting'] = 'Tiek novākts vēstules formatējums...';
-$messages['messageopenerror'] = 'Nevarēja ielādēt vēstuli no servera';
-$messages['fileuploaderror'] = 'Neizdevās ielādēt failu';
-$messages['filesizeerror'] = 'Ielādētais fails pārsniedz pieļaujamo $size apjomu';
-$messages['copysuccess'] = 'Veiksmīgi nokopētas $nr vēstules';
-$messages['copyerror'] = 'Nevarēja nokopēt nevienu adresi';
-$messages['sourceisreadonly'] = 'Adreses avots ir lasīšanas režīmā tikai';
-$messages['errorsavingcontact'] = 'Nevarēja saglabāt kontakta adreses';
-$messages['movingmessage'] = 'Pārvietoju vēstules...';
-$messages['receiptsent'] = 'Saņemšanas apstiprinājums nosūtīts';
-$messages['errorsendingreceipt'] = 'Neizdevās nosūtīt apstiprinājumu';
-$messages['nodeletelastidentity'] = 'Šo identitāti nevar izdzēst, tā ir pati pēdējā.';
-$messages['addsubfolderhint'] = 'Šis folderis tiks izveidots kā apakšfolderis tam, kurš patreiz ir izvēlēts';
-
-?>
\ No newline at end of file
diff --git a/program/localization/lv_LV/labels.inc b/program/localization/lv_LV/labels.inc
new file mode 100644 (file)
index 0000000..0d2f591
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/lv/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Rudolfs Osins <dev.random@gmail.com>                          |
+ |         Mikelis Zalais <mik@prog.lv>                                  |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1093 2008-02-16 11:40:18Z tomekp $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Esiet laipni lūgti $product';
+$labels['username'] = 'Lietotājvārds';
+$labels['password'] = 'Parole';
+$labels['server'] = 'Serveris';
+$labels['login'] = 'Pieslēgties';
+$labels['logout'] = 'Atslēgties';
+$labels['mail'] = 'E-pasts';
+$labels['settings'] = 'Personīgie iestatījumi';
+$labels['addressbook'] = 'Adrešu grāmata';
+$labels['inbox'] = 'Ienākošās';
+$labels['drafts'] = 'Uzmetumi';
+$labels['sent'] = 'Nosūtītās';
+$labels['trash'] = 'Miskaste';
+$labels['junk'] = 'Mēstules';
+$labels['subject'] = 'Temats';
+$labels['from'] = 'No';
+$labels['to'] = 'Kam';
+$labels['cc'] = 'Kopija';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Atbildēt uz';
+$labels['date'] = 'Datums';
+$labels['size'] = 'Izmērs';
+$labels['priority'] = 'Prioritāte';
+$labels['organization'] = 'Organizācija';
+$labels['reply-to'] = 'Atbildēt uz';
+$labels['mailboxlist'] = 'Mapes';
+$labels['messagesfromto'] = 'Vēstules $from līdz $to no $count';
+$labels['messagenrof'] = '$nr. vēstule  no $count';
+$labels['moveto'] = 'pārvietot uz...';
+$labels['download'] = 'lejupielādēt';
+$labels['filename'] = 'Faila nosaukums';
+$labels['filesize'] = 'Faila izmērs';
+$labels['preferhtml'] = 'Dot priekšroku HTML';
+$labels['htmlmessage'] = 'HTML vēstule';
+$labels['prettydate'] = '"Skaists" datums';
+$labels['addtoaddressbook'] = 'Pievienot adrešu grāmatai';
+$labels['sun'] = 'Sv';
+$labels['mon'] = 'P';
+$labels['tue'] = 'O';
+$labels['wed'] = 'T';
+$labels['thu'] = 'C';
+$labels['fri'] = 'P';
+$labels['sat'] = 'Se';
+$labels['sunday'] = 'Svētdiena';
+$labels['monday'] = 'Pirmdiena';
+$labels['tuesday'] = 'Otrdiena';
+$labels['wednesday'] = 'Trešdiena';
+$labels['thursday'] = 'Ceturtdiena';
+$labels['friday'] = 'Piektdiena';
+$labels['saturday'] = 'Sestdiena';
+$labels['today'] = 'Šodien';
+$labels['checkmail'] = 'Pārbaudīt pastu';
+$labels['writenewmessage'] = 'Rakstīt jaunu vēstuli';
+$labels['replytomessage'] = 'Atbildēt uz vēstuli';
+$labels['replytoallmessage'] = 'Atbildēt sūtītājam un visiem saņēmējiem';
+$labels['forwardmessage'] = 'Pārsūtīt vēstuli';
+$labels['deletemessage'] = 'Dzēst vēstuli';
+$labels['movemessagetotrash'] = 'Pārvietot vēstuli uz miskasti';
+$labels['printmessage'] = 'Izdrukāt šo vēstuli';
+$labels['previousmessage'] = 'Parādīt iepriekšējo vēstuli';
+$labels['previousmessages'] = 'Parādīt iepriekšējo vēstuļu kopu';
+$labels['firstmessage'] = 'Parādīt pirmo vēstuli';
+$labels['firstmessages'] = 'Parādīt pirmo vēstuļu kopu';
+$labels['nextmessage'] = 'Parādīt nākamo vēstuli';
+$labels['nextmessages'] = 'Parādīt nākamo vēstuļu kopu';
+$labels['lastmessage'] = 'Parādīt pēdējo vēstuli';
+$labels['lastmessages'] = 'Parādīt pēdējo vēstuļu kopu';
+$labels['backtolist'] = 'Atpakaļ uz vēstuļu sarakstu';
+$labels['viewsource'] = 'Rādīt pirmtekstu';
+$labels['markmessages'] = 'Atzīmēt vēstules';
+$labels['markread'] = 'Kā lasītas';
+$labels['markunread'] = 'Kā nelasītas';
+$labels['select'] = 'Iezīmēt';
+$labels['all'] = 'Visas';
+$labels['none'] = 'Nevienu';
+$labels['unread'] = 'Nelasītās';
+$labels['compact'] = 'Saspiest';
+$labels['empty'] = 'Iztukšot';
+$labels['purge'] = 'Iztīrīt';
+$labels['quota'] = 'Kvota';
+$labels['unknown'] = 'nezināms';
+$labels['unlimited'] = 'neierobežots';
+$labels['quicksearch'] = 'Ārtā meklēšana';
+$labels['resetsearch'] = 'Atstatīt meklēšanu';
+$labels['compose'] = 'Rakstīt vēstuli';
+$labels['savemessage'] = 'Saglabāt uzmetumu';
+$labels['sendmessage'] = 'Sūtīt vēstuli';
+$labels['addattachment'] = 'Pievienot failu';
+$labels['charset'] = 'Rakstzīmju kopa';
+$labels['editortype'] = 'Redaktora tips';
+$labels['returnreceipt'] = 'Saņemšanas apstiprinājums';
+$labels['checkspelling'] = 'Pārbaudīt pareizrakstību';
+$labels['resumeediting'] = 'Turpināt rediģēšanu';
+$labels['revertto'] = 'Atgriezt uz';
+$labels['attachments'] = 'Pielikumi';
+$labels['upload'] = 'Augšupielādēt';
+$labels['close'] = 'Aizvērt';
+$labels['low'] = 'Zema';
+$labels['lowest'] = 'Zemākā';
+$labels['normal'] = 'Normāla';
+$labels['high'] = 'Augsta';
+$labels['highest'] = 'Augstākā';
+$labels['nosubject'] = '(no subject)';
+$labels['showimages'] = 'Rādīt attēlus';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Vienkāršs teksts';
+$labels['addcc'] = 'Pievienot Cc';
+$labels['addbcc'] = 'Pievienot Bcc';
+$labels['addreplyto'] = 'Pievienot Reply-To';
+$labels['mdnrequest'] = 'Šīs vēstules sūtītājs vēlas redzēt vēstules saņemšanas apstiprinājumu. Vai jūs vēlaties nosūtīt apstiprinājumu?';
+$labels['receiptread'] = 'Saņemšanas apstiprinājums';
+$labels['yourmessage'] = 'Šīs ir jūsu vēstules saņemšanas apstiprinājums';
+$labels['receiptnote'] = 'Piezīme: Šīs apsiprinājums nozīmē tikai to, ka vēstule tika parādīta uz saņēmāja datora. Tas nenozīmē, ka saņēmējs ir izlasījis vai izpratis vēstules saturu.';
+$labels['name'] = 'Uzrādītais vārds';
+$labels['firstname'] = 'Vārds';
+$labels['surname'] = 'Uzvārds';
+$labels['email'] = 'E-pasts';
+$labels['addcontact'] = 'Pievienot iezīmēto ierakstu adrešu grāmatai';
+$labels['editcontact'] = 'Rediģēt adrešu grāmatas ierakstu';
+$labels['edit'] = 'Rediģēt';
+$labels['cancel'] = 'Atcelt';
+$labels['save'] = 'Saglabāt';
+$labels['delete'] = 'Dzēst';
+$labels['newcontact'] = 'Izveidot jaunu ierakstu adrešu grāmatā';
+$labels['deletecontact'] = 'Dzēst iezīmētos ierakstus';
+$labels['composeto'] = 'Rakstīt vēstuli';
+$labels['contactsfromto'] = 'Ieraksti $from līdz $to no $count';
+$labels['print'] = 'Drukāt';
+$labels['export'] = 'Eksportēt';
+$labels['previouspage'] = 'Parādīt iepriekšējo kopu';
+$labels['firstpage'] = 'Parādīt pirmo kopu';
+$labels['nextpage'] = 'Parādīt nākamo kopu';
+$labels['lastpage'] = 'Parādīt pēdējo kopu';
+$labels['groups'] = 'Grupas';
+$labels['personaladrbook'] = 'Personīgās adreses';
+$labels['settingsfor'] = 'Iestatījumi';
+$labels['preferences'] = 'Preferences';
+$labels['userpreferences'] = 'Lietotāja preferences';
+$labels['editpreferences'] = 'Rediģēt lietotāja preferences';
+$labels['identities'] = 'Identitātes';
+$labels['manageidentities'] = 'Rediģēt šī konta identitātes';
+$labels['newidentity'] = 'Jauna identitāte';
+$labels['newitem'] = 'Jauns';
+$labels['edititem'] = 'Rediģēt';
+$labels['setdefault'] = 'Uzlikt kā noklusēto';
+$labels['language'] = 'Valoda';
+$labels['timezone'] = 'Laika zona';
+$labels['pagesize'] = 'Rindas lapā';
+$labels['signature'] = 'Paraksts';
+$labels['dstactive'] = 'Vasaras/ziemas laiks';
+$labels['htmleditor'] = 'Rakstīt HTML vēstules';
+$labels['htmlsignature'] = 'HTML paraksts';
+$labels['previewpane'] = 'Rādīt priekšskatījuma paneli';
+$labels['autosavedraft'] = 'Automātiski saglabāt uzmetumu';
+$labels['everynminutes'] = 'katras $n minūtes';
+$labels['never'] = 'nekad';
+$labels['folder'] = 'Mape';
+$labels['folders'] = 'Mapes';
+$labels['foldername'] = 'Mapes nosaukums';
+$labels['subscribed'] = 'Abonētās';
+$labels['messagecount'] = 'Vēstules';
+$labels['create'] = 'Izveidot';
+$labels['createfolder'] = 'Izveidot jaunu mapi';
+$labels['rename'] = 'Pārsaukt';
+$labels['renamefolder'] = 'Pārsaukt mapi';
+$labels['deletefolder'] = 'Dzēst mapi';
+$labels['managefolders'] = 'Rediģēt mapes';
+$labels['sortby'] = 'Kārtot pēc';
+$labels['sortasc'] = 'Kārtot augošā secībā';
+$labels['sortdesc'] = 'Kārtot dilstošā secībā';
+
+?>
\ No newline at end of file
diff --git a/program/localization/lv_LV/messages.inc b/program/localization/lv_LV/messages.inc
new file mode 100644 (file)
index 0000000..7ba47ed
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/lv/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Rudolfs Osins <dev.random@gmail.com>                          |
+ |         Mikelis Zalais <mik@prog.lv>                                  |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1093 2008-02-16 11:40:18Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Neizdevās pieslēgties';
+$messages['cookiesdisabled'] = 'Jūsu pārlūkprogramma neatbalsta sīkdatnes (cookies)';
+$messages['sessionerror'] = 'Jūsu sessija ir beigusies';
+$messages['imaperror'] = 'Neizdevās pieslēgties IMAP serverim';
+$messages['nomessagesfound'] = 'Šajā pastkastē nav vēstuļu';
+$messages['loggedout'] = 'Jūs esat veiksmīgi atslēdzies';
+$messages['mailboxempty'] = 'Pastkaste tukša';
+$messages['loading'] = 'Notiek ielāde...';
+$messages['loadingdata'] = 'Tiek ielādēti dati...';
+$messages['checkingmail'] = 'Notiek pasta pārbaude...';
+$messages['sendingmessage'] = 'Tiek sūtīta vēstule...';
+$messages['messagesent'] = 'Vēstule nosūtīta veiksmīgi';
+$messages['savingmessage'] = 'Vēstule tiek saglabāta...';
+$messages['messagesaved'] = 'Vēstule saglabāta pie uzmetumiem';
+$messages['successfullysaved'] = 'Saglabāts veiksmīgi';
+$messages['addedsuccessfully'] = 'Ieraksts veiksmīgi pievienots adrešu grāmatai';
+$messages['contactexists'] = 'Ieraksts ar šādu e-pasta adresi jau eksistē';
+$messages['blockedimages'] = 'Drošības nolūkos attēli, kas tiek ielādēti no cita servera, šajā vēstulē ir bloķēti';
+$messages['encryptedmessage'] = 'Šī ir šifrēta vēstule un diemžēl nevar tikt parādīta';
+$messages['nocontactsfound'] = 'Ieraksti netika atrasti';
+$messages['contactnotfound'] = 'Prasītais kontakts nav atrasts';
+$messages['sendingfailed'] = 'Vēstule netika nosūtīta';
+$messages['errorsaving'] = 'Saglabājot vēstuli notikusi kļūme, vēstule netika saglabāta';
+$messages['errormoving'] = 'Vēstule netika pārvietota';
+$messages['errordeleting'] = 'Vēstule netika dzēsta';
+$messages['deletecontactconfirm'] = 'Vai tiešām vēlaties dzēst iezīmēto(ās) kontaktpersonas?';
+$messages['deletemessagesconfirm'] = 'Vai tiešām vēlaties dzēst iezīmēto(ās) vēstules?';
+$messages['deletefolderconfirm'] = 'Vai tiešām vēlaties dzēst šo mapi?';
+$messages['purgefolderconfirm'] = 'Vai tiešām vēlaties dzēst visas vēstules, kas atrodas šajā mapē?';
+$messages['formincomplete'] = 'Formulārs nav pilnībā aizpildīts';
+$messages['noemailwarning'] = 'Lūdzu ievadiet pareizu e-pasta adresi';
+$messages['nonamewarning'] = 'Lūdzu ievadiet vārdu';
+$messages['nopagesizewarning'] = 'Lūdzu ievadiet lapas izmēru';
+$messages['norecipientwarning'] = 'Lūdzu ievadiet vismaz vienu saņēmēju';
+$messages['nosubjectwarning'] = 'Lauks "temats" ir tukšs. Vai vēlaties to aizpildīt tagad?';
+$messages['nobodywarning'] = 'Sūtīt vēstuli bez satura teksta?';
+$messages['notsentwarning'] = 'Vēstule netika nosūtīta. Vai vēlaties atmest savu vēstuli?';
+$messages['noldapserver'] = 'Lūdzu izvēlaties LDAP serveri';
+$messages['nocontactsreturned'] = 'Neviena kontaktpersona netika atrasta';
+$messages['nosearchname'] = 'Lūdzu ievadiet kontaktpersonas vārdu vai e-pasta adresi';
+$messages['searchsuccessful'] = 'Atrastas $nr vēstules';
+$messages['searchnomatch'] = 'Meklēšanā nekas netika atrasts';
+$messages['searching'] = 'Notiek meklēšana...';
+$messages['checking'] = 'Notiek pārbaude...';
+$messages['nospellerrors'] = 'Netika atrastas pareizrakstības kļudas';
+$messages['folderdeleted'] = 'Mape veiksmīgi izdzēsta';
+$messages['deletedsuccessfully'] = 'Veiksmīgi izdzēsts';
+$messages['converting'] = 'Tiek novākts vēstules formatējums...';
+$messages['messageopenerror'] = 'Nevarēja ielādēt vēstuli no servera';
+$messages['fileuploaderror'] = 'Neizdevās ielādēt failu';
+$messages['filesizeerror'] = 'Ielādētais fails pārsniedz pieļaujamo $size apjomu';
+$messages['copysuccess'] = 'Veiksmīgi nokopētas $nr vēstules';
+$messages['copyerror'] = 'Nevarēja nokopēt nevienu adresi';
+$messages['sourceisreadonly'] = 'Adreses avots ir lasīšanas režīmā tikai';
+$messages['errorsavingcontact'] = 'Nevarēja saglabāt kontakta adreses';
+$messages['movingmessage'] = 'Pārvietoju vēstules...';
+$messages['receiptsent'] = 'Saņemšanas apstiprinājums nosūtīts';
+$messages['errorsendingreceipt'] = 'Neizdevās nosūtīt apstiprinājumu';
+$messages['nodeletelastidentity'] = 'Šo identitāti nevar izdzēst, tā ir pati pēdējā.';
+$messages['addsubfolderhint'] = 'Šis folderis tiks izveidots kā apakšfolderis tam, kurš patreiz ir izvēlēts';
+
+?>
\ No newline at end of file
diff --git a/program/localization/mk/labels.inc b/program/localization/mk/labels.inc
deleted file mode 100755 (executable)
index 40e2b1a..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | language/mk/labels.inc                                                |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author:  Ivan Mishev - mishevivan@gmail.com                           |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\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'] = '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'] = '$count пораки од $from';\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['markmessages'] = 'Обележи ги пораките';\r
-$labels['markread'] = 'Како прочитани';\r
-$labels['markunread'] = 'Како непрочитани';\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'] = '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'] = 'Додај Cc';\r
-$labels['addbcc'] = 'Додај Bcc';\r
-$labels['addreplyto'] = 'Додај Одговори-На';\r
-$labels['mdnrequest'] = 'Праќачот на оваа порака сака да добие известување кога ќе ја прочитате пораката. Дали сакате да го известите?';\r
-$labels['receiptread'] = 'Извести (читај)';\r
-$labels['yourmessage'] = 'Ова е известување за вашата порака';\r
-$labels['receiptnote'] = 'Забелешка: Ова известување само потврдува дека пораката која сте ја пратиле е отворена. Не е гаранција дека примачот ја прочитал или ја разбрал истата.';\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'] = '$count имиња $from до $to';\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['messagecount'] = 'Пораки';\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
-?>
\ No newline at end of file
diff --git a/program/localization/mk/messages.inc b/program/localization/mk/messages.inc
deleted file mode 100755 (executable)
index 15b6645..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | language/mk/messages.inc                                              |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author:  Ivan Mishev - mishevivan@gmail.com                           |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed'] = 'Неуспешна најава';\r
-$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа cookies';\r
-$messages['sessionerror'] = 'Сесијата е невалидна или е истечена';\r
-$messages['imaperror'] = 'Конектирањето со IMAP е неуспешно';\r
-$messages['nomessagesfound'] = 'Немате пораки во вашата пошта';\r
-$messages['loggedout'] = 'Успешно се одлогиравте. Благодариме!';\r
-$messages['mailboxempty'] = 'Поштенското сандаче е празно.';\r
-$messages['loading'] = 'Вчитувам...';\r
-$messages['loadingdata'] = 'Ги вчитувам податоците...';\r
-$messages['checkingmail'] = 'Проверување за нови пораки...';\r
-$messages['sendingmessage'] = 'Праќање на пораката...';\r
-$messages['messagesent'] = 'Пораката е успешно пратена';\r
-$messages['savingmessage'] = 'Пораката се снима...';\r
-$messages['messagesaved'] = 'Пораката е снимена во Непратени';\r
-$messages['successfullysaved'] = 'Успешно снимено';\r
-$messages['addedsuccessfully'] = 'Името е успешно додадено ви Именик';\r
-$messages['contactexists'] = 'Веќе постои име со зададената Е-маил адреса';\r
-$messages['blockedimages'] = 'За да се заштити вашата приватност, сликите во оваа порака не се прикажани.';\r
-$messages['encryptedmessage'] = 'Оваа порака е кодирана и неможе да се прикаже. Извинете!';\r
-$messages['nocontactsfound'] = 'Нема Имиња во Именикот.';\r
-$messages['contactnotfound'] = 'Бараното име не постои';\r
-$messages['sendingfailed'] = 'Пораката не е пратена';\r
-$messages['errorsaving'] = 'Грешка при снимањето';\r
-$messages['errormoving'] = 'Пораката неможе да се премести';\r
-$messages['errordeleting'] = 'Пораката неможе да се избрише';\r
-$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) контакт(и)?';\r
-$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) порака(и)?';\r
-$messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';\r
-$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите пораки во оваа папка?';\r
-$messages['formincomplete'] = 'Имате изоставено непополнети информации';\r
-$messages['noemailwarning'] = 'Внесете валидна емаил адреса';\r
-$messages['nonamewarning'] = 'Внесете име';\r
-$messages['nopagesizewarning'] = 'Внесете ја големината на страната';\r
-$messages['norecipientwarning'] = 'Внесете барем еден примач';\r
-$messages['nosubjectwarning'] = 'Немате внесено „Наслов“. Дали сакате да внесете?';\r
-$messages['nobodywarning'] = 'Пораката нема текст во неа. Дали сакате да ја пратите?';\r
-$messages['notsentwarning'] = 'Пораката не е пратена. Дали сакате да ја откажете?';\r
-$messages['noldapserver'] = 'Изберете LDAP сервер за пребарување';\r
-$messages['nocontactsreturned'] = 'Не се најдени имиња';\r
-$messages['nosearchname'] = 'Внесете име или емаил адреса';\r
-$messages['searchsuccessful'] = '$nr пораки се најдени';\r
-$messages['searchnomatch'] = 'Претражувањето нема резлутати';\r
-$messages['searching'] = 'Пребарувам....';\r
-$messages['checking'] = 'Проверувам...';\r
-$messages['nospellerrors'] = 'Нема грешки во спелувањето';\r
-$messages['folderdeleted'] = 'Папката е успешно избришана';\r
-$messages['deletedsuccessfully'] = 'Успешно избришано';\r
-$messages['converting'] = 'Форматирањето на пораката е отстрането...';\r
-$messages['messageopenerror'] = 'Пораката неможе да се вчита од серверот';\r
-$messages['fileuploaderror'] = 'Прикачувањето е неуспешно';\r
-$messages['filesizeerror'] = 'Датотеката што се прикачува го изминува лимитот од $size';\r
-$messages['copysuccess'] = 'Успешно се копирани $nr имиња';\r
-$messages['copyerror'] = 'Неможе да се копираат адресите';\r
-$messages['sourceisreadonly'] = 'Изворот на оваа адреса неможе да се промени';\r
-$messages['errorsavingcontact'] = 'Името неможе да се сними';\r
-$messages['movingmessage'] = 'Пораката се преместува...';\r
-$messages['receiptsent'] = 'Известувањето е успешно пратено';\r
-$messages['errorsendingreceipt'] = 'Известувањето не е пратено';\r
-$messages['nodeletelastidentity'] = 'Овој идентитет неможе да се избрише, тој е последниот.';\r
-$messages['addsubfolderhint'] = 'Оваа папка ќе биде креирана како под-папка на селектираната.';\r
-\r
-?>
\ No newline at end of file
diff --git a/program/localization/mk_MK/labels.inc b/program/localization/mk_MK/labels.inc
new file mode 100755 (executable)
index 0000000..40e2b1a
--- /dev/null
@@ -0,0 +1,191 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/mk/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author:  Ivan Mishev - mishevivan@gmail.com                           |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\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'] = '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'] = '$count пораки од $from';\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['markmessages'] = 'Обележи ги пораките';\r
+$labels['markread'] = 'Како прочитани';\r
+$labels['markunread'] = 'Како непрочитани';\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'] = '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'] = 'Додај Cc';\r
+$labels['addbcc'] = 'Додај Bcc';\r
+$labels['addreplyto'] = 'Додај Одговори-На';\r
+$labels['mdnrequest'] = 'Праќачот на оваа порака сака да добие известување кога ќе ја прочитате пораката. Дали сакате да го известите?';\r
+$labels['receiptread'] = 'Извести (читај)';\r
+$labels['yourmessage'] = 'Ова е известување за вашата порака';\r
+$labels['receiptnote'] = 'Забелешка: Ова известување само потврдува дека пораката која сте ја пратиле е отворена. Не е гаранција дека примачот ја прочитал или ја разбрал истата.';\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'] = '$count имиња $from до $to';\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['messagecount'] = 'Пораки';\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
+?>
\ No newline at end of file
diff --git a/program/localization/mk_MK/messages.inc b/program/localization/mk_MK/messages.inc
new file mode 100755 (executable)
index 0000000..15b6645
--- /dev/null
@@ -0,0 +1,81 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/mk/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author:  Ivan Mishev - mishevivan@gmail.com                           |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'Неуспешна најава';\r
+$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа cookies';\r
+$messages['sessionerror'] = 'Сесијата е невалидна или е истечена';\r
+$messages['imaperror'] = 'Конектирањето со IMAP е неуспешно';\r
+$messages['nomessagesfound'] = 'Немате пораки во вашата пошта';\r
+$messages['loggedout'] = 'Успешно се одлогиравте. Благодариме!';\r
+$messages['mailboxempty'] = 'Поштенското сандаче е празно.';\r
+$messages['loading'] = 'Вчитувам...';\r
+$messages['loadingdata'] = 'Ги вчитувам податоците...';\r
+$messages['checkingmail'] = 'Проверување за нови пораки...';\r
+$messages['sendingmessage'] = 'Праќање на пораката...';\r
+$messages['messagesent'] = 'Пораката е успешно пратена';\r
+$messages['savingmessage'] = 'Пораката се снима...';\r
+$messages['messagesaved'] = 'Пораката е снимена во Непратени';\r
+$messages['successfullysaved'] = 'Успешно снимено';\r
+$messages['addedsuccessfully'] = 'Името е успешно додадено ви Именик';\r
+$messages['contactexists'] = 'Веќе постои име со зададената Е-маил адреса';\r
+$messages['blockedimages'] = 'За да се заштити вашата приватност, сликите во оваа порака не се прикажани.';\r
+$messages['encryptedmessage'] = 'Оваа порака е кодирана и неможе да се прикаже. Извинете!';\r
+$messages['nocontactsfound'] = 'Нема Имиња во Именикот.';\r
+$messages['contactnotfound'] = 'Бараното име не постои';\r
+$messages['sendingfailed'] = 'Пораката не е пратена';\r
+$messages['errorsaving'] = 'Грешка при снимањето';\r
+$messages['errormoving'] = 'Пораката неможе да се премести';\r
+$messages['errordeleting'] = 'Пораката неможе да се избрише';\r
+$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) контакт(и)?';\r
+$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) порака(и)?';\r
+$messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';\r
+$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите пораки во оваа папка?';\r
+$messages['formincomplete'] = 'Имате изоставено непополнети информации';\r
+$messages['noemailwarning'] = 'Внесете валидна емаил адреса';\r
+$messages['nonamewarning'] = 'Внесете име';\r
+$messages['nopagesizewarning'] = 'Внесете ја големината на страната';\r
+$messages['norecipientwarning'] = 'Внесете барем еден примач';\r
+$messages['nosubjectwarning'] = 'Немате внесено „Наслов“. Дали сакате да внесете?';\r
+$messages['nobodywarning'] = 'Пораката нема текст во неа. Дали сакате да ја пратите?';\r
+$messages['notsentwarning'] = 'Пораката не е пратена. Дали сакате да ја откажете?';\r
+$messages['noldapserver'] = 'Изберете LDAP сервер за пребарување';\r
+$messages['nocontactsreturned'] = 'Не се најдени имиња';\r
+$messages['nosearchname'] = 'Внесете име или емаил адреса';\r
+$messages['searchsuccessful'] = '$nr пораки се најдени';\r
+$messages['searchnomatch'] = 'Претражувањето нема резлутати';\r
+$messages['searching'] = 'Пребарувам....';\r
+$messages['checking'] = 'Проверувам...';\r
+$messages['nospellerrors'] = 'Нема грешки во спелувањето';\r
+$messages['folderdeleted'] = 'Папката е успешно избришана';\r
+$messages['deletedsuccessfully'] = 'Успешно избришано';\r
+$messages['converting'] = 'Форматирањето на пораката е отстрането...';\r
+$messages['messageopenerror'] = 'Пораката неможе да се вчита од серверот';\r
+$messages['fileuploaderror'] = 'Прикачувањето е неуспешно';\r
+$messages['filesizeerror'] = 'Датотеката што се прикачува го изминува лимитот од $size';\r
+$messages['copysuccess'] = 'Успешно се копирани $nr имиња';\r
+$messages['copyerror'] = 'Неможе да се копираат адресите';\r
+$messages['sourceisreadonly'] = 'Изворот на оваа адреса неможе да се промени';\r
+$messages['errorsavingcontact'] = 'Името неможе да се сними';\r
+$messages['movingmessage'] = 'Пораката се преместува...';\r
+$messages['receiptsent'] = 'Известувањето е успешно пратено';\r
+$messages['errorsendingreceipt'] = 'Известувањето не е пратено';\r
+$messages['nodeletelastidentity'] = 'Овој идентитет неможе да се избрише, тој е последниот.';\r
+$messages['addsubfolderhint'] = 'Оваа папка ќе биде креирана како под-папка на селектираната.';\r
+\r
+?>
\ No newline at end of file
index 6be01bc1fc0dcbf3016652c9a9eea50fc54e72d6..2515fff876c818d573a64f6af67d11100eed903d 100644 (file)
@@ -2,75 +2,58 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/ms_MY/labels.inc                                             |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, 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 $
++-----------------------------------------------------------------------+
+| language/ms_MY/labels.inc                                             |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Muhammad Zamri MS <myzamri@gmail.com>                        |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
 
 */
 
 $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['welcome'] = 'Selamat datang ke $product';
+$labels['username'] = 'Nama Pengguna';
+$labels['password'] = 'Kata Laluan';
+$labels['server'] = 'Pelayan';
+$labels['login'] = 'Log Masuk';
+$labels['logout'] = 'Log Keluar';
+$labels['mail'] = 'E-Mel';
 $labels['settings'] = 'Tetapan Peribadi';
 $labels['addressbook'] = 'Buku Alamat';
-
-// mailbox names
-$labels['inbox']  = 'Masuk';
+$labels['inbox'] = 'Masuk';
 $labels['drafts'] = 'Draf';
-$labels['sent']   = 'Keluar';
-$labels['trash']  = 'Sampah';
-$labels['junk']   = 'Remeh';
-
-// message listing
+$labels['sent'] = 'Keluar';
+$labels['trash'] = 'Sampah';
+$labels['junk'] = 'Remeh';
 $labels['subject'] = 'Subjek';
-$labels['from']    = 'Penghantar';
-$labels['to']      = 'Penerima';
-$labels['cc']      = 'Salinan';
-$labels['bcc']     = 'Bcc';
+$labels['from'] = 'Penghantar';
+$labels['to'] = 'Penerima';
+$labels['cc'] = 'Salinan';
+$labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Balas kepada';
-$labels['date']    = 'Tarikh';
-$labels['size']    = 'Saiz';
+$labels['date'] = 'Tarikh';
+$labels['size'] = 'Saiz';
 $labels['priority'] = 'Keutamaan';
 $labels['organization'] = 'Organisasi';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
+$labels['reply-to'] = 'Balas kepada';
 $labels['mailboxlist'] = 'Kabinet Fail';
 $labels['messagesfromto'] = 'Mesej $from ke $to dari $count';
 $labels['messagenrof'] = 'Mesej $nr dari $count';
-
-$labels['moveto']   = 'pindah ke...';
+$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';
@@ -78,155 +61,167 @@ $labels['wed'] = 'Rab';
 $labels['thu'] = 'Kha';
 $labels['fri'] = 'Jum';
 $labels['sat'] = 'Sab';
-
-// weekdays long
-$labels['sunday']    = 'Ahad';
-$labels['monday']    = 'Isnin';
-$labels['tuesday']   = 'Selasa';
+$labels['sunday'] = 'Ahad';
+$labels['monday'] = 'Isnin';
+$labels['tuesday'] = 'Selasa';
 $labels['wednesday'] = 'Rabu';
-$labels['thursday']  = 'Khamis';
-$labels['friday']    = 'Jumaat';
-$labels['saturday']  = 'Sabtu';
-
+$labels['thursday'] = 'Khamis';
+$labels['friday'] = 'Jumaat';
+$labels['saturday'] = 'Sabtu';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mac';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'Mei';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Ogo';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dis';
+$labels['longjan'] = 'Januari';
+$labels['longfeb'] = 'Februari';
+$labels['longmar'] = 'March';
+$labels['longapr'] = 'April';
+$labels['longmay'] = 'Mei';
+$labels['longjun'] = 'Jun';
+$labels['longjul'] = 'Julai';
+$labels['longaug'] = 'Ogos';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Oktober';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'Disember';
 $labels['today'] = 'Hari Ini';
-
-// toolbar buttons
-$labels['checkmail']        = 'Semak mesej baru';
-$labels['writenewmessage']  = 'Cipta mesej baru';
-$labels['replytomessage']   = 'Balas mesej';
+$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['forwardmessage'] = 'Marakan mesej';
+$labels['deletemessage'] = 'Pindah mesej ke sampah';
+$labels['movemessagetotrash'] = 'Pindah mesej ke Tong 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['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['markmessages'] = 'Tanda mesej';
+$labels['markread'] = 'dibaca';
+$labels['markunread'] = 'belum/tidak dibaca';
 $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['unknown'] = 'tidak dikenali';
+$labels['unlimited'] = 'tidak terhad';
+$labels['quicksearch'] = 'Carian pantas';
+$labels['resetsearch'] = 'Set semula carian';
+$labels['compose'] = 'Karang mesej';
+$labels['savemessage'] = 'Simpan draf ini';
+$labels['sendmessage'] = 'Hantar mesej sekarang';
+$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['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['close'] = 'Tutup';
+$labels['low'] = 'Rendah';
+$labels['lowest'] = 'Paling Rendah';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Tinggi';
 $labels['highest'] = 'Paling Tinggi';
-
-$labels['nosubject']  = '(tiada subjek)';
+$labels['nosubject'] = '(tiada subjek)';
 $labels['showimages'] = 'Papar imej';
-
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Teks kosong';
-
-
-// address boook
-$labels['name']      = 'Nama paparan';
+$labels['addcc'] = 'Tambah Cc';
+$labels['addbcc'] = 'Tambah Bcc';
+$labels['addreplyto'] = 'Tambah Reply-To';
+$labels['mdnrequest'] = 'Pengirim mesej ini mahu diberitahu apabila anda membaca mesej ini. Adakah anda ingin memberitahu pengirim?';
+$labels['receiptread'] = 'Balas Resip (dibaca)';
+$labels['yourmessage'] = 'Ini adalah Resip Balasan untuk mesej anda';
+$labels['receiptnote'] = 'Perhatian: Resip ini hanya untuk memberitahu yang mesej ini telah dipaparkan di komputer penerima. Tidak ada jaminan yang penerima telah membaca atau memahami kandungan mesej.';
+$labels['name'] = 'Nama paparan';
 $labels['firstname'] = 'Nama pertama';
-$labels['surname']   = 'Nama akhir';
-$labels['email']     = 'E-Mel';
-
+$labels['surname'] = 'Nama akhir';
+$labels['email'] = 'E-Mel';
 $labels['addcontact'] = 'Tambah kontek baru';
 $labels['editcontact'] = 'Ubahsuai Kontek';
-
-$labels['edit']   = 'Ubahsuai';
+$labels['edit'] = 'Ubahsuai';
 $labels['cancel'] = 'Batal';
-$labels['save']   = 'Simpan';
+$labels['save'] = 'Simpan';
 $labels['delete'] = 'Hapus';
-
-$labels['newcontact']     = 'Cipta kad kontek baru';
-$labels['deletecontact']  = 'Hapus kontek yang dipilih';
-$labels['composeto']      = 'Karang mel kepada';
+$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['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['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['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['logoutclear'] = 'Kosongkan Tong sampah ketika keluar';
+$labels['logoutcompact'] = 'Padatkan Inbox ketika keluar';
+$labels['uisettings'] = 'Antaramuka Pengguna';
+$labels['serversettings'] = 'Konfigurasi Pelayan';
+$labels['mailboxview'] = 'Pandangan kotak Mel';
+$labels['mdnrequests'] = 'Pemberitahuan Pengirim';
+$labels['askuser'] = 'Tanya pengguna';
+$labels['autosend'] = 'Hantar automatik';
+$labels['ignore'] = 'Biarkan';
+$labels['readwhendeleted'] = 'Tanda mesej sebagai dibaca ketika hapus';
+$labels['flagfordeletion'] = 'Tanda mesej untuk pembuangan (tidak delete terus)';
+$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['messagecount'] = 'Mesej-mesej';
+$labels['create'] = 'Cipta';
+$labels['createfolder'] = 'Cipta kabinet fail baru';
 $labels['rename'] = 'Namakan semula';
 $labels['renamefolder'] = 'Namakan semula kabinet fail';
-$labels['deletefolder']  = 'Hapus kabinet fail';
-$labels['managefolders']  = 'Urus kabinet fail';
-
+$labels['deletefolder'] = 'Hapus kabinet fail';
+$labels['managefolders'] = 'Urus kabinet fail';
 $labels['sortby'] = 'Susun dengan';
-$labels['sortasc']  = 'Susun menaik';
+$labels['sortasc'] = 'Susun menaik';
 $labels['sortdesc'] = 'Susun menurun';
 
 ?>
index d6c9fb1867f14d7064222b89d9bfee38fb866772..dfb9e18225ea035ad55e131d455ab833e9217994 100644 (file)
@@ -2,23 +2,23 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/ms_MY/messages.inc                                           |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/ms_MY/messages.inc                                           |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Muhammad Zamri MS <myzamri@gmail.com>                        |
++-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
+@version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
 
 */
 
 $messages = array();
-$messages['loginfailed']  = 'Log masuk gagal';
+$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';
@@ -39,21 +39,20 @@ $messages['blockedimages'] = 'Untuk melindungi kebesasan peribadi anda, imej jau
 $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['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['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['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['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';
@@ -65,15 +64,19 @@ $messages['searching'] = 'Mencari...';
 $messages['checking'] = 'Menyemak...';
 $messages['nospellerrors'] = 'Tiada kesalah ejaan dijumpai';
 $messages['folderdeleted'] = 'Kabinet fail berjaya dihapuskan';
-$messages['deletedsuccessfully'] = "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';
+$messages['movingmessage'] = 'Memindah mesej...';
+$messages['receiptsent'] = 'Berjaya menghantar resip bacaan';
+$messages['errorsendingreceipt'] = 'Tidak dapat menghantar resip';
+$messages['nodeletelastidentity'] = 'Anda tidak boleh membuang identiti ini, ia milik anda yang terakhir.';
+$messages['addsubfolderhint'] = 'Folder ini akan dibina sebagai subfolder kepada folder yang dipilih sekarang';
 
 ?>
index 8e1b07ec87ff1ea6c2172fe385aa96c9fcbd1eba..8449f390918d40ca25197a9e72fba08e7274b4c6 100644 (file)
@@ -14,7 +14,7 @@
  | Author: Tor Erik Linnerud - JKLM <tel@jklm.no>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1093 2008-02-16 11:40:18Z tomekp $
+ @version $Id: labels.inc 1335 2008-04-27 15:18:13Z alec $
 
 */
 
@@ -69,6 +69,30 @@ $labels['wednesday'] = 'Onsdag';
 $labels['thursday'] = 'Torsdag';
 $labels['friday'] = 'Fredag';
 $labels['saturday'] = 'Lørdag';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'Mai';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Des';
+$labels['longjan'] = 'Januar';
+$labels['longfeb'] = 'Februar';
+$labels['longmar'] = 'Marsj';
+$labels['longapr'] = 'April';
+$labels['longmay'] = 'Mai';
+$labels['longjun'] = 'Juni';
+$labels['longjul'] = 'Juli';
+$labels['longaug'] = 'August';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Oktober';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'Desember';
 $labels['today'] = 'I dag';
 $labels['checkmail'] = 'Sjekk for nye beskjeder';
 $labels['writenewmessage'] = 'Opprett en ny e-post';
@@ -172,6 +196,10 @@ $labels['dstactive'] = 'Sommertid';
 $labels['htmleditor'] = 'Bruk HTML-editor';
 $labels['htmlsignature'] = 'HTML-signatur';
 $labels['previewpane'] = 'Forhåndsvisning';
+$labels['logoutclear'] = 'Tøm søpel ved utlogging';
+$labels['logoutcompact'] = 'Kompakt innboksen ved utlogging';
+$labels['uisettings'] = 'Brukergrensesnitt';
+$labels['serversettings'] = 'Serverinnstillinger';
 $labels['autosavedraft'] = 'Autolagring av utkast';
 $labels['everynminutes'] = 'Hvert $n. minutt';
 $labels['never'] = 'Aldri';
diff --git a/program/localization/ne/labels.inc b/program/localization/ne/labels.inc
deleted file mode 100644 (file)
index 1b1e899..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | localization/ne/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
- | Nepali Translation by:                                                |\r
- | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |\r
- | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |\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['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['sendmessage'] = 'तुरुन्तै मेल पठाउनुहोस';\r
-$labels['savemessage'] = 'ड्राफ्ट जोगाउनुहोस';\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['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
-?>\r
diff --git a/program/localization/ne/messages.inc b/program/localization/ne/messages.inc
deleted file mode 100644 (file)
index bd28199..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | localization/ne/messages.inc                                          |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Nepali Translation by:                                                |\r
- | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |\r
- | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |\r
- +-----------------------------------------------------------------------+\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed'] = 'लागईन हुन पाएन';\r
-$messages['cookiesdisabled'] = 'तपाईको ब्राऊसरले कुकी स्वीकार गारिरहेको छैन';\r
-$messages['sessionerror'] = 'सत्र समाप्त वा अवैद्य';\r
-$messages['imaperror'] = 'सर्वर संग सम्पर्क हुन पाएन';\r
-$messages['nomessagesfound'] = 'यो मेलबक्स मा कुनै मेल छैन';\r
-$messages['loggedout'] = 'सत्र समाप्त । नमास्कार!';\r
-$messages['mailboxempty'] = 'मेल बक्स खाली छ';\r
-$messages['loading'] = 'लोड भईरहेको छ...';\r
-$messages['loadingdata'] = 'डाटा लोड भईरहेको छै...';\r
-$messages['checkingmail'] = 'नया मेलको खोजी भईरहेको छ...';\r
-$messages['sendingmessage'] = 'मेल पठाईदै रहेको छ...';\r
-$messages['messagesent'] = 'मेल सफल्तापूर्वक पठाईयो';\r
-$messages['savingmessage'] = 'मेल जोगाईदै छ...';\r
-$messages['messagesaved'] = 'मेल ड्राफ्ट फोल्डरमा जोगाईयो';\r
-$messages['successfullysaved'] = 'सफल्तापूर्वक जोगाईयो';\r
-$messages['addedsuccessfully'] = 'सम्पर्क पुस्तिकामा सफल्तापूर्वक सम्पर्क प्रविष्ट गारियो';\r
-$messages['contactexists'] = 'यो ई-मेल पहिलै लिईसकिएको छ';\r
-$messages['blockedimages'] = 'तपाईको प्राईवेसी को लागि तथा अन्य स्पामबाट बच्नकोलागि यो मेलमा चित्रहुरु देखाईएका छैनन्।';\r
-$messages['encryptedmessage'] = 'माफ गर्नुहोसे, यो मेल ईन्क्रिफ्ट गरिएको रूपमा छ, त्यसैले देखाउन सकिदैन!';\r
-$messages['nocontactsfound'] = 'कुनै सम्पर्क भेटिएन';\r
-$messages['contactnotfound'] = 'अनुरोध गारिएको सम्पर्क भेटिएन';\r
-$messages['sendingfailed'] = 'मेल पठाउन सकिएन';\r
-$messages['errorsaving'] = 'जोगाउदा-जोगाउदै गडबड भायो';\r
-$messages['errormoving'] = 'मेल सार्न सकिएन';\r
-$messages['errordeleting'] = 'मेल मेटाउन सकिएन';\r
-$messages['deletecontactconfirm'] = 'तापाईले छान्नुभएको सम्पर्कहरु, साँचै मेट्न चहानुहुन्छ?';\r
-$messages['deletemessagesconfirm'] = 'तापाईले छान्नु भएको मेलहरु, साँचै मेट्न चहानुहुन्छ?';\r
-$messages['deletefolderconfirm'] = 'तापाईले साँचै यो फोल्डर मेट्न चहानु हुन्छ?';\r
-$messages['purgefolderconfirm'] = 'तापाईले साँचै यो फोल्डरमा भएका सबै मेलहरु मेट्न चहानुहुन्छ?';\r
-$messages['formincomplete'] = 'फर्म पूर्ण रुपमा भरिएको छैन';\r
-$messages['noemailwarning'] = 'कृपया वैद्य ई-मेल भर्नुहोस';\r
-$messages['nonamewarning'] = 'कृपया नाम भर्नुहोस';\r
-$messages['nopagesizewarning'] = 'कृपया पन्नाको नाप भर्नुहोस';\r
-$messages['norecipientwarning'] = 'कृपया कम-से-कम एउटा प्रापकको विवरण भर्नुहोस';\r
-$messages['nosubjectwarning'] = 'मेलको कुनै विषय तोकिएको छैनै। केहि तोक्न चहानुहुन्छ ?';\r
-$messages['nobodywarning'] = 'बिना केहि लेखि पठाउने?';\r
-$messages['notsentwarning'] = 'मेल पठएको छैन.. मेल रद्द गर्न चहानुहुन्छ?';\r
-$messages['noldapserver'] = 'कृपया खोजको निम्ति एउटा ऐलडाप सर्वर छान्नहोस';\r
-$messages['nocontactsreturned'] = 'कुनै सम्पर्क फेला परेनन्';\r
-$messages['nosearchname'] = 'कृपया सम्पर्कको नाम या ई-मेल भर्नुहोस';\r
-$messages['searchsuccessful'] = '$nr मेलहरु पाइयो';\r
-$messages['searchnomatch'] = 'खोज असफल रहयो';\r
-$messages['searching'] = 'खोजि भईरहेको छ...';\r
-$messages['checking'] = 'जाँच भईरहेको छ...';\r
-$messages['nospellerrors'] = 'कुनै गलत हिज्जे फेला परेनन्';\r
-$messages['folderdeleted'] = 'फोल्डर सफल्तापूर्वक मेटियो';\r
-$messages['deletedsuccessfully'] = 'सफल्तापूर्वक मेटियो';\r
-$messages['converting'] = 'मेलबाट फोर्माटिङ हटाईदै छ...';\r
-$messages['messageopenerror'] = 'सर्वरबाट मेल लोड हुन सकेन';\r
-$messages['fileuploaderror'] = 'फाईल अपलोड हुन असफल';\r
-$messages['filesizeerror'] = 'अपलोड गरिएको फाईल हद $size भन्दा ठूलो छ';\r
-$messages['copysuccess'] = 'सफल्तापूर्वक $nr ठेगानाहरु उतारियो';\r
-$messages['copyerror'] = 'कुनै पनि ठेगानाहरु उतार्न सकिएन';\r
-$messages['sourceisreadonly'] = 'यो ठेगाना को श्रोत पढ्नको लागि मात्र उपलब्ध छ';\r
-$messages['errorsavingcontact'] = 'स्मपर्कको ठेगाना जोगाउन सकिएन';\r
-\r
-?>\r
diff --git a/program/localization/ne_NP/labels.inc b/program/localization/ne_NP/labels.inc
new file mode 100644 (file)
index 0000000..1b1e899
--- /dev/null
@@ -0,0 +1,178 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | localization/ne/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
+ | Nepali Translation by:                                                |\r
+ | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |\r
+ | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |\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['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['sendmessage'] = 'तुरुन्तै मेल पठाउनुहोस';\r
+$labels['savemessage'] = 'ड्राफ्ट जोगाउनुहोस';\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['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
+?>\r
diff --git a/program/localization/ne_NP/messages.inc b/program/localization/ne_NP/messages.inc
new file mode 100644 (file)
index 0000000..bd28199
--- /dev/null
@@ -0,0 +1,75 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | localization/ne/messages.inc                                          |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Nepali Translation by:                                                |\r
+ | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |\r
+ | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |\r
+ +-----------------------------------------------------------------------+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'लागईन हुन पाएन';\r
+$messages['cookiesdisabled'] = 'तपाईको ब्राऊसरले कुकी स्वीकार गारिरहेको छैन';\r
+$messages['sessionerror'] = 'सत्र समाप्त वा अवैद्य';\r
+$messages['imaperror'] = 'सर्वर संग सम्पर्क हुन पाएन';\r
+$messages['nomessagesfound'] = 'यो मेलबक्स मा कुनै मेल छैन';\r
+$messages['loggedout'] = 'सत्र समाप्त । नमास्कार!';\r
+$messages['mailboxempty'] = 'मेल बक्स खाली छ';\r
+$messages['loading'] = 'लोड भईरहेको छ...';\r
+$messages['loadingdata'] = 'डाटा लोड भईरहेको छै...';\r
+$messages['checkingmail'] = 'नया मेलको खोजी भईरहेको छ...';\r
+$messages['sendingmessage'] = 'मेल पठाईदै रहेको छ...';\r
+$messages['messagesent'] = 'मेल सफल्तापूर्वक पठाईयो';\r
+$messages['savingmessage'] = 'मेल जोगाईदै छ...';\r
+$messages['messagesaved'] = 'मेल ड्राफ्ट फोल्डरमा जोगाईयो';\r
+$messages['successfullysaved'] = 'सफल्तापूर्वक जोगाईयो';\r
+$messages['addedsuccessfully'] = 'सम्पर्क पुस्तिकामा सफल्तापूर्वक सम्पर्क प्रविष्ट गारियो';\r
+$messages['contactexists'] = 'यो ई-मेल पहिलै लिईसकिएको छ';\r
+$messages['blockedimages'] = 'तपाईको प्राईवेसी को लागि तथा अन्य स्पामबाट बच्नकोलागि यो मेलमा चित्रहुरु देखाईएका छैनन्।';\r
+$messages['encryptedmessage'] = 'माफ गर्नुहोसे, यो मेल ईन्क्रिफ्ट गरिएको रूपमा छ, त्यसैले देखाउन सकिदैन!';\r
+$messages['nocontactsfound'] = 'कुनै सम्पर्क भेटिएन';\r
+$messages['contactnotfound'] = 'अनुरोध गारिएको सम्पर्क भेटिएन';\r
+$messages['sendingfailed'] = 'मेल पठाउन सकिएन';\r
+$messages['errorsaving'] = 'जोगाउदा-जोगाउदै गडबड भायो';\r
+$messages['errormoving'] = 'मेल सार्न सकिएन';\r
+$messages['errordeleting'] = 'मेल मेटाउन सकिएन';\r
+$messages['deletecontactconfirm'] = 'तापाईले छान्नुभएको सम्पर्कहरु, साँचै मेट्न चहानुहुन्छ?';\r
+$messages['deletemessagesconfirm'] = 'तापाईले छान्नु भएको मेलहरु, साँचै मेट्न चहानुहुन्छ?';\r
+$messages['deletefolderconfirm'] = 'तापाईले साँचै यो फोल्डर मेट्न चहानु हुन्छ?';\r
+$messages['purgefolderconfirm'] = 'तापाईले साँचै यो फोल्डरमा भएका सबै मेलहरु मेट्न चहानुहुन्छ?';\r
+$messages['formincomplete'] = 'फर्म पूर्ण रुपमा भरिएको छैन';\r
+$messages['noemailwarning'] = 'कृपया वैद्य ई-मेल भर्नुहोस';\r
+$messages['nonamewarning'] = 'कृपया नाम भर्नुहोस';\r
+$messages['nopagesizewarning'] = 'कृपया पन्नाको नाप भर्नुहोस';\r
+$messages['norecipientwarning'] = 'कृपया कम-से-कम एउटा प्रापकको विवरण भर्नुहोस';\r
+$messages['nosubjectwarning'] = 'मेलको कुनै विषय तोकिएको छैनै। केहि तोक्न चहानुहुन्छ ?';\r
+$messages['nobodywarning'] = 'बिना केहि लेखि पठाउने?';\r
+$messages['notsentwarning'] = 'मेल पठएको छैन.. मेल रद्द गर्न चहानुहुन्छ?';\r
+$messages['noldapserver'] = 'कृपया खोजको निम्ति एउटा ऐलडाप सर्वर छान्नहोस';\r
+$messages['nocontactsreturned'] = 'कुनै सम्पर्क फेला परेनन्';\r
+$messages['nosearchname'] = 'कृपया सम्पर्कको नाम या ई-मेल भर्नुहोस';\r
+$messages['searchsuccessful'] = '$nr मेलहरु पाइयो';\r
+$messages['searchnomatch'] = 'खोज असफल रहयो';\r
+$messages['searching'] = 'खोजि भईरहेको छ...';\r
+$messages['checking'] = 'जाँच भईरहेको छ...';\r
+$messages['nospellerrors'] = 'कुनै गलत हिज्जे फेला परेनन्';\r
+$messages['folderdeleted'] = 'फोल्डर सफल्तापूर्वक मेटियो';\r
+$messages['deletedsuccessfully'] = 'सफल्तापूर्वक मेटियो';\r
+$messages['converting'] = 'मेलबाट फोर्माटिङ हटाईदै छ...';\r
+$messages['messageopenerror'] = 'सर्वरबाट मेल लोड हुन सकेन';\r
+$messages['fileuploaderror'] = 'फाईल अपलोड हुन असफल';\r
+$messages['filesizeerror'] = 'अपलोड गरिएको फाईल हद $size भन्दा ठूलो छ';\r
+$messages['copysuccess'] = 'सफल्तापूर्वक $nr ठेगानाहरु उतारियो';\r
+$messages['copyerror'] = 'कुनै पनि ठेगानाहरु उतार्न सकिएन';\r
+$messages['sourceisreadonly'] = 'यो ठेगाना को श्रोत पढ्नको लागि मात्र उपलब्ध छ';\r
+$messages['errorsavingcontact'] = 'स्मपर्कको ठेगाना जोगाउन सकिएन';\r
+\r
+?>\r
index f746fb165294c61b3dbde9a55e97e96701c3e1f2..983bed366b4944c615ff71f7f448c0db819a65c2 100644 (file)
@@ -2,18 +2,18 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/nl_NL/labels.inc                                             |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Mark Moses <mark@katmoda.com>                                 |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/nl_NL/labels.inc                                             |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Mark Moses <mark@katmoda.com>                                 |
++-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
+@version $Id: labels.inc 1402 2008-05-19 07:50:25Z alec $
 
 */
 
@@ -31,7 +31,7 @@ $labels['inbox'] = 'Postvak IN';
 $labels['drafts'] = 'Concepten';
 $labels['sent'] = 'Verzonden';
 $labels['trash'] = 'Prullenbak';
-$labels['junk'] = 'SPAM';
+$labels['junk'] = 'Spam';
 $labels['subject'] = 'Onderwerp';
 $labels['from'] = 'Afzender';
 $labels['to'] = 'Ontvanger';
@@ -50,9 +50,9 @@ $labels['moveto'] = 'verplaats naar...';
 $labels['download'] = 'download';
 $labels['filename'] = 'Bestandsnaam';
 $labels['filesize'] = 'Bestandsgrootte';
-$labels['preferhtml'] = 'Prefereer HTML';
+$labels['preferhtml'] = 'Toon HTML';
 $labels['htmlmessage'] = 'HTML Bericht';
-$labels['prettydate'] = 'Opgemaakte data';
+$labels['prettydate'] = 'Opgemaakte datums';
 $labels['addtoaddressbook'] = 'Toevoegen aan adresboek';
 $labels['sun'] = 'Zo';
 $labels['mon'] = 'Ma';
@@ -68,9 +68,33 @@ $labels['wednesday'] = 'Woensdag';
 $labels['thursday'] = 'Donderdag';
 $labels['friday'] = 'Vrijdag';
 $labels['saturday'] = 'Zaterdag';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mrt';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'Mei';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dec';
+$labels['longjan'] = 'Januari';
+$labels['longfeb'] = 'Februari';
+$labels['longmar'] = 'Maart';
+$labels['longapr'] = 'April';
+$labels['longmay'] = 'Mei';
+$labels['longjun'] = 'Juni';
+$labels['longjul'] = 'Juli';
+$labels['longaug'] = 'Augustus';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Oktober';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'December';
 $labels['today'] = 'Vandaag';
 $labels['checkmail'] = 'Controleer op nieuwe berichten';
-$labels['writenewmessage'] = 'Nieuw bericht';
+$labels['writenewmessage'] = 'Maak een nieuw bericht';
 $labels['replytomessage'] = 'Beantwoord het bericht';
 $labels['replytoallmessage'] = 'Beantwoord alle ontvangers';
 $labels['forwardmessage'] = 'Bericht doorsturen';
@@ -127,7 +151,7 @@ $labels['plaintoggle'] = 'Gewone tekst';
 $labels['addcc'] = 'Kopie toevoegen';
 $labels['addbcc'] = 'Bcc toevoegen';
 $labels['addreplyto'] = 'Antwoord-aan toevoegen';
-$labels['mdnrequest'] = 'De afzender van dit bericht heeft gevraagd of er een melding kan worden verzonden als dit bericht is ontvangen. Wilt u de een melding verzenden?';
+$labels['mdnrequest'] = 'De afzender van dit bericht heeft gevraagd of er een melding kan worden verzonden als dit bericht is ontvangen. Wilt u de melding verzenden?';
 $labels['receiptread'] = 'Ontvangstbevestiging (gelezen)';
 $labels['yourmessage'] = 'Dit is een ontvangstbevestiging voor uw bericht';
 $labels['receiptnote'] = 'Let op: Deze bevestigt alleen dat uw bericht bij de geaddresseerde is binnen gekomen. Er is geen garantie dat de geaddresseerde het bericht daadwerkelijk heeft gelezen of de inhoud heeft begrepen.';
@@ -171,6 +195,14 @@ $labels['dstactive'] = 'Zomertijd';
 $labels['htmleditor'] = 'Maak HTML berichten aan';
 $labels['htmlsignature'] = 'HTML onderschrift';
 $labels['previewpane'] = 'Toon voorbeeldvenster';
+$labels['logoutclear'] = 'Prullenbak legen bij uitloggen';
+$labels['logoutcompact'] = 'Postvak IN opschonen bij uitloggen';
+$labels['uisettings'] = 'Gebruikers Interface';
+$labels['serversettings'] = 'Server Instellingen';
+$labels['askuser'] = 'vraag de gebruiker';
+$labels['autosend'] = 'stuur automatisch';
+$labels['ignore'] = 'negeer';
+$labels['readwhendeleted'] = 'Markeer het bericht na verwijderen als gelezen';
 $labels['autosavedraft'] = 'Concept automatisch opslaan';
 $labels['everynminutes'] = 'iedere $n minuten';
 $labels['never'] = 'nooit';
diff --git a/program/localization/pl/labels.inc b/program/localization/pl/labels.inc
deleted file mode 100644 (file)
index 24b9baa..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/pl/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
- |         Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
- |         Janusz Zamecki      <janusz@zamecki.eu>                       |
- |         Mariusz Szulerecki  <nob@force.eu.org>                        |
- |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Witamy w $product';
-$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['inbox'] = 'Odebrane';
-$labels['drafts'] = 'Kopie robocze';
-$labels['sent'] = 'Wysłane';
-$labels['trash'] = 'Kosz';
-$labels['junk'] = 'Spam';
-$labels['subject'] = 'Temat';
-$labels['from'] = 'Nadawca';
-$labels['to'] = 'Odbiorca';
-$labels['cc'] = 'Kopia';
-$labels['bcc'] = 'Ukryta kopia';
-$labels['replyto'] = 'Odpowiedz do';
-$labels['date'] = 'Data';
-$labels['size'] = 'Wielkość';
-$labels['priority'] = 'Priorytet';
-$labels['organization'] = 'Organizacja';
-$labels['reply-to'] = 'Odpowiedz do';
-$labels['mailboxlist'] = 'Foldery';
-$labels['messagesfromto'] = 'Wiadomości od $from do $to z $count';
-$labels['messagenrof'] = 'Wiadomość $nr z $count';
-$labels['moveto'] = 'Przenieś do...';
-$labels['download'] = 'Pobierz';
-$labels['filename'] = 'Nazwa pliku';
-$labels['filesize'] = 'Wielkość pliku';
-$labels['preferhtml'] = 'Domyślny HTML';
-$labels['htmlmessage'] = 'Wiadomość HTML';
-$labels['prettydate'] = 'Ładne daty';
-$labels['addtoaddressbook'] = 'Dodaj do książki adresowej ';
-$labels['sun'] = 'Nd';
-$labels['mon'] = 'Pn';
-$labels['tue'] = 'Wt';
-$labels['wed'] = 'Śr';
-$labels['thu'] = 'Czw';
-$labels['fri'] = 'Pt';
-$labels['sat'] = 'Sb';
-$labels['sunday'] = 'Niedziela';
-$labels['monday'] = 'Poniedziałek';
-$labels['tuesday'] = 'Wtorek';
-$labels['wednesday'] = 'Środa';
-$labels['thursday'] = 'Czwartek';
-$labels['friday'] = 'Piątek';
-$labels['saturday'] = 'Sobota';
-$labels['today'] = 'Dzisiaj';
-$labels['checkmail'] = 'Sprawdź skrzynkę';
-$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';
-$labels['firstmessage'] = 'Pokaż pierwszą';
-$labels['firstmessages'] = 'Pokaż pierwsze';
-$labels['nextmessage'] = 'Pokaż następną';
-$labels['nextmessages'] = 'Pokaż następne';
-$labels['lastmessage'] = 'Pokaż ostatnią';
-$labels['lastmessages'] = 'Pokaż ostatnie';
-$labels['backtolist'] = 'Pokaż listę wiadomości';
-$labels['viewsource'] = 'Pokaż źródło';
-$labels['markmessages'] = 'Oznacz wiadomość';
-$labels['markread'] = 'Jako przeczytaną';
-$labels['markunread'] = 'Jako nieprzeczytaną';
-$labels['select'] = 'Zaznacz';
-$labels['all'] = 'Wszystkie';
-$labels['none'] = 'Anuluj';
-$labels['unread'] = 'Nieprzeczytane';
-$labels['compact'] = 'Upakuj';
-$labels['empty'] = 'Opróżnij';
-$labels['purge'] = 'Oczyść';
-$labels['quota'] = 'Użyte miejsce';
-$labels['unknown'] = 'nieznane';
-$labels['unlimited'] = 'bez limitu';
-$labels['quicksearch'] = 'Szybkie wyszukiwanie';
-$labels['resetsearch'] = 'Wyczyść filtr';
-$labels['compose'] = 'Utwórz wiadomość';
-$labels['savemessage'] = 'Zapisz kopię roboczą';
-$labels['sendmessage'] = 'Wyślij teraz';
-$labels['addattachment'] = 'Dołącz plik';
-$labels['charset'] = 'Kodowanie znaków';
-$labels['editortype'] = 'Typ edytora';
-$labels['returnreceipt'] = 'Potwierdzenie odbioru';
-$labels['checkspelling'] = 'Sprawdź pisownię';
-$labels['resumeediting'] = 'Zakończ sprawdzanie pisowni';
-$labels['revertto'] = 'Powróć do';
-$labels['attachments'] = 'Załączniki';
-$labels['upload'] = 'Wyślij';
-$labels['close'] = 'Zamknij';
-$labels['low'] = 'Bardzo niski';
-$labels['lowest'] = 'Niski';
-$labels['normal'] = 'Normalny';
-$labels['high'] = 'Wysoki';
-$labels['highest'] = 'Bardzo wysoki';
-$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['mdnrequest'] = 'Nadawca zażądał potwierdzenia przeczytania tej wiadomości. Czy chcesz go powiadomić?';
-$labels['receiptread'] = 'Potwierdzenie otrzymania';
-$labels['yourmessage'] = 'To jest potwierdzenie dostarczenia Twojej wiadomości';
-$labels['receiptnote'] = 'Uwaga: To potwierdzenie dostarczenia wiadomości oznacza tylko, że wiadomość została wyświetlona na komputerze adresata. Nie ma żadnej gwarancji, że odbiorca przeczytał czy też zrozumiał treść wiadomości.';
-$labels['name'] = 'Nazwa';
-$labels['firstname'] = 'Imię';
-$labels['surname'] = 'Nazwisko';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Dodaj nowy kontakt do książki adresowej';
-$labels['editcontact'] = 'Edytuj kontakt';
-$labels['edit'] = 'Edytuj';
-$labels['cancel'] = 'Anuluj';
-$labels['save'] = 'Zapisz';
-$labels['delete'] = 'Kasuj';
-$labels['newcontact'] = 'Dodaj nowy kontakt';
-$labels['deletecontact'] = 'Usuń zaznaczone kontakty';
-$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';
-$labels['firstpage'] = 'pierwsza strona';
-$labels['nextpage'] = 'następna strona';
-$labels['lastpage'] = 'ostatnia strona';
-$labels['groups'] = 'Grupy';
-$labels['personaladrbook'] = 'Książka adresowa';
-$labels['settingsfor'] = 'Ustawienia dla';
-$labels['preferences'] = 'Preferencje';
-$labels['userpreferences'] = 'Preferencje';
-$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'] = 'Domyślna';
-$labels['language'] = 'Język';
-$labels['timezone'] = 'Strefa czasowa';
-$labels['pagesize'] = 'Wierszy na stronie';
-$labels['signature'] = 'Podpis';
-$labels['dstactive'] = 'Czas letni';
-$labels['htmleditor'] = 'Twórz wiadomości HTML';
-$labels['htmlsignature'] = 'Podpis w HTML';
-$labels['previewpane'] = 'Pokaż podgląd';
-$labels['autosavedraft'] = 'Automatyczny zapis tworzonej wiadomości';
-$labels['everynminutes'] = 'co $n minut';
-$labels['never'] = 'nigdy';
-$labels['folder'] = 'Folder';
-$labels['folders'] = 'Foldery';
-$labels['foldername'] = 'Nazwa folderu';
-$labels['subscribed'] = 'Zasubskrybowany';
-$labels['messagecount'] = 'Wiadomości';
-$labels['create'] = 'Utwórz';
-$labels['createfolder'] = 'Utwórz nowy folder';
-$labels['rename'] = 'Zmień nazwę';
-$labels['renamefolder'] = 'Zmień nazwę folderu';
-$labels['deletefolder'] = 'Usuń folder';
-$labels['managefolders'] = 'Zarządzaj folderami';
-$labels['sortby'] = 'Sortuj wg';
-$labels['sortasc'] = 'Rosnąco';
-$labels['sortdesc'] = 'Malejąco';
-
-?>
diff --git a/program/localization/pl/messages.inc b/program/localization/pl/messages.inc
deleted file mode 100644 (file)
index 904a24d..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/pl/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
- | Author: Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
- |         Janusz Zamecki      <janusz@zamecki.eu>                       |
- |         Mariusz Szulerecki  <nob@force.eu.org>                        |
- |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-$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['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 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ść została zapisana w folderze Kopie robocze.';
-$messages['successfullysaved'] = 'Zapisano.';
-$messages['addedsuccessfully'] = 'Kontakt został dodany.';
-$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ś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!';
-$messages['errorsaving'] = 'Błąd podczas zapisu!';
-$messages['errormoving'] = 'Nie można przenieść wybranej wiadomości!';
-$messages['errordeleting'] = 'Nie można usunąć wiadomości!';
-$messages['deletecontactconfirm'] = 'Czy na pewno chcesz usunąć wybrane kontakty?';
-$messages['deletemessagesconfirm'] = 'Czy na pewno chcesz usunąć wybrane wiadomości?';
-$messages['deletefolderconfirm'] = 'Czy na pewno chcesz usunąć wybrany folder?';
-$messages['purgefolderconfirm'] = 'Czy na pewno chcesz usunąć wszystkie wiadomości w tym folderze?';
-$messages['formincomplete'] = 'Uzupełnij formularz!';
-$messages['noemailwarning'] = 'Podaj poprawny adres e-mail!';
-$messages['nonamewarning'] = 'Podaj nazwę!';
-$messages['nopagesizewarning'] = 'Podaj poprawną wartość!';
-$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'] = 'Podaj nazwę kontaktu lub jego adres e-mail.';
-$messages['searchsuccessful'] = 'Liczba znalezionych wiadomości: $nr';
-$messages['searchnomatch'] = 'Nic nie znaleziono.';
-$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'] = '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 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['errorsavingcontact'] = 'Nie można było zapisać adresu kontaktu';
-$messages['movingmessage'] = 'Przenoszenie wiadomości...';
-$messages['receiptsent'] = 'Pomyślnie wysłano potwierdzenie dostarczenia';
-$messages['errorsendingreceipt'] = 'Nie można wysłać potwierdzenia';
-$messages['nodeletelastidentity'] = 'Nie można skasować tej tożsamości, ponieważ jest ostatnią.';
-$messages['addsubfolderhint'] = 'Ten folder zostanie utworzony jako podfolder aktualnie wybranego.';
-
-?>
\ No newline at end of file
diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc
new file mode 100644 (file)
index 0000000..5c9570d
--- /dev/null
@@ -0,0 +1,232 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/pl_PL/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
+ |         Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
+ |         Janusz Zamecki      <janusz@zamecki.eu>                       |
+ |         Mariusz Szulerecki  <nob@force.eu.org>                        |
+ |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
+ |         Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1404 2008-05-19 08:12:54Z alec $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Witamy w $product';
+$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['inbox'] = 'Odebrane';
+$labels['drafts'] = 'Kopie robocze';
+$labels['sent'] = 'Wysłane';
+$labels['trash'] = 'Kosz';
+$labels['junk'] = 'Spam';
+$labels['subject'] = 'Temat';
+$labels['from'] = 'Nadawca';
+$labels['to'] = 'Odbiorca';
+$labels['cc'] = 'Kopia';
+$labels['bcc'] = 'Ukryta kopia';
+$labels['replyto'] = 'Odpowiedz do';
+$labels['date'] = 'Data';
+$labels['size'] = 'Rozmiar';
+$labels['priority'] = 'Priorytet';
+$labels['organization'] = 'Organizacja';
+$labels['reply-to'] = 'Odpowiedz do';
+$labels['mailboxlist'] = 'Foldery';
+$labels['messagesfromto'] = 'Wiadomości od $from do $to z $count';
+$labels['messagenrof'] = 'Wiadomość $nr z $count';
+$labels['moveto'] = 'Przenieś do...';
+$labels['download'] = 'Pobierz';
+$labels['filename'] = 'Nazwa pliku';
+$labels['filesize'] = 'Rozmiar pliku';
+$labels['preferhtml'] = 'Domyślny HTML';
+$labels['htmlmessage'] = 'Wiadomość HTML';
+$labels['prettydate'] = 'Ładne daty';
+$labels['addtoaddressbook'] = 'Dodaj do książki adresowej ';
+$labels['sun'] = 'Nd';
+$labels['mon'] = 'Pn';
+$labels['tue'] = 'Wt';
+$labels['wed'] = 'Śr';
+$labels['thu'] = 'Czw';
+$labels['fri'] = 'Pt';
+$labels['sat'] = 'Sb';
+$labels['sunday'] = 'Niedziela';
+$labels['monday'] = 'Poniedziałek';
+$labels['tuesday'] = 'Wtorek';
+$labels['wednesday'] = 'Środa';
+$labels['thursday'] = 'Czwartek';
+$labels['friday'] = 'Piątek';
+$labels['saturday'] = 'Sobota';
+$labels['jan'] = 'sty';
+$labels['feb'] = 'lut';
+$labels['mar'] = 'mar';
+$labels['apr'] = 'kwi';
+$labels['may'] = 'maj';
+$labels['jun'] = 'cze';
+$labels['jul'] = 'lip';
+$labels['aug'] = 'sie';
+$labels['sep'] = 'wrz';
+$labels['oct'] = 'paź';
+$labels['nov'] = 'lis';
+$labels['dec'] = 'gru';
+$labels['longjan'] = 'styczeń';
+$labels['longfeb'] = 'luty';
+$labels['longmar'] = 'marzec';
+$labels['longapr'] = 'kwiecień';
+$labels['longmay'] = 'maj';
+$labels['longjun'] = 'czerwiec';
+$labels['longjul'] = 'lipiec';
+$labels['longaug'] = 'sierpień';
+$labels['longsep'] = 'wrzesień';
+$labels['longoct'] = 'październik';
+$labels['longnov'] = 'listopad';
+$labels['longdec'] = 'grudzień';
+$labels['today'] = 'Dzisiaj';
+$labels['checkmail'] = 'Sprawdź skrzynkę';
+$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';
+$labels['firstmessage'] = 'Pokaż pierwszą';
+$labels['firstmessages'] = 'Pokaż pierwsze';
+$labels['nextmessage'] = 'Pokaż następną';
+$labels['nextmessages'] = 'Pokaż następne';
+$labels['lastmessage'] = 'Pokaż ostatnią';
+$labels['lastmessages'] = 'Pokaż ostatnie';
+$labels['backtolist'] = 'Pokaż listę wiadomości';
+$labels['viewsource'] = 'Pokaż źródło';
+$labels['markmessages'] = 'Oznacz wiadomość';
+$labels['markread'] = 'Jako przeczytaną';
+$labels['markunread'] = 'Jako nieprzeczytaną';
+$labels['select'] = 'Zaznacz';
+$labels['all'] = 'Wszystkie';
+$labels['none'] = 'Anuluj';
+$labels['unread'] = 'Nieprzeczytane';
+$labels['compact'] = 'Porządkuj';
+$labels['empty'] = 'Opróżnij';
+$labels['purge'] = 'Oczyść';
+$labels['quota'] = 'Użyte miejsce';
+$labels['unknown'] = 'nieznane';
+$labels['unlimited'] = 'bez limitu';
+$labels['quicksearch'] = 'Szybkie wyszukiwanie';
+$labels['resetsearch'] = 'Wyczyść filtr';
+$labels['compose'] = 'Utwórz wiadomość';
+$labels['savemessage'] = 'Zapisz kopię roboczą';
+$labels['sendmessage'] = 'Wyślij teraz';
+$labels['addattachment'] = 'Dołącz plik';
+$labels['charset'] = 'Kodowanie znaków';
+$labels['editortype'] = 'Typ edytora';
+$labels['returnreceipt'] = 'Potwierdzenie odbioru';
+$labels['checkspelling'] = 'Sprawdź pisownię';
+$labels['resumeediting'] = 'Zakończ sprawdzanie pisowni';
+$labels['revertto'] = 'Powróć do';
+$labels['attachments'] = 'Załączniki';
+$labels['upload'] = 'Wyślij';
+$labels['close'] = 'Zamknij';
+$labels['low'] = 'Bardzo niski';
+$labels['lowest'] = 'Niski';
+$labels['normal'] = 'Normalny';
+$labels['high'] = 'Wysoki';
+$labels['highest'] = 'Bardzo wysoki';
+$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['mdnrequest'] = 'Nadawca zażądał potwierdzenia przeczytania tej wiadomości. Czy chcesz go powiadomić?';
+$labels['receiptread'] = 'Potwierdzenie otrzymania';
+$labels['yourmessage'] = 'To jest potwierdzenie dostarczenia Twojej wiadomości';
+$labels['receiptnote'] = 'Uwaga: To potwierdzenie dostarczenia wiadomości oznacza tylko, że wiadomość została wyświetlona na komputerze adresata. Nie ma żadnej gwarancji, że odbiorca przeczytał czy też zrozumiał treść wiadomości.';
+$labels['name'] = 'Nazwa';
+$labels['firstname'] = 'Imię';
+$labels['surname'] = 'Nazwisko';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Dodaj nowy kontakt do książki adresowej';
+$labels['editcontact'] = 'Edytuj kontakt';
+$labels['edit'] = 'Edytuj';
+$labels['cancel'] = 'Anuluj';
+$labels['save'] = 'Zapisz';
+$labels['delete'] = 'Usuń';
+$labels['newcontact'] = 'Dodaj nowy kontakt';
+$labels['deletecontact'] = 'Usuń zaznaczone kontakty';
+$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';
+$labels['firstpage'] = 'pierwsza strona';
+$labels['nextpage'] = 'następna strona';
+$labels['lastpage'] = 'ostatnia strona';
+$labels['groups'] = 'Grupy';
+$labels['personaladrbook'] = 'Książka adresowa';
+$labels['settingsfor'] = 'Ustawienia dla';
+$labels['preferences'] = 'Preferencje';
+$labels['userpreferences'] = 'Preferencje użytkownika';
+$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'] = 'Domyślna';
+$labels['language'] = 'Język';
+$labels['timezone'] = 'Strefa czasowa';
+$labels['pagesize'] = 'Wierszy na stronie';
+$labels['signature'] = 'Podpis';
+$labels['dstactive'] = 'Czas letni';
+$labels['htmleditor'] = 'Twórz wiadomości HTML';
+$labels['htmlsignature'] = 'Podpis w HTML';
+$labels['previewpane'] = 'Pokaż podgląd';
+$labels['logoutclear'] = 'Przy wylogowaniu opróżnij Kosz';
+$labels['logoutcompact'] = 'Przy wylogowaniu porządkuj folder Odebrane';
+$labels['uisettings'] = 'Interfejs użytkownika';
+$labels['serversettings'] = 'Ustawienia serwera';
+$labels['mailboxview'] = 'Widok skrzynki pocztowej';
+$labels['mdnrequests'] = 'Potwierdzenia odbioru';
+$labels['askuser'] = 'spytaj użytkownika';
+$labels['autosend'] = 'wyślij automatycznie';
+$labels['ignore'] = 'ignoruj';
+$labels['readwhendeleted'] = 'Podczas usuwania oznacz wiadomość jako przeczytaną';
+$labels['flagfordeletion'] = 'Oznacz wiadomość do usunięcia zamiast ją usuwać';
+$labels['autosavedraft'] = 'Automatyczny zapis tworzonej wiadomości';
+$labels['everynminutes'] = 'co $n minut';
+$labels['never'] = 'nigdy';
+$labels['folder'] = 'Folder';
+$labels['folders'] = 'Foldery';
+$labels['foldername'] = 'Nazwa folderu';
+$labels['subscribed'] = 'Zasubskrybowany';
+$labels['messagecount'] = 'Wiadomości';
+$labels['create'] = 'Utwórz';
+$labels['createfolder'] = 'Utwórz nowy folder';
+$labels['rename'] = 'Zmień nazwę';
+$labels['renamefolder'] = 'Zmień nazwę folderu';
+$labels['deletefolder'] = 'Usuń folder';
+$labels['managefolders'] = 'Zarządzaj folderami';
+$labels['sortby'] = 'Sortuj wg';
+$labels['sortasc'] = 'Rosnąco';
+$labels['sortdesc'] = 'Malejąco';
+
+?>
diff --git a/program/localization/pl_PL/messages.inc b/program/localization/pl_PL/messages.inc
new file mode 100644 (file)
index 0000000..be8d04d
--- /dev/null
@@ -0,0 +1,88 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/pl_PL/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
+ | Author: Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
+ |         Janusz Zamecki      <janusz@zamecki.eu>                       |
+ |         Mariusz Szulerecki  <nob@force.eu.org>                        |
+ |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
+ |         Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1245 2008-04-03 13:17:34Z alec $
+
+*/
+
+$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['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 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ść została zapisana w folderze Kopie robocze.';
+$messages['successfullysaved'] = 'Zapisano.';
+$messages['addedsuccessfully'] = 'Kontakt został dodany.';
+$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ś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!';
+$messages['errorsaving'] = 'Błąd podczas zapisu!';
+$messages['errormoving'] = 'Nie można przenieść wybranej wiadomości!';
+$messages['errordeleting'] = 'Nie można usunąć wiadomości!';
+$messages['deletecontactconfirm'] = 'Czy na pewno chcesz usunąć wybrane kontakty?';
+$messages['deletemessagesconfirm'] = 'Czy na pewno chcesz usunąć wybrane wiadomości?';
+$messages['deletefolderconfirm'] = 'Czy na pewno chcesz usunąć wybrany folder?';
+$messages['purgefolderconfirm'] = 'Czy na pewno chcesz usunąć wszystkie wiadomości w tym folderze?';
+$messages['formincomplete'] = 'Uzupełnij formularz!';
+$messages['noemailwarning'] = 'Podaj poprawny adres e-mail!';
+$messages['nonamewarning'] = 'Podaj nazwę!';
+$messages['nopagesizewarning'] = 'Podaj poprawną wartość!';
+$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'] = 'Podaj nazwę kontaktu lub jego adres e-mail.';
+$messages['searchsuccessful'] = 'Liczba znalezionych wiadomości: $nr';
+$messages['searchnomatch'] = 'Nic nie znaleziono.';
+$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'] = '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 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['errorsavingcontact'] = 'Nie można było zapisać adresu kontaktu';
+$messages['movingmessage'] = 'Przenoszenie wiadomości...';
+$messages['receiptsent'] = 'Pomyślnie wysłano potwierdzenie dostarczenia';
+$messages['errorsendingreceipt'] = 'Nie można wysłać potwierdzenia';
+$messages['nodeletelastidentity'] = 'Nie można skasować tej tożsamości, ponieważ jest ostatnią.';
+$messages['addsubfolderhint'] = 'Ten folder zostanie utworzony jako podfolder aktualnie wybranego.';
+$messages['forbiddencharacter'] = 'Nazwa folderu zawiera niedozwolony znak';
+
+?>
\ No newline at end of file
index 9b6391e37e01c485714f2130db1b798cd2a6a598..0a4bd7f081fff22c232d33f0ab577d3b9ec584ff 100644 (file)
@@ -2,20 +2,21 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/pt_PT/labels.inc                                             |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Authors: Sergio Rocha <sergio.rocha@makeitsimple.pt>                  |
- |          João Vale <jpvale@gmail.com>                                 |
- |          Fernando Silva <fernando.silva@openquest.pt>                 |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/pt_PT/labels.inc                                             |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Authors: Sergio Rocha <sergio.rocha@makeitsimple.pt>                  |
+|          João Vale <jpvale@gmail.com>                                 |
+|          Fernando Silva <fernando.silva@openquest.pt>                 |
+|          Nuno Costa <nuno@criacaoweb.net>                             |
++-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
+@version $Id: labels.inc 1402 2008-05-19 07:50:25Z alec $
 
 */
 
@@ -70,6 +71,30 @@ $labels['wednesday'] = 'Quarta-feira';
 $labels['thursday'] = 'Quinta-feira';
 $labels['friday'] = 'Sexta-feira';
 $labels['saturday'] = 'Sábado';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Fev';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Abr';
+$labels['may'] = 'Mai';
+$labels['jun'] = 'Jun';
+$labels['jul'] = 'Jul';
+$labels['aug'] = 'Ago';
+$labels['sep'] = 'Set';
+$labels['oct'] = 'Out';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dez';
+$labels['longjan'] = 'Janeiro';
+$labels['longfeb'] = 'Fevereiro';
+$labels['longmar'] = 'Março';
+$labels['longapr'] = 'Abril';
+$labels['longmay'] = 'Maio';
+$labels['longjun'] = 'Junho';
+$labels['longjul'] = 'Julho';
+$labels['longaug'] = 'Agosto';
+$labels['longsep'] = 'Setembro';
+$labels['longoct'] = 'Outubro';
+$labels['longnov'] = 'Novembro';
+$labels['longdec'] = 'Dezembro';
 $labels['today'] = 'Hoje';
 $labels['checkmail'] = 'Verificar novas mensagens';
 $labels['writenewmessage'] = 'Criar nova mensagem';
@@ -173,6 +198,10 @@ $labels['dstactive'] = 'Horário de verão';
 $labels['htmleditor'] = 'Escrever mensagens em HTML';
 $labels['htmlsignature'] = 'Assinatura em HTML';
 $labels['previewpane'] = 'Mostrar pré-visualização';
+$labels['logoutclear'] = 'Limpar a Lixeira após sair';
+$labels['logoutcompact'] = 'Compactar Caixa de Entrada após sair';
+$labels['uisettings'] = 'Interface de Utilizador';
+$labels['serversettings'] = 'Definições do Servidor';
 $labels['autosavedraft'] = 'Salvar rascunho automaticamente';
 $labels['everynminutes'] = 'a cada $n minutos';
 $labels['never'] = 'nunca';
@@ -190,5 +219,11 @@ $labels['managefolders'] = 'Gerir pastas';
 $labels['sortby'] = 'Ordenado por';
 $labels['sortasc'] = 'Ascendente';
 $labels['sortdesc'] = 'Descendente';
+$labels['mailboxview'] = 'Visualizar caixa de Entrada';
+$labels['mdnrequests'] = 'Enviar Notificações';
+$labels['askuser'] = 'Perguntar ao ultilizador';
+$labels['autosend'] = 'enviar automáticamente';
+$labels['ignore'] = 'ignorar';
+$labels['readwhendeleted'] = 'Marcar a mensagem como lida ao excluir';
 
 ?>
diff --git a/program/localization/ro/labels.inc b/program/localization/ro/labels.inc
deleted file mode 100644 (file)
index 2ca0e5d..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ro/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Daniel Anechitoaie - danieLs <daniels@safereaction.ro>        |
- |         Ispas Dorin <dorinxp2004@yahoo.com>                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1149 2008-02-28 19:52:09Z thomasb $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Bine ati venit la $product';
-$labels['username'] = 'Utilizator';
-$labels['password'] = 'Parola';
-$labels['server'] = 'Server';
-$labels['login'] = 'Autentificare';
-$labels['logout'] = 'Deconectare';
-$labels['mail'] = 'E-Mail';
-$labels['settings'] = 'Setari Personale';
-$labels['addressbook'] = 'Agenda';
-$labels['inbox'] = 'Primite';
-$labels['drafts'] = 'Ciorne';
-$labels['sent'] = 'Trimise';
-$labels['trash'] = 'Gunoi';
-$labels['junk'] = 'Junk';
-$labels['subject'] = 'Subiect';
-$labels['from'] = 'Expeditor';
-$labels['to'] = 'Destinatar';
-$labels['cc'] = 'Copie';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Raspunde-La';
-$labels['date'] = 'Data';
-$labels['size'] = 'Marime';
-$labels['priority'] = 'Prioritate';
-$labels['organization'] = 'Organizatie';
-$labels['reply-to'] = 'Raspunde-La';
-$labels['mailboxlist'] = 'Dosare';
-$labels['messagesfromto'] = 'Mesaje de la $from pana la $to din $count';
-$labels['messagenrof'] = '$nr mesaje din $count';
-$labels['moveto'] = 'muta in...';
-$labels['download'] = 'descarca';
-$labels['filename'] = 'Nume fisier';
-$labels['filesize'] = 'Marime fisier';
-$labels['preferhtml'] = 'Prefer HTML';
-$labels['htmlmessage'] = 'Mesaj HTML';
-$labels['prettydate'] = 'Data formatata';
-$labels['addtoaddressbook'] = 'Adauga in agenda';
-$labels['sun'] = 'Dum';
-$labels['mon'] = 'Lun';
-$labels['tue'] = 'Mar';
-$labels['wed'] = 'Mie';
-$labels['thu'] = 'Joi';
-$labels['fri'] = 'Vin';
-$labels['sat'] = 'Sam';
-$labels['sunday'] = 'Duminica';
-$labels['monday'] = 'Luni';
-$labels['tuesday'] = 'Marti';
-$labels['wednesday'] = 'Miercuri';
-$labels['thursday'] = 'Joi';
-$labels['friday'] = 'Vineri';
-$labels['saturday'] = 'Sambata';
-$labels['today'] = 'Astazi';
-$labels['checkmail'] = 'Verifica pentru mesaje noi';
-$labels['writenewmessage'] = 'Creaza mesaj nou';
-$labels['replytomessage'] = 'Raspunde la mesaj';
-$labels['replytoallmessage'] = 'Raspunde la toti';
-$labels['forwardmessage'] = 'Trimite mesajul mai departe';
-$labels['deletemessage'] = 'Trimite mesajul la gunoi';
-$labels['movemessagetotrash'] = 'Muta mesajul la gunoi';
-$labels['printmessage'] = 'Listeaza mesajul';
-$labels['previousmessage'] = 'Afiseaza mesajul anterior';
-$labels['previousmessages'] = 'Afiseaza setul anterior de mesaje';
-$labels['firstmessage'] = 'Afiseaza primul mesaj';
-$labels['firstmessages'] = 'Afiseaza primul set de mesaje';
-$labels['nextmessage'] = 'Afiseaza urmatorul mesaj';
-$labels['nextmessages'] = 'Afiseaza setul urmator de mesaje';
-$labels['lastmessage'] = 'Afiseaza ultimul mesaj';
-$labels['lastmessages'] = 'Afiseaza ultimul set de mesaje';
-$labels['backtolist'] = 'Inapoi la lista cu mesaje';
-$labels['viewsource'] = 'Afiseaza sursa';
-$labels['markmessages'] = 'Marcheaza mesajele';
-$labels['markread'] = 'Ca citit';
-$labels['markunread'] = 'Ca necitit';
-$labels['select'] = 'Selecteaza';
-$labels['all'] = 'Toate';
-$labels['none'] = 'Nici unul';
-$labels['unread'] = 'Necitite';
-$labels['compact'] = 'Compreseaza';
-$labels['empty'] = 'Goleste';
-$labels['purge'] = 'Curata';
-$labels['quota'] = 'Spatiu folosit';
-$labels['unknown'] = 'necunoscut';
-$labels['unlimited'] = 'nelimitat';
-$labels['quicksearch'] = 'Cautare rapida';
-$labels['resetsearch'] = 'Resetare cautare';
-$labels['compose'] = 'Compune mesaj';
-$labels['savemessage'] = 'Salveaza aceasta ciorna';
-$labels['sendmessage'] = 'Trimite mesaj';
-$labels['addattachment'] = 'Ataseaza fisier';
-$labels['charset'] = 'Set de caractere';
-$labels['editortype'] = 'Tip de editor';
-$labels['returnreceipt'] = 'Returneaza confirmare';
-$labels['checkspelling'] = 'Verifica ortografie';
-$labels['resumeediting'] = 'Reia editarea';
-$labels['revertto'] = 'Revina la';
-$labels['attachments'] = 'Atasamente';
-$labels['upload'] = 'Incarca';
-$labels['close'] = 'Inchide';
-$labels['low'] = 'Mica';
-$labels['lowest'] = 'Cea mai mica';
-$labels['normal'] = 'Normala';
-$labels['high'] = 'Mare';
-$labels['highest'] = 'Cea mai mare';
-$labels['nosubject'] = '(fara subiect)';
-$labels['showimages'] = 'Afiseaza imagini';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Text simplu';
-$labels['addcc'] = 'Adauga Cc';
-$labels['addbcc'] = 'Adauga Bcc';
-$labels['addreplyto'] = 'Adauga Raspunde-La';
-$labels['mdnrequest'] = 'Expeditorul acestui mesaj a solicitat sa fie notificat la cititrea mesajului. Doriti sa notificati expeditorul?';
-$labels['receiptread'] = 'Returneaza confirmare (citit)';
-$labels['yourmessage'] = 'Aceasta este o confirmare a mesajului dumneavoastra.';
-$labels['receiptnote'] = 'Nota: Aceasta confirmare doar va informeaza ca mesajul a fost afisat pe calculatorul destinatarului. Nu este nici o garantie ca destinatarul a citit sau a inteles continutul mesajului.';
-$labels['name'] = 'Nume de afisat';
-$labels['firstname'] = 'Nume';
-$labels['surname'] = 'Prenume';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Adauga contactul selectat in agenda';
-$labels['editcontact'] = 'Modifica contact';
-$labels['edit'] = 'Editeaza';
-$labels['cancel'] = 'Renunta';
-$labels['save'] = 'Salveaza';
-$labels['delete'] = 'Sterge';
-$labels['newcontact'] = 'Creaza contact nou';
-$labels['deletecontact'] = 'Sterge contactul selectat';
-$labels['composeto'] = 'Compune e-mail pentru';
-$labels['contactsfromto'] = 'Contacte de la $from pana la $to din $count';
-$labels['print'] = 'Listeaza';
-$labels['export'] = 'Exporta';
-$labels['previouspage'] = 'Pagina anterioara';
-$labels['firstpage'] = 'Arata primul set';
-$labels['nextpage'] = 'Pagina urmatoare';
-$labels['lastpage'] = 'Arata ultimul set';
-$labels['groups'] = 'Grupuri';
-$labels['personaladrbook'] = 'Adrese personale';
-$labels['settingsfor'] = 'Setari pentru';
-$labels['preferences'] = 'Preferinte';
-$labels['userpreferences'] = 'Preferinte utilizator';
-$labels['editpreferences'] = 'Modifica preferinte utilizator';
-$labels['identities'] = 'Identitati';
-$labels['manageidentities'] = 'Administreaza identitati pentru acest cont';
-$labels['newidentity'] = 'Identitate noua';
-$labels['newitem'] = 'Item nou';
-$labels['edititem'] = 'Editeaza item';
-$labels['setdefault'] = 'Seteaza implicit';
-$labels['language'] = 'Limba';
-$labels['timezone'] = 'Fus orar';
-$labels['pagesize'] = 'Randuri pe pagina';
-$labels['signature'] = 'Semnatura';
-$labels['dstactive'] = 'Daylight savings';
-$labels['htmleditor'] = 'Scrie mesaje HTML';
-$labels['htmlsignature'] = 'Semnatura HTML';
-$labels['previewpane'] = 'Arata preview';
-$labels['autosavedraft'] = 'Salveaza ciorna automat';
-$labels['everynminutes'] = 'fiecare $n minute';
-$labels['never'] = 'niciodata';
-$labels['folder'] = 'Dosar';
-$labels['folders'] = 'Dosare';
-$labels['foldername'] = 'Nume dosar';
-$labels['subscribed'] = 'Inscris';
-$labels['messagecount'] = 'Mesaje';
-$labels['create'] = 'Creaza';
-$labels['createfolder'] = 'Creaza dosar nou';
-$labels['rename'] = 'Redenumeste';
-$labels['renamefolder'] = 'Redenumeste dosar';
-$labels['deletefolder'] = 'Sterge dosar';
-$labels['managefolders'] = 'Administreaza dosare';
-$labels['sortby'] = 'Sorteaza dupa';
-$labels['sortasc'] = 'Sorteaza ascendent';
-$labels['sortdesc'] = 'Sorteaza descendent';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ro/messages.inc b/program/localization/ro/messages.inc
deleted file mode 100644 (file)
index 562bab7..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ro/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Daniel Anechitoaie - danieLs <daniels@safereaction.ro>        |
- |         Ispas Dorin <dorinxp2004@yahoo.com>                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1149 2008-02-28 19:52:09Z thomasb $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Autentificare esuata';
-$messages['cookiesdisabled'] = 'Browserul dumneavoastra nu accepta cookies';
-$messages['sessionerror'] = 'Sesiunea dumneavoastra este invalida sau a expirat';
-$messages['imaperror'] = 'Conectarea la serverul IMAP a esuat';
-$messages['nomessagesfound'] = 'Nu a fost gasit nici un mesaj in aceasta casuta postala';
-$messages['loggedout'] = 'Sesiune incheiata cu succes. La revedere!';
-$messages['mailboxempty'] = 'Casuta postala este goala';
-$messages['loading'] = 'Se incarca...';
-$messages['loadingdata'] = 'Se incarca informatiile...';
-$messages['checkingmail'] = 'Verifica pentru mesaje noi...';
-$messages['sendingmessage'] = 'Trimitere mesaj...';
-$messages['messagesent'] = 'Mesajul a fost trimis cu succes!';
-$messages['savingmessage'] = 'Salvare mesaj...';
-$messages['messagesaved'] = 'Mesajul a fost salvat in Ciorne';
-$messages['successfullysaved'] = 'Salvarea s-a efectuat cu succes';
-$messages['addedsuccessfully'] = 'Contactul a fost adaugat cu succes in agenda';
-$messages['contactexists'] = 'Mai exista un contact cu aceasta adresa de e-mail';
-$messages['blockedimages'] = 'Pentru a va proteja intimitatea imaginile externe au fost blocate.';
-$messages['encryptedmessage'] = 'Acesta este un mesaj criptat si nu poate fi afisat. Ne pare rau.';
-$messages['nocontactsfound'] = 'Nu s-a gasit nici un contact';
-$messages['contactnotfound'] = 'Contactul solicitat nu a fost gasit.';
-$messages['sendingfailed'] = 'Nu s-a reusit trimiterea mesajului';
-$messages['errorsaving'] = 'A intervenit o eroare in timp ce se efectua salvarea';
-$messages['errormoving'] = 'Nu s-a putut muta mesajul';
-$messages['errordeleting'] = 'Nu s-a putut sterge mesajul';
-$messages['deletecontactconfirm'] = 'Sunteti sigur ca doriti sa stergeti contactul(ele) selectate?';
-$messages['deletemessagesconfirm'] = 'Chiar doriti sa stergeti mesajele selectate ?';
-$messages['deletefolderconfirm'] = 'Sunteti sigur ca doriti sa stergeti acest dosar?';
-$messages['purgefolderconfirm'] = 'Sunteti sigur ca doriti sa stergeti toate mesajele din acest dosar?';
-$messages['formincomplete'] = 'Formularul nu a fost completat corect';
-$messages['noemailwarning'] = 'Va rugam introduceti o adresa de e-mail valida';
-$messages['nonamewarning'] = 'Va rugam introduceti un nume';
-$messages['nopagesizewarning'] = 'Va rugam introduceti marimea paginii';
-$messages['norecipientwarning'] = 'Va rugam introduceti cel putin un destinatar';
-$messages['nosubjectwarning'] = 'Mesajul nu are subiect. Vreti sa introduceti unul acum?';
-$messages['nobodywarning'] = 'Trimiteti acest mesaj fara text?';
-$messages['notsentwarning'] = 'Mesajul nu a fost trimis. Vreti sa renuntatati la el?';
-$messages['noldapserver'] = 'Va rugam alegeti un server ldap pentru cautare';
-$messages['nocontactsreturned'] = 'Nu s-a gasit nici un contact';
-$messages['nosearchname'] = 'Va rugam introduceti un nume de contact sau adresa de e-mail';
-$messages['searchsuccessful'] = '$nr mesaje gasite';
-$messages['searchnomatch'] = 'Cautarea nu a returnat nici un rezultat';
-$messages['searching'] = 'Se cauta...';
-$messages['checking'] = 'Se verifica...';
-$messages['nospellerrors'] = 'Nu s-a gasit nicio greseala de ortografie';
-$messages['folderdeleted'] = 'Dosarul a fost sters cu succes';
-$messages['deletedsuccessfully'] = 'Mesaj sters cu succes !';
-$messages['converting'] = 'Resetez mesajul la parametrii initiali';
-$messages['messageopenerror'] = 'Nu am putut incarca mesajul din server';
-$messages['fileuploaderror'] = 'Incarcarea pe server a esuat';
-$messages['filesizeerror'] = 'Fisierul incarcat depaseste marimea de $size';
-$messages['copysuccess'] = 'Am copiat cu succes $nr de adrese';
-$messages['copyerror'] = 'Nu am putut copia nici o adresa';
-$messages['sourceisreadonly'] = 'Sursa adrese este "read-only"(se poate doar citi)';
-$messages['errorsavingcontact'] = 'Nu am putut salva adresa de contact';
-$messages['movingmessage'] = 'Mutare mesaj....';
-$messages['receiptsent'] = 'Confirmarea a fost trimisa cu succes';
-$messages['errorsendingreceipt'] = 'Confirmarea nu a putut fi trimisa';
-$messages['nodeletelastidentity'] = 'Nu putesti sterge aceasta identitate, este ultima.';
-$messages['addsubfolderhint'] = 'Acest dosar va fi creat ca subdosar al celui selectat.';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ro_RO/labels.inc b/program/localization/ro_RO/labels.inc
new file mode 100644 (file)
index 0000000..2ca0e5d
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ro/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Daniel Anechitoaie - danieLs <daniels@safereaction.ro>        |
+ |         Ispas Dorin <dorinxp2004@yahoo.com>                           |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1149 2008-02-28 19:52:09Z thomasb $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Bine ati venit la $product';
+$labels['username'] = 'Utilizator';
+$labels['password'] = 'Parola';
+$labels['server'] = 'Server';
+$labels['login'] = 'Autentificare';
+$labels['logout'] = 'Deconectare';
+$labels['mail'] = 'E-Mail';
+$labels['settings'] = 'Setari Personale';
+$labels['addressbook'] = 'Agenda';
+$labels['inbox'] = 'Primite';
+$labels['drafts'] = 'Ciorne';
+$labels['sent'] = 'Trimise';
+$labels['trash'] = 'Gunoi';
+$labels['junk'] = 'Junk';
+$labels['subject'] = 'Subiect';
+$labels['from'] = 'Expeditor';
+$labels['to'] = 'Destinatar';
+$labels['cc'] = 'Copie';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Raspunde-La';
+$labels['date'] = 'Data';
+$labels['size'] = 'Marime';
+$labels['priority'] = 'Prioritate';
+$labels['organization'] = 'Organizatie';
+$labels['reply-to'] = 'Raspunde-La';
+$labels['mailboxlist'] = 'Dosare';
+$labels['messagesfromto'] = 'Mesaje de la $from pana la $to din $count';
+$labels['messagenrof'] = '$nr mesaje din $count';
+$labels['moveto'] = 'muta in...';
+$labels['download'] = 'descarca';
+$labels['filename'] = 'Nume fisier';
+$labels['filesize'] = 'Marime fisier';
+$labels['preferhtml'] = 'Prefer HTML';
+$labels['htmlmessage'] = 'Mesaj HTML';
+$labels['prettydate'] = 'Data formatata';
+$labels['addtoaddressbook'] = 'Adauga in agenda';
+$labels['sun'] = 'Dum';
+$labels['mon'] = 'Lun';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mie';
+$labels['thu'] = 'Joi';
+$labels['fri'] = 'Vin';
+$labels['sat'] = 'Sam';
+$labels['sunday'] = 'Duminica';
+$labels['monday'] = 'Luni';
+$labels['tuesday'] = 'Marti';
+$labels['wednesday'] = 'Miercuri';
+$labels['thursday'] = 'Joi';
+$labels['friday'] = 'Vineri';
+$labels['saturday'] = 'Sambata';
+$labels['today'] = 'Astazi';
+$labels['checkmail'] = 'Verifica pentru mesaje noi';
+$labels['writenewmessage'] = 'Creaza mesaj nou';
+$labels['replytomessage'] = 'Raspunde la mesaj';
+$labels['replytoallmessage'] = 'Raspunde la toti';
+$labels['forwardmessage'] = 'Trimite mesajul mai departe';
+$labels['deletemessage'] = 'Trimite mesajul la gunoi';
+$labels['movemessagetotrash'] = 'Muta mesajul la gunoi';
+$labels['printmessage'] = 'Listeaza mesajul';
+$labels['previousmessage'] = 'Afiseaza mesajul anterior';
+$labels['previousmessages'] = 'Afiseaza setul anterior de mesaje';
+$labels['firstmessage'] = 'Afiseaza primul mesaj';
+$labels['firstmessages'] = 'Afiseaza primul set de mesaje';
+$labels['nextmessage'] = 'Afiseaza urmatorul mesaj';
+$labels['nextmessages'] = 'Afiseaza setul urmator de mesaje';
+$labels['lastmessage'] = 'Afiseaza ultimul mesaj';
+$labels['lastmessages'] = 'Afiseaza ultimul set de mesaje';
+$labels['backtolist'] = 'Inapoi la lista cu mesaje';
+$labels['viewsource'] = 'Afiseaza sursa';
+$labels['markmessages'] = 'Marcheaza mesajele';
+$labels['markread'] = 'Ca citit';
+$labels['markunread'] = 'Ca necitit';
+$labels['select'] = 'Selecteaza';
+$labels['all'] = 'Toate';
+$labels['none'] = 'Nici unul';
+$labels['unread'] = 'Necitite';
+$labels['compact'] = 'Compreseaza';
+$labels['empty'] = 'Goleste';
+$labels['purge'] = 'Curata';
+$labels['quota'] = 'Spatiu folosit';
+$labels['unknown'] = 'necunoscut';
+$labels['unlimited'] = 'nelimitat';
+$labels['quicksearch'] = 'Cautare rapida';
+$labels['resetsearch'] = 'Resetare cautare';
+$labels['compose'] = 'Compune mesaj';
+$labels['savemessage'] = 'Salveaza aceasta ciorna';
+$labels['sendmessage'] = 'Trimite mesaj';
+$labels['addattachment'] = 'Ataseaza fisier';
+$labels['charset'] = 'Set de caractere';
+$labels['editortype'] = 'Tip de editor';
+$labels['returnreceipt'] = 'Returneaza confirmare';
+$labels['checkspelling'] = 'Verifica ortografie';
+$labels['resumeediting'] = 'Reia editarea';
+$labels['revertto'] = 'Revina la';
+$labels['attachments'] = 'Atasamente';
+$labels['upload'] = 'Incarca';
+$labels['close'] = 'Inchide';
+$labels['low'] = 'Mica';
+$labels['lowest'] = 'Cea mai mica';
+$labels['normal'] = 'Normala';
+$labels['high'] = 'Mare';
+$labels['highest'] = 'Cea mai mare';
+$labels['nosubject'] = '(fara subiect)';
+$labels['showimages'] = 'Afiseaza imagini';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Text simplu';
+$labels['addcc'] = 'Adauga Cc';
+$labels['addbcc'] = 'Adauga Bcc';
+$labels['addreplyto'] = 'Adauga Raspunde-La';
+$labels['mdnrequest'] = 'Expeditorul acestui mesaj a solicitat sa fie notificat la cititrea mesajului. Doriti sa notificati expeditorul?';
+$labels['receiptread'] = 'Returneaza confirmare (citit)';
+$labels['yourmessage'] = 'Aceasta este o confirmare a mesajului dumneavoastra.';
+$labels['receiptnote'] = 'Nota: Aceasta confirmare doar va informeaza ca mesajul a fost afisat pe calculatorul destinatarului. Nu este nici o garantie ca destinatarul a citit sau a inteles continutul mesajului.';
+$labels['name'] = 'Nume de afisat';
+$labels['firstname'] = 'Nume';
+$labels['surname'] = 'Prenume';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Adauga contactul selectat in agenda';
+$labels['editcontact'] = 'Modifica contact';
+$labels['edit'] = 'Editeaza';
+$labels['cancel'] = 'Renunta';
+$labels['save'] = 'Salveaza';
+$labels['delete'] = 'Sterge';
+$labels['newcontact'] = 'Creaza contact nou';
+$labels['deletecontact'] = 'Sterge contactul selectat';
+$labels['composeto'] = 'Compune e-mail pentru';
+$labels['contactsfromto'] = 'Contacte de la $from pana la $to din $count';
+$labels['print'] = 'Listeaza';
+$labels['export'] = 'Exporta';
+$labels['previouspage'] = 'Pagina anterioara';
+$labels['firstpage'] = 'Arata primul set';
+$labels['nextpage'] = 'Pagina urmatoare';
+$labels['lastpage'] = 'Arata ultimul set';
+$labels['groups'] = 'Grupuri';
+$labels['personaladrbook'] = 'Adrese personale';
+$labels['settingsfor'] = 'Setari pentru';
+$labels['preferences'] = 'Preferinte';
+$labels['userpreferences'] = 'Preferinte utilizator';
+$labels['editpreferences'] = 'Modifica preferinte utilizator';
+$labels['identities'] = 'Identitati';
+$labels['manageidentities'] = 'Administreaza identitati pentru acest cont';
+$labels['newidentity'] = 'Identitate noua';
+$labels['newitem'] = 'Item nou';
+$labels['edititem'] = 'Editeaza item';
+$labels['setdefault'] = 'Seteaza implicit';
+$labels['language'] = 'Limba';
+$labels['timezone'] = 'Fus orar';
+$labels['pagesize'] = 'Randuri pe pagina';
+$labels['signature'] = 'Semnatura';
+$labels['dstactive'] = 'Daylight savings';
+$labels['htmleditor'] = 'Scrie mesaje HTML';
+$labels['htmlsignature'] = 'Semnatura HTML';
+$labels['previewpane'] = 'Arata preview';
+$labels['autosavedraft'] = 'Salveaza ciorna automat';
+$labels['everynminutes'] = 'fiecare $n minute';
+$labels['never'] = 'niciodata';
+$labels['folder'] = 'Dosar';
+$labels['folders'] = 'Dosare';
+$labels['foldername'] = 'Nume dosar';
+$labels['subscribed'] = 'Inscris';
+$labels['messagecount'] = 'Mesaje';
+$labels['create'] = 'Creaza';
+$labels['createfolder'] = 'Creaza dosar nou';
+$labels['rename'] = 'Redenumeste';
+$labels['renamefolder'] = 'Redenumeste dosar';
+$labels['deletefolder'] = 'Sterge dosar';
+$labels['managefolders'] = 'Administreaza dosare';
+$labels['sortby'] = 'Sorteaza dupa';
+$labels['sortasc'] = 'Sorteaza ascendent';
+$labels['sortdesc'] = 'Sorteaza descendent';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ro_RO/messages.inc b/program/localization/ro_RO/messages.inc
new file mode 100644 (file)
index 0000000..562bab7
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ro/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Daniel Anechitoaie - danieLs <daniels@safereaction.ro>        |
+ |         Ispas Dorin <dorinxp2004@yahoo.com>                           |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1149 2008-02-28 19:52:09Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Autentificare esuata';
+$messages['cookiesdisabled'] = 'Browserul dumneavoastra nu accepta cookies';
+$messages['sessionerror'] = 'Sesiunea dumneavoastra este invalida sau a expirat';
+$messages['imaperror'] = 'Conectarea la serverul IMAP a esuat';
+$messages['nomessagesfound'] = 'Nu a fost gasit nici un mesaj in aceasta casuta postala';
+$messages['loggedout'] = 'Sesiune incheiata cu succes. La revedere!';
+$messages['mailboxempty'] = 'Casuta postala este goala';
+$messages['loading'] = 'Se incarca...';
+$messages['loadingdata'] = 'Se incarca informatiile...';
+$messages['checkingmail'] = 'Verifica pentru mesaje noi...';
+$messages['sendingmessage'] = 'Trimitere mesaj...';
+$messages['messagesent'] = 'Mesajul a fost trimis cu succes!';
+$messages['savingmessage'] = 'Salvare mesaj...';
+$messages['messagesaved'] = 'Mesajul a fost salvat in Ciorne';
+$messages['successfullysaved'] = 'Salvarea s-a efectuat cu succes';
+$messages['addedsuccessfully'] = 'Contactul a fost adaugat cu succes in agenda';
+$messages['contactexists'] = 'Mai exista un contact cu aceasta adresa de e-mail';
+$messages['blockedimages'] = 'Pentru a va proteja intimitatea imaginile externe au fost blocate.';
+$messages['encryptedmessage'] = 'Acesta este un mesaj criptat si nu poate fi afisat. Ne pare rau.';
+$messages['nocontactsfound'] = 'Nu s-a gasit nici un contact';
+$messages['contactnotfound'] = 'Contactul solicitat nu a fost gasit.';
+$messages['sendingfailed'] = 'Nu s-a reusit trimiterea mesajului';
+$messages['errorsaving'] = 'A intervenit o eroare in timp ce se efectua salvarea';
+$messages['errormoving'] = 'Nu s-a putut muta mesajul';
+$messages['errordeleting'] = 'Nu s-a putut sterge mesajul';
+$messages['deletecontactconfirm'] = 'Sunteti sigur ca doriti sa stergeti contactul(ele) selectate?';
+$messages['deletemessagesconfirm'] = 'Chiar doriti sa stergeti mesajele selectate ?';
+$messages['deletefolderconfirm'] = 'Sunteti sigur ca doriti sa stergeti acest dosar?';
+$messages['purgefolderconfirm'] = 'Sunteti sigur ca doriti sa stergeti toate mesajele din acest dosar?';
+$messages['formincomplete'] = 'Formularul nu a fost completat corect';
+$messages['noemailwarning'] = 'Va rugam introduceti o adresa de e-mail valida';
+$messages['nonamewarning'] = 'Va rugam introduceti un nume';
+$messages['nopagesizewarning'] = 'Va rugam introduceti marimea paginii';
+$messages['norecipientwarning'] = 'Va rugam introduceti cel putin un destinatar';
+$messages['nosubjectwarning'] = 'Mesajul nu are subiect. Vreti sa introduceti unul acum?';
+$messages['nobodywarning'] = 'Trimiteti acest mesaj fara text?';
+$messages['notsentwarning'] = 'Mesajul nu a fost trimis. Vreti sa renuntatati la el?';
+$messages['noldapserver'] = 'Va rugam alegeti un server ldap pentru cautare';
+$messages['nocontactsreturned'] = 'Nu s-a gasit nici un contact';
+$messages['nosearchname'] = 'Va rugam introduceti un nume de contact sau adresa de e-mail';
+$messages['searchsuccessful'] = '$nr mesaje gasite';
+$messages['searchnomatch'] = 'Cautarea nu a returnat nici un rezultat';
+$messages['searching'] = 'Se cauta...';
+$messages['checking'] = 'Se verifica...';
+$messages['nospellerrors'] = 'Nu s-a gasit nicio greseala de ortografie';
+$messages['folderdeleted'] = 'Dosarul a fost sters cu succes';
+$messages['deletedsuccessfully'] = 'Mesaj sters cu succes !';
+$messages['converting'] = 'Resetez mesajul la parametrii initiali';
+$messages['messageopenerror'] = 'Nu am putut incarca mesajul din server';
+$messages['fileuploaderror'] = 'Incarcarea pe server a esuat';
+$messages['filesizeerror'] = 'Fisierul incarcat depaseste marimea de $size';
+$messages['copysuccess'] = 'Am copiat cu succes $nr de adrese';
+$messages['copyerror'] = 'Nu am putut copia nici o adresa';
+$messages['sourceisreadonly'] = 'Sursa adrese este "read-only"(se poate doar citi)';
+$messages['errorsavingcontact'] = 'Nu am putut salva adresa de contact';
+$messages['movingmessage'] = 'Mutare mesaj....';
+$messages['receiptsent'] = 'Confirmarea a fost trimisa cu succes';
+$messages['errorsendingreceipt'] = 'Confirmarea nu a putut fi trimisa';
+$messages['nodeletelastidentity'] = 'Nu putesti sterge aceasta identitate, este ultima.';
+$messages['addsubfolderhint'] = 'Acest dosar va fi creat ca subdosar al celui selectat.';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ru/labels.inc b/program/localization/ru/labels.inc
deleted file mode 100644 (file)
index a7ba517..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ru_RU/labels.inc                                             |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Maxim Zenin <maxx@webmechanics.ru>                            |
- |         Vladimir Kulev <me@lightoze.net>                              |
- |         Artur Smolkin <admin@roundcube.ru>                            |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1134 2008-02-22 15:05:18Z yllar $
-
-*/
-
-$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['movemessagetotrash'] = 'Переместить сообщение в корзину';
-$labels['printmessage'] = 'Печать';
-$labels['previousmessage'] = 'Показать предыдущее сообщение';
-$labels['previousmessages'] = 'Предыдущее';
-$labels['firstmessage'] = 'Показать первое сообщение';
-$labels['firstmessages'] = 'Первое сообщение';
-$labels['nextmessage'] = 'Показать следующее сообщение';
-$labels['nextmessages'] = 'Следующее';
-$labels['lastmessage'] = 'Показать последнее сообщение';
-$labels['lastmessages'] = 'Последнее сообщение';
-$labels['backtolist'] = 'К списку сообщений';
-$labels['viewsource'] = 'Исходный текст';
-$labels['markmessages'] = 'Отметить сообщение';
-$labels['markread'] = 'как прочитанное';
-$labels['markunread'] = 'как непрочитанное';
-$labels['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['savemessage'] = 'Сохранить черновик';
-$labels['sendmessage'] = 'Отправить сейчас';
-$labels['addattachment'] = 'Добавить вложение';
-$labels['charset'] = 'Кодировка';
-$labels['editortype'] = 'Редактор';
-$labels['returnreceipt'] = 'Запрос ответа';
-$labels['checkspelling'] = 'Проверить орфографию';
-$labels['resumeediting'] = 'Продолжить редактирование';
-$labels['revertto'] = 'Отменить правки';
-$labels['attachments'] = 'Вложения';
-$labels['upload'] = 'Загрузить';
-$labels['close'] = 'Закрыть';
-$labels['low'] = 'Низкий';
-$labels['lowest'] = 'Нижайш.';
-$labels['normal'] = 'Норм.';
-$labels['high'] = 'Высокий';
-$labels['highest'] = 'Высоч.';
-$labels['nosubject'] = '(без темы)';
-$labels['showimages'] = 'Показать изображения';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Обычный текст';
-$labels['addcc'] = 'Копия';
-$labels['addbcc'] = 'Скрытая копия';
-$labels['addreplyto'] = 'Обратный адрес';
-$labels['mdnrequest'] = 'Отправитель этого сообщения запросил уведомление о прочтении. Отправить уведомление?';
-$labels['receiptread'] = 'Уведомление о прочтении';
-$labels['yourmessage'] = 'Это уведомление о прочтении вашего сообщения';
-$labels['receiptnote'] = 'Это уведомление означает только, что сообщение было открыто получателем, и не гарантирует того, что оно было прочитано и (или) понято.';
-$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'] = 'Персональные адреса';
-$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['messagecount'] = 'сообщения';
-$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/ru/messages.inc b/program/localization/ru/messages.inc
deleted file mode 100644 (file)
index 8e54291..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/ru_RU/messages.inc                                           |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Maxim Zenin <maxx@webmechanics.ru>                            |
- |         Vladimir Kulev <me@lightoze.net>                              |
- |         Artur Smolkin <admin@roundcube.ru>                            |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1134 2008-02-22 15:05:18Z yllar $
-
-*/
-
-$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'] = 'Невозможно сохранить адрес контакта';
-$messages['movingmessage'] = 'Перемещение сообщения…';
-$messages['receiptsent'] = 'Уведомление о прочтении отправлено';
-$messages['errorsendingreceipt'] = 'Уведомление о прочтении не отправлено';
-$messages['nodeletelastidentity'] = 'Вы не можете удалить этот профиль, он у вас последний';
-$messages['addsubfolderhint'] = 'Эта папка будет создана как подпапка в текущей папке';
-
-?>
\ No newline at end of file
diff --git a/program/localization/ru_RU/labels.inc b/program/localization/ru_RU/labels.inc
new file mode 100644 (file)
index 0000000..7d89da1
--- /dev/null
@@ -0,0 +1,287 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ru_RU/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Maxim Zenin <maxx@webmechanics.ru>                            |
+ |         Vladimir Kulev <me@lightoze.net>                              |
+ |         Artur Smolkin <admin@roundcube.ru>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1429 2008-05-27 05:35:06Z alec $
+
+*/
+
+$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['junk'] = 'СПАМ';
+
+// 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'] = 'Суббота';
+
+// months short
+$labels['jan']    = 'Янв';
+$labels['feb']    = 'Фев';
+$labels['mar']    = 'Мар';
+$labels['apr']    = 'Апр';
+$labels['may']    = 'Май';
+$labels['jun']    = 'Июн';
+$labels['jul']    = 'Июл';
+$labels['aug']    = 'Авг';
+$labels['sep']    = 'Сен';
+$labels['oct']    = 'Окт';
+$labels['nov']    = 'Ноя';
+$labels['dec']    = 'Дек';
+
+// months long
+$labels['longjan']    = 'Январь';
+$labels['longfeb']    = 'Февраль';
+$labels['longmar']    = 'Март';
+$labels['longapr']    = 'Апрель';
+$labels['longmay']    = 'Май';
+$labels['longjun']    = 'Июнь';
+$labels['longjul']    = 'Июль';
+$labels['longaug']    = 'Август';
+$labels['longsep']    = 'Сентябрь';
+$labels['longoct']    = 'Октябрь';
+$labels['longnov']    = 'Ноябрь';
+$labels['longdec']    = 'Декабрь';
+
+$labels['today'] = 'Сегодня';
+
+// toolbar buttons
+$labels['checkmail'] = 'Доставить почту';
+$labels['writenewmessage'] = 'Новое сообщение';
+$labels['replytomessage'] = 'Ответить';
+$labels['replytoallmessage'] = 'Ответить всем';
+$labels['forwardmessage'] = 'Переслать';
+$labels['deletemessage'] = 'В корзину';
+$labels['movemessagetotrash'] = 'Переместить сообщение в корзину';
+$labels['printmessage'] = 'Печать';
+$labels['previousmessage'] = 'Показать предыдущее сообщение';
+$labels['previousmessages'] = 'Предыдущее';
+$labels['firstmessage'] = 'Показать первое сообщение';
+$labels['firstmessages'] = 'Первое сообщение';
+$labels['nextmessage'] = 'Показать следующее сообщение';
+$labels['nextmessages'] = 'Следующее';
+$labels['lastmessage'] = 'Показать последнее сообщение';
+$labels['lastmessages'] = 'Последнее сообщение';
+$labels['backtolist'] = 'К списку сообщений';
+$labels['viewsource'] = 'Исходный текст';
+$labels['markmessages'] = 'Отметить сообщение';
+$labels['markread'] = 'как прочитанное';
+$labels['markunread'] = 'как непрочитанное';
+
+$labels['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['savemessage'] = 'Сохранить черновик';
+$labels['sendmessage'] = 'Отправить сейчас';
+$labels['addattachment'] = 'Добавить вложение';
+$labels['charset'] = 'Кодировка';
+$labels['editortype'] = 'Редактор';
+$labels['returnreceipt'] = 'Запрос ответа';
+
+$labels['checkspelling'] = 'Проверить орфографию';
+$labels['resumeediting'] = 'Продолжить редактирование';
+$labels['revertto'] = 'Отменить правки';
+
+$labels['attachments'] = 'Вложения';
+$labels['upload'] = 'Загрузить';
+$labels['close'] = 'Закрыть';
+
+$labels['low'] = 'Низкий';
+$labels['lowest'] = 'Нижайш.';
+$labels['normal'] = 'Норм.';
+$labels['high'] = 'Высокий';
+$labels['highest'] = 'Высоч.';
+
+$labels['nosubject'] = '(без темы)';
+$labels['showimages'] = 'Показать изображения';
+
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Обычный текст';
+
+$labels['addcc'] = 'Копия';
+$labels['addbcc'] = 'Скрытая копия';
+$labels['addreplyto'] = 'Обратный адрес';
+
+// mdn
+$labels['mdnrequest'] = 'Отправитель этого сообщения запросил уведомление о прочтении. Отправить уведомление?';
+$labels['receiptread'] = 'Уведомление о прочтении';
+$labels['yourmessage'] = 'Это уведомление о прочтении вашего сообщения';
+$labels['receiptnote'] = 'Это уведомление означает только, что сообщение было открыто получателем, и не гарантирует того, что оно было прочитано и (или) понято.';
+
+// address book
+$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['logoutclear'] = 'Очищать корзину при выходе';
+$labels['logoutcompact'] = 'Сжать Входящие при выходе';
+$labels['uisettings'] = 'Пользовательский интерфейс';
+$labels['serversettings'] = 'Настройки сервера';
+$labels['mailboxview'] = 'Вид почтового ящика';
+$labels['mdnrequests'] = 'Уведомления о прочтении';
+$labels['askuser'] = 'спросить перед отправкой';
+$labels['autosend'] = 'отправлять автоматически';
+$labels['ignore'] = 'игнорировать';
+$labels['readwhendeleted'] = 'Помечать как прочитанное при удалении';
+$labels['flagfordeletion'] = 'Помечать "для удаления" вместо удаления';
+
+$labels['autosavedraft'] = 'Автосохранение черновика';
+$labels['everynminutes'] = 'каждые $n минут';
+$labels['never'] = 'никогда';
+
+$labels['folder'] = 'Папка';
+$labels['folders'] = 'Папки';
+$labels['foldername'] = 'Имя папки';
+$labels['subscribed'] = 'Подписан';
+$labels['messagecount'] = 'сообщения';
+$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/ru_RU/messages.inc b/program/localization/ru_RU/messages.inc
new file mode 100644 (file)
index 0000000..8e54291
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ru_RU/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Maxim Zenin <maxx@webmechanics.ru>                            |
+ |         Vladimir Kulev <me@lightoze.net>                              |
+ |         Artur Smolkin <admin@roundcube.ru>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1134 2008-02-22 15:05:18Z yllar $
+
+*/
+
+$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'] = 'Невозможно сохранить адрес контакта';
+$messages['movingmessage'] = 'Перемещение сообщения…';
+$messages['receiptsent'] = 'Уведомление о прочтении отправлено';
+$messages['errorsendingreceipt'] = 'Уведомление о прочтении не отправлено';
+$messages['nodeletelastidentity'] = 'Вы не можете удалить этот профиль, он у вас последний';
+$messages['addsubfolderhint'] = 'Эта папка будет создана как подпапка в текущей папке';
+
+?>
\ No newline at end of file
diff --git a/program/localization/se/labels.inc b/program/localization/se/labels.inc
deleted file mode 100644 (file)
index 3401309..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/se/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Fredrik Nygren <f.nygren@gmail.com>                           |
- |         Andreas Henriksson <andreas@fatal.se>                                                |
- |                Jonas Näsholm <hostmaster@bitfuse.net>                        |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Välkommen till $product';
-$labels['username'] = 'Användarnamn';
-$labels['password'] = 'Lösenord';
-$labels['server'] = 'Server';
-$labels['login'] = 'Logga in';
-$labels['logout'] = 'Logga ut';
-$labels['mail'] = 'Meddelanden';
-$labels['settings'] = 'Personliga inställningar';
-$labels['addressbook'] = 'Adressbok';
-$labels['inbox'] = 'Inkorg';
-$labels['drafts'] = 'Utkast';
-$labels['sent'] = 'Skickat';
-$labels['trash'] = 'Papperskorg';
-$labels['junk'] = 'Skräp';
-$labels['subject'] = 'Ämne';
-$labels['from'] = 'Avsändare';
-$labels['to'] = 'Mottagare';
-$labels['cc'] = 'Kopia';
-$labels['bcc'] = 'Hemlig kopia';
-$labels['replyto'] = 'Svara till';
-$labels['date'] = 'Datum';
-$labels['size'] = 'Storlek';
-$labels['priority'] = 'Prioritet';
-$labels['organization'] = 'Organisation';
-$labels['reply-to'] = 'Svara till';
-$labels['mailboxlist'] = 'Mappar';
-$labels['messagesfromto'] = 'Meddelande $from till $to av $count';
-$labels['messagenrof'] = 'Meddelande $nr av $count';
-$labels['moveto'] = 'flytta till...';
-$labels['download'] = 'ladda ner';
-$labels['filename'] = 'Filnamn';
-$labels['filesize'] = 'Filstorlek';
-$labels['preferhtml'] = 'Visa HTML';
-$labels['htmlmessage'] = 'HTML-meddelande';
-$labels['prettydate'] = 'Fina datum';
-$labels['addtoaddressbook'] = 'Lägg till i adressbok';
-$labels['sun'] = 'Sön';
-$labels['mon'] = 'Mån';
-$labels['tue'] = 'Tis';
-$labels['wed'] = 'Ons';
-$labels['thu'] = 'Tor';
-$labels['fri'] = 'Fre';
-$labels['sat'] = 'Lör';
-$labels['sunday'] = 'Söndag';
-$labels['monday'] = 'Måndag';
-$labels['tuesday'] = 'Tisdag';
-$labels['wednesday'] = 'Onsdag';
-$labels['thursday'] = 'Torsdag';
-$labels['friday'] = 'Fredag';
-$labels['saturday'] = 'Lördag';
-$labels['today'] = 'Idag';
-$labels['checkmail'] = 'Hämta nya meddelanden';
-$labels['writenewmessage'] = 'Skapa nytt meddelande';
-$labels['replytomessage'] = 'Svara avsändaren';
-$labels['replytoallmessage'] = 'Svara avsändaren och alla mottagare';
-$labels['forwardmessage'] = 'Vidarebefordra meddelande';
-$labels['deletemessage'] = 'Radera meddelande';
-$labels['movemessagetotrash'] = 'Flytta meddelande till papperskorgen';
-$labels['printmessage'] = 'Skriv ut';
-$labels['previousmessage'] = 'Visa föregående meddelande';
-$labels['previousmessages'] = 'Visa tidigare grupp av meddelanden';
-$labels['firstmessage'] = 'Visa första meddelandet';
-$labels['firstmessages'] = 'Visa första gruppen av meddelanden';
-$labels['nextmessage'] = 'Visa nästa meddelande';
-$labels['nextmessages'] = 'Visa nästa grupp av meddelanden';
-$labels['lastmessage'] = 'Visa sista meddelandet';
-$labels['lastmessages'] = 'Visa sista gruppen av meddelanden';
-$labels['backtolist'] = 'Tillbaka till meddelandelistan';
-$labels['viewsource'] = 'Visa källa';
-$labels['markmessages'] = 'Markera meddelande';
-$labels['markread'] = 'Som läst';
-$labels['markunread'] = 'Som oläst';
-$labels['select'] = 'Välj';
-$labels['all'] = 'Alla';
-$labels['none'] = 'Ingen';
-$labels['unread'] = 'Olästa';
-$labels['compact'] = 'Packa';
-$labels['empty'] = 'Töm';
-$labels['purge'] = 'Rensa';
-$labels['quota'] = 'Diskutrymme';
-$labels['unknown'] = 'okänd';
-$labels['unlimited'] = 'obegränsad';
-$labels['quicksearch'] = 'Snabbsök';
-$labels['resetsearch'] = 'Återställ sökning';
-$labels['compose'] = 'Skapa nytt meddelande';
-$labels['savemessage'] = 'Spara utkast';
-$labels['sendmessage'] = 'Skicka meddelande';
-$labels['addattachment'] = 'Bifoga fil';
-$labels['charset'] = 'Teckenkodning';
-$labels['editortype'] = 'Typ av redigerare';
-$labels['returnreceipt'] = 'Mottagarkvitto';
-$labels['checkspelling'] = 'Kontrollera stavning';
-$labels['resumeediting'] = 'Återuppta redigering';
-$labels['revertto'] = 'Återgå till';
-$labels['attachments'] = 'Bilagor';
-$labels['upload'] = 'Bifoga';
-$labels['close'] = 'Stäng';
-$labels['low'] = 'Låg';
-$labels['lowest'] = 'Lägst';
-$labels['normal'] = 'Normal';
-$labels['high'] = 'Hög';
-$labels['highest'] = 'Högst';
-$labels['nosubject'] = '(inget ämne)';
-$labels['showimages'] = 'Visa bilder';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Oformaterad text';
-$labels['addcc'] = 'Kopia';
-$labels['addbcc'] = 'Hemlig kopia';
-$labels['addreplyto'] = 'Svara till';
-$labels['mdnrequest'] = 'Avsändaren har bett om att bli uppmärksammad när du läst det här meddelandet. Vill du skicka uppmärksamma avsändaren?';
-$labels['receiptread'] = 'Svarskvitto (läst)';
-$labels['yourmessage'] = 'Det här är ett svarskvitto för ditt meddelande';
-$labels['receiptnote'] = 'Notera: Det här kvittot berättar bara att meddelandet visats på mottagarens dator. Det finns ingen garanti att mottagaren har läst och förstått innehållet i meddelandet';
-$labels['name'] = 'Visa namn';
-$labels['firstname'] = 'Förnamn';
-$labels['surname'] = 'Efternamn';
-$labels['email'] = 'E-post';
-$labels['addcontact'] = 'Lägg till ny kontakt';
-$labels['editcontact'] = 'Redigera kontakt';
-$labels['edit'] = 'Redigera';
-$labels['cancel'] = 'Avbryt';
-$labels['save'] = 'Spara';
-$labels['delete'] = 'Radera';
-$labels['newcontact'] = 'Skapa nytt kontaktkort';
-$labels['deletecontact'] = 'Radera valda kontakter';
-$labels['composeto'] = 'Skriv meddelande till';
-$labels['contactsfromto'] = 'Kontakter $from till $to av $count';
-$labels['print'] = 'Skriv ut';
-$labels['export'] = 'Exportera';
-$labels['previouspage'] = 'Visa föregående grupp';
-$labels['firstpage'] = 'Visa första gruppen';
-$labels['nextpage'] = 'Visa nästa grupp';
-$labels['lastpage'] = 'Visa sista gruppen';
-$labels['groups'] = 'Grupper';
-$labels['personaladrbook'] = 'Personliga adresser';
-$labels['settingsfor'] = 'Inställningar för';
-$labels['preferences'] = 'Inställningar';
-$labels['userpreferences'] = 'Användarinställningar';
-$labels['editpreferences'] = 'Ändra användarinställningar';
-$labels['identities'] = 'Profiler';
-$labels['manageidentities'] = 'Hantera profiler för detta konto';
-$labels['newidentity'] = 'Ny profil';
-$labels['newitem'] = 'Ny post';
-$labels['edititem'] = 'Ändra post';
-$labels['setdefault'] = 'Sätt som standard';
-$labels['language'] = 'Språk';
-$labels['timezone'] = 'Tidszon';
-$labels['pagesize'] = 'Rader per sida';
-$labels['signature'] = 'Signatur';
-$labels['dstactive'] = 'Sommartid';
-$labels['htmleditor'] = 'Skriv HTML-meddelanden';
-$labels['htmlsignature'] = 'HTML-signatur';
-$labels['previewpane'] = 'Visa delad vy i inbox';
-$labels['autosavedraft'] = 'Spara utkast automatiskt';
-$labels['everynminutes'] = 'var $n minut';
-$labels['never'] = 'aldrig';
-$labels['folder'] = 'Mapp';
-$labels['folders'] = 'Mappar';
-$labels['foldername'] = 'Mappnamn';
-$labels['subscribed'] = 'Ansluten';
-$labels['messagecount'] = 'Meddelanden';
-$labels['create'] = 'Skapa';
-$labels['createfolder'] = 'Skapa ny mapp';
-$labels['rename'] = 'Byt namn';
-$labels['renamefolder'] = 'Byt mappnamn';
-$labels['deletefolder'] = 'Radera mapp';
-$labels['managefolders'] = 'Hantera mappar';
-$labels['sortby'] = 'Sortera på';
-$labels['sortasc'] = 'Sortera stigande';
-$labels['sortdesc'] = 'Sortera fallande';
-
-?>
diff --git a/program/localization/se/messages.inc b/program/localization/se/messages.inc
deleted file mode 100644 (file)
index fa8a153..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/se/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Fredrik Nygren <f.nygren@gmail.com>                           |
- |         Andreas Henriksson <andreas@fatal.se>                                                |
- |                Jonas Näsholm <hostmaster@bitfuse.net>                        |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Inloggningen misslyckades';
-$messages['cookiesdisabled'] = 'Din webbläsare accepterar inte cookies';
-$messages['sessionerror'] = 'Din inloggning är felaktig eller har gått ut';
-$messages['imaperror'] = 'Kontakt med IMAP-servern misslyckades';
-$messages['nomessagesfound'] = 'Inga meddelanden';
-$messages['loggedout'] = 'Du är utloggad. Välkommen åter!';
-$messages['mailboxempty'] = 'Mappen är tom';
-$messages['loading'] = 'Laddar...';
-$messages['loadingdata'] = 'Laddar data...';
-$messages['checkingmail'] = 'Letar efter nya meddelanden...';
-$messages['sendingmessage'] = 'Skickar meddelande...';
-$messages['messagesent'] = 'Meddelandet har skickats';
-$messages['savingmessage'] = 'Sparar meddelande...';
-$messages['messagesaved'] = 'Meddelande sparades till utkast';
-$messages['successfullysaved'] = 'Sparat';
-$messages['addedsuccessfully'] = 'Kontakten har lagts till i adressboken';
-$messages['contactexists'] = 'En kontakt med den här adressen finns redan';
-$messages['blockedimages'] = 'För att skydda dig är bilder blockerade.';
-$messages['encryptedmessage'] = 'Meddelandet är krypterat och kan tyvärr inte visas.';
-$messages['nocontactsfound'] = 'Inga kontakter hittades';
-$messages['contactnotfound'] = 'Den efterfrågade kontanten hittades inte';
-$messages['sendingfailed'] = 'Meddelandet kunde inte skickas';
-$messages['errorsaving'] = 'Ett fel uppstod när meddelandet sparades';
-$messages['errormoving'] = 'Meddelandet kunde inte flyttas';
-$messages['errordeleting'] = 'Meddelandet kunde inte raderas';
-$messages['deletecontactconfirm'] = 'Vill du verkligen radera valda kontakter?';
-$messages['deletemessagesconfirm'] = 'Vill du verkligen ta bort valda meddelanden?';
-$messages['deletefolderconfirm'] = 'Vill du verkligen radera den här mappen?';
-$messages['purgefolderconfirm'] = 'Vill du verkligen radera alla meddelanden i den här mappen?';
-$messages['formincomplete'] = 'Formuläret var inte ifyllt i sin helhet';
-$messages['noemailwarning'] = 'Vänligen ange en giltig adress';
-$messages['nonamewarning'] = 'Vänligen ange ett namn';
-$messages['nopagesizewarning'] = 'Vänligen ange en sidstorlek';
-$messages['norecipientwarning'] = 'Vänligen ange minst en mottagare';
-$messages['nosubjectwarning'] = 'Ämnesfältet är tomt. Vill du lägga till något nu?';
-$messages['nobodywarning'] = 'Skicka det här meddelandet utan text?';
-$messages['notsentwarning'] = 'Meddelande har inte skickats. Vill du avbryta meddelandet?';
-$messages['noldapserver'] = 'Vänligen ange en LDAP-server att söka';
-$messages['nocontactsreturned'] = 'Inga kontakter hittades';
-$messages['nosearchname'] = 'Vänligen ange ett kontaktnamn eller en adress';
-$messages['searchsuccessful'] = '$nr meddelanden hittades';
-$messages['searchnomatch'] = 'Sökningen returnerade inga träffar';
-$messages['searching'] = 'Söker...';
-$messages['checking'] = 'Kontrollerar...';
-$messages['nospellerrors'] = 'Inget stavfel hittades';
-$messages['folderdeleted'] = 'Mappen raderades';
-$messages['deletedsuccessfully'] = 'Lyckad borttagning';
-$messages['converting'] = 'Tar bort formatering från meddelande...';
-$messages['messageopenerror'] = 'Kunde inte ladda meddelande från servern';
-$messages['fileuploaderror'] = 'Filuppladdning misslyckades';
-$messages['filesizeerror'] = 'Den uppladdade filen överstiger maxstorleken $size';
-$messages['copysuccess'] = 'Lyckad kopiering av $nr adresser';
-$messages['copyerror'] = 'Kunde inte kopiera några adresser';
-$messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad';
-$messages['errorsavingcontact'] = 'Kunde inte spara kontakt-adressen';
-$messages['movingmessage'] = 'Flyttar meddelande...';
-$messages['receiptsent'] = 'Ett läskvitto har skickats';
-$messages['errorsendingreceipt'] = 'Kunde inte skicka läskvittot';
-$messages['nodeletelastidentity'] = 'Du kan inte radera den här identiteten, det är din sista.';
-$messages['addsubfolderhint'] = 'Den här mappen kommer att skapas som en underkatalog till den valda';
-
-?>
\ No newline at end of file
diff --git a/program/localization/si/labels.inc b/program/localization/si/labels.inc
deleted file mode 100644 (file)
index 4bd6306..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | language/si/labels.inc                                                |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\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'] = 'පනිවුඩය $count න් $nr ';\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['markmessages'] = 'පණිවුඩ';\r
-$labels['markread'] = 'කියවු ලෙස සළකුණු කරන්න';\r
-$labels['markunread'] = 'නොකියවු ලෙස සළකුණු කරන්න';\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'] = 'Cc එක් කරන්න';\r
-$labels['addbcc'] = 'Bcc එක් කරන්න';\r
-$labels['addreplyto'] = '\'පිළිතුරු සඳහා\' එක් කරන්න';\r
-$labels['mdnrequest'] = 'මෙම පණිවුඩය එවන්නා ඔබ එය කියවු බව අසයි. එය දැන්වීමට ඔබ කැමතිද?';\r
-$labels['receiptread'] = 'ලැබීම් ලදුපත (කියවීම)';\r
-$labels['yourmessage'] = 'මෙය ඔබගේ පණිවුඩයේ ලැබීම් ලදුපතයි';\r
-$labels['receiptnote'] = 'සටහන: ලැබීම් ලදුපත මගින් මෙම පණිවුඩය කියවූ බව හෝ තේරුම් ගත් බව ගම්‍ය නොවේ. පණිවුඩය ලබන්නාට පෙන්නුම් කල බවටට සාක්ෂියක් පමණි';\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['messagecount'] = 'පනිවුඩ';\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
-?>
\ No newline at end of file
diff --git a/program/localization/si/messages.inc b/program/localization/si/messages.inc
deleted file mode 100644 (file)
index 3729cba..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/si/messages.inc                                              |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed'] = 'ඇතුල්වීම අසාර්ථකයි';\r
-$messages['cookiesdisabled'] = 'ඔබේ බෞසරය කුකී බාර ගන්නේ නැත';\r
-$messages['sessionerror'] = 'ඔබේ වාරය අවලංගු හෝ කාලය ඉකුත් වී ඇත';\r
-$messages['imaperror'] = 'IMAP සම්බන්ධතාවය අසාර්ථකයි';\r
-$messages['nomessagesfound'] = 'ලියුම් පෙට්ටියේ පනිවුඩ නැත';\r
-$messages['loggedout'] = 'ඔබගේ වාරය සාර්ථකව අවසන් විය. අයුබොවන්!';\r
-$messages['mailboxempty'] = 'ලියුම් පෙට්ටිය හිස්';\r
-$messages['loading'] = 'පූරනය...';\r
-$messages['loadingdata'] = 'දත්ත පූරනය...';\r
-$messages['checkingmail'] = 'අලුත් පනිවුඩ පරීක්ෂා කිරීම...';\r
-$messages['sendingmessage'] = 'පනිවුඩය යැවීම...';\r
-$messages['messagesent'] = 'පනිවුඩය සාර්ථකව යවන ලදී';\r
-$messages['savingmessage'] = 'පනිවුඩය තැන්පත් කීරීම...';\r
-$messages['messagesaved'] = 'පනිවුඩය කටු සටහනේ තැන්පත් විය';\r
-$messages['successfullysaved'] = 'සාර්ථකව තැන්පත විය';\r
-$messages['addedsuccessfully'] = 'ලිපිනය සාර්ථකව ලිපින පොතට එකතු කරන ලදී';\r
-$messages['contactexists'] = 'ඉහත ලිපිනය සහිත විද්යුත් තැපැල් ලිපිනයක් ලිපින පොතේ ඇත';\r
-$messages['blockedimages'] = 'ඔබගෙ පොද්ගලිකත්වය හේතුවෙන්, දුරස්ථ රූප අවහිර කර ඇත.';\r
-$messages['encryptedmessage'] = 'මෙම පනිවුඩය රහස් කේතනය කර ඇති බැවින් පෙන්විය නොහැක. සමාවන්න!';\r
-$messages['nocontactsfound'] = 'ලිපින සොයා ගත නොහැක';\r
-$messages['contactnotfound'] = 'ඉල්ලූ ලිපිනය සොයාගත නොහැක';\r
-$messages['sendingfailed'] = 'පනිවුඩය යැවීම අසාර්ථකයි';\r
-$messages['errorsaving'] = 'පනිවුඩය තැන්පත් කීරීමේදී දොෂයක් සිදු විය';\r
-$messages['errormoving'] = 'පනිවුඩය ගෙන යාමට නොහැක';\r
-$messages['errordeleting'] = 'පනිවුඩය මකා දැමීමට නොහැක';\r
-$messages['deletecontactconfirm'] = 'තෝරා ඇති ලිපින ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
-$messages['deletemessagesconfirm'] = 'තෝරා ඇත පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
-$messages['deletefolderconfirm'] = 'ෆෝල්ඩරය මකා දැමීමට සැබවින්ම වුවමනාද?';\r
-$messages['purgefolderconfirm'] = 'මෙම ෆෝල්ඩරයේ ඇති සියලුම පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
-$messages['formincomplete'] = 'පෝරමය සම්පූර්ණයෙන් පුරවා නොමැත';\r
-$messages['noemailwarning'] = 'කරුණාකර වලංගු විද්යුත් තැපැල් ලිපිනයක් ඇතුලත් කරන්න';\r
-$messages['nonamewarning'] = 'කරුණාකර නම ඇතුලත් කරන්න';\r
-$messages['nopagesizewarning'] = 'කරුණාකර පිටුවේ ප්රමානය ඇතුලත් කරන්න';\r
-$messages['norecipientwarning'] = 'කරුණාකර යටත් පිරිසෙයින් එක් ලබන්නෙකු හෝ ඇතුලත් කරන්න';\r
-$messages['nosubjectwarning'] = '"මාතෘකාව" හිස්. මාතෘකාවක් අතුලත් කිරීමට ඔබ කැමතිද?';\r
-$messages['nobodywarning'] = 'මෙම හිස් පනිවුඩය යවන්නද?';\r
-$messages['notsentwarning'] = 'පනිවුඩය යැවීමට නොහැකි විය. ඔබට එය බැහැර කිරීමට වුවමනාද?';\r
-$messages['noldapserver'] = 'සෙවුම සඳහා කරුණාකර ldap සම්බන්ධතාවයක් තෝරා ගන්න';\r
-$messages['nocontactsreturned'] = 'ලිපින/ය සොයා ගත නොහැක';\r
-$messages['nosearchname'] = 'කරුණාකර ලිපිනයෙහි නම හෝ විද්යුත් තැපැල් ලිපිනය ඇතුලත් කරන්න';\r
-$messages['searchsuccessful'] = '$nr පනිවුඩය හමු විය';\r
-$messages['searchnomatch'] = 'සෙවුමට අදාල ගැලපීමක් නොමැත';\r
-$messages['searching'] = 'සොයමින් පවතී...';\r
-$messages['checking'] = 'පිරික්සමින් පවතී...';\r
-$messages['nospellerrors'] = 'වියාකරන දොෂ නොමැත';\r
-$messages['folderdeleted'] = 'ෆෝල්ඩරය සාර්ථකව මකා දමන ලදී';\r
-$messages['deletedsuccessfully'] = 'සාර්ථකව මකා දමන ලදී';\r
-$messages['converting'] = 'පනිවුඩයෙන් ආකෘතීකරණය ඉවත් කිරීම';\r
-$messages['messageopenerror'] = 'පනිවුඩය පූරනය කිරීමට නොහැක';\r
-$messages['fileuploaderror'] = 'ගොනුව ඇතුලත් කිරීමට නොහැක';\r
-$messages['filesizeerror'] = 'ඇතුලත් කල ගොනුවෙ ප්රමාණය උපරිම අගය $size ඉක්මවා ඇත';\r
-$messages['copysuccess'] = '$nr ලිපිනය සාර්ථකව පිටපත් කරන ලදී';\r
-$messages['copyerror'] = 'කවර ලිපිනයක්වත් හෝ පිටපත් කල නොහැක';\r
-$messages['sourceisreadonly'] = 'මෙම ලිපින මූලාශ්රය කියවීම සඳහා පමනි';\r
-$messages['errorsavingcontact'] = 'ලිපිනය තැන්පත් කීරීමට නොහැක';\r
-$messages['movingmessage'] = 'පනිවුඩය ගෙනයමින් පවතී...';\r
-$messages['receiptsent'] = 'කියවීම් භාර ගැනීම සාර්ථකව යවන ලදී';\r
-$messages['errorsendingreceipt'] = 'කියවීම් භාර ගැනීම යැවීමට නොහැක';\r
-$messages['nodeletelastidentity'] = 'අවසාන අනන්‍යතාවය මකා දැමිය නොහැක';\r
-$messages['addsubfolderhint'] = 'ෆෝල්ඩරය දැනට තෝරාගෙන ඇති ෆෝල්ඩරයෙහි අනු ෆෝල්ඩරයක් ලෙස සෑදේ';\r
-\r
-?>
\ No newline at end of file
diff --git a/program/localization/si_LK/labels.inc b/program/localization/si_LK/labels.inc
new file mode 100644 (file)
index 0000000..4bd6306
--- /dev/null
@@ -0,0 +1,191 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/si/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\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'] = 'පනිවුඩය $count න් $nr ';\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['markmessages'] = 'පණිවුඩ';\r
+$labels['markread'] = 'කියවු ලෙස සළකුණු කරන්න';\r
+$labels['markunread'] = 'නොකියවු ලෙස සළකුණු කරන්න';\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'] = 'Cc එක් කරන්න';\r
+$labels['addbcc'] = 'Bcc එක් කරන්න';\r
+$labels['addreplyto'] = '\'පිළිතුරු සඳහා\' එක් කරන්න';\r
+$labels['mdnrequest'] = 'මෙම පණිවුඩය එවන්නා ඔබ එය කියවු බව අසයි. එය දැන්වීමට ඔබ කැමතිද?';\r
+$labels['receiptread'] = 'ලැබීම් ලදුපත (කියවීම)';\r
+$labels['yourmessage'] = 'මෙය ඔබගේ පණිවුඩයේ ලැබීම් ලදුපතයි';\r
+$labels['receiptnote'] = 'සටහන: ලැබීම් ලදුපත මගින් මෙම පණිවුඩය කියවූ බව හෝ තේරුම් ගත් බව ගම්‍ය නොවේ. පණිවුඩය ලබන්නාට පෙන්නුම් කල බවටට සාක්ෂියක් පමණි';\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['messagecount'] = 'පනිවුඩ';\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
+?>
\ No newline at end of file
diff --git a/program/localization/si_LK/messages.inc b/program/localization/si_LK/messages.inc
new file mode 100644 (file)
index 0000000..3729cba
--- /dev/null
@@ -0,0 +1,81 @@
+<?\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/si/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'ඇතුල්වීම අසාර්ථකයි';\r
+$messages['cookiesdisabled'] = 'ඔබේ බෞසරය කුකී බාර ගන්නේ නැත';\r
+$messages['sessionerror'] = 'ඔබේ වාරය අවලංගු හෝ කාලය ඉකුත් වී ඇත';\r
+$messages['imaperror'] = 'IMAP සම්බන්ධතාවය අසාර්ථකයි';\r
+$messages['nomessagesfound'] = 'ලියුම් පෙට්ටියේ පනිවුඩ නැත';\r
+$messages['loggedout'] = 'ඔබගේ වාරය සාර්ථකව අවසන් විය. අයුබොවන්!';\r
+$messages['mailboxempty'] = 'ලියුම් පෙට්ටිය හිස්';\r
+$messages['loading'] = 'පූරනය...';\r
+$messages['loadingdata'] = 'දත්ත පූරනය...';\r
+$messages['checkingmail'] = 'අලුත් පනිවුඩ පරීක්ෂා කිරීම...';\r
+$messages['sendingmessage'] = 'පනිවුඩය යැවීම...';\r
+$messages['messagesent'] = 'පනිවුඩය සාර්ථකව යවන ලදී';\r
+$messages['savingmessage'] = 'පනිවුඩය තැන්පත් කීරීම...';\r
+$messages['messagesaved'] = 'පනිවුඩය කටු සටහනේ තැන්පත් විය';\r
+$messages['successfullysaved'] = 'සාර්ථකව තැන්පත විය';\r
+$messages['addedsuccessfully'] = 'ලිපිනය සාර්ථකව ලිපින පොතට එකතු කරන ලදී';\r
+$messages['contactexists'] = 'ඉහත ලිපිනය සහිත විද්යුත් තැපැල් ලිපිනයක් ලිපින පොතේ ඇත';\r
+$messages['blockedimages'] = 'ඔබගෙ පොද්ගලිකත්වය හේතුවෙන්, දුරස්ථ රූප අවහිර කර ඇත.';\r
+$messages['encryptedmessage'] = 'මෙම පනිවුඩය රහස් කේතනය කර ඇති බැවින් පෙන්විය නොහැක. සමාවන්න!';\r
+$messages['nocontactsfound'] = 'ලිපින සොයා ගත නොහැක';\r
+$messages['contactnotfound'] = 'ඉල්ලූ ලිපිනය සොයාගත නොහැක';\r
+$messages['sendingfailed'] = 'පනිවුඩය යැවීම අසාර්ථකයි';\r
+$messages['errorsaving'] = 'පනිවුඩය තැන්පත් කීරීමේදී දොෂයක් සිදු විය';\r
+$messages['errormoving'] = 'පනිවුඩය ගෙන යාමට නොහැක';\r
+$messages['errordeleting'] = 'පනිවුඩය මකා දැමීමට නොහැක';\r
+$messages['deletecontactconfirm'] = 'තෝරා ඇති ලිපින ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['deletemessagesconfirm'] = 'තෝරා ඇත පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['deletefolderconfirm'] = 'ෆෝල්ඩරය මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['purgefolderconfirm'] = 'මෙම ෆෝල්ඩරයේ ඇති සියලුම පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['formincomplete'] = 'පෝරමය සම්පූර්ණයෙන් පුරවා නොමැත';\r
+$messages['noemailwarning'] = 'කරුණාකර වලංගු විද්යුත් තැපැල් ලිපිනයක් ඇතුලත් කරන්න';\r
+$messages['nonamewarning'] = 'කරුණාකර නම ඇතුලත් කරන්න';\r
+$messages['nopagesizewarning'] = 'කරුණාකර පිටුවේ ප්රමානය ඇතුලත් කරන්න';\r
+$messages['norecipientwarning'] = 'කරුණාකර යටත් පිරිසෙයින් එක් ලබන්නෙකු හෝ ඇතුලත් කරන්න';\r
+$messages['nosubjectwarning'] = '"මාතෘකාව" හිස්. මාතෘකාවක් අතුලත් කිරීමට ඔබ කැමතිද?';\r
+$messages['nobodywarning'] = 'මෙම හිස් පනිවුඩය යවන්නද?';\r
+$messages['notsentwarning'] = 'පනිවුඩය යැවීමට නොහැකි විය. ඔබට එය බැහැර කිරීමට වුවමනාද?';\r
+$messages['noldapserver'] = 'සෙවුම සඳහා කරුණාකර ldap සම්බන්ධතාවයක් තෝරා ගන්න';\r
+$messages['nocontactsreturned'] = 'ලිපින/ය සොයා ගත නොහැක';\r
+$messages['nosearchname'] = 'කරුණාකර ලිපිනයෙහි නම හෝ විද්යුත් තැපැල් ලිපිනය ඇතුලත් කරන්න';\r
+$messages['searchsuccessful'] = '$nr පනිවුඩය හමු විය';\r
+$messages['searchnomatch'] = 'සෙවුමට අදාල ගැලපීමක් නොමැත';\r
+$messages['searching'] = 'සොයමින් පවතී...';\r
+$messages['checking'] = 'පිරික්සමින් පවතී...';\r
+$messages['nospellerrors'] = 'වියාකරන දොෂ නොමැත';\r
+$messages['folderdeleted'] = 'ෆෝල්ඩරය සාර්ථකව මකා දමන ලදී';\r
+$messages['deletedsuccessfully'] = 'සාර්ථකව මකා දමන ලදී';\r
+$messages['converting'] = 'පනිවුඩයෙන් ආකෘතීකරණය ඉවත් කිරීම';\r
+$messages['messageopenerror'] = 'පනිවුඩය පූරනය කිරීමට නොහැක';\r
+$messages['fileuploaderror'] = 'ගොනුව ඇතුලත් කිරීමට නොහැක';\r
+$messages['filesizeerror'] = 'ඇතුලත් කල ගොනුවෙ ප්රමාණය උපරිම අගය $size ඉක්මවා ඇත';\r
+$messages['copysuccess'] = '$nr ලිපිනය සාර්ථකව පිටපත් කරන ලදී';\r
+$messages['copyerror'] = 'කවර ලිපිනයක්වත් හෝ පිටපත් කල නොහැක';\r
+$messages['sourceisreadonly'] = 'මෙම ලිපින මූලාශ්රය කියවීම සඳහා පමනි';\r
+$messages['errorsavingcontact'] = 'ලිපිනය තැන්පත් කීරීමට නොහැක';\r
+$messages['movingmessage'] = 'පනිවුඩය ගෙනයමින් පවතී...';\r
+$messages['receiptsent'] = 'කියවීම් භාර ගැනීම සාර්ථකව යවන ලදී';\r
+$messages['errorsendingreceipt'] = 'කියවීම් භාර ගැනීම යැවීමට නොහැක';\r
+$messages['nodeletelastidentity'] = 'අවසාන අනන්‍යතාවය මකා දැමිය නොහැක';\r
+$messages['addsubfolderhint'] = 'ෆෝල්ඩරය දැනට තෝරාගෙන ඇති ෆෝල්ඩරයෙහි අනු ෆෝල්ඩරයක් ලෙස සෑදේ';\r
+\r
+?>
\ No newline at end of file
diff --git a/program/localization/sk/labels.inc b/program/localization/sk/labels.inc
deleted file mode 100644 (file)
index 14ef06d..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/sk/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Marek Kutnar <marek19@zmail.sk>                               |
- |         Lukas Kraic  <lukas.kraic@truni.sk>                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 1153 2008-02-28 20:04:12Z thomasb $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Vitajte v $product';
-$labels['username'] = 'Prihlasovacie meno';
-$labels['password'] = 'Heslo';
-$labels['server'] = 'Server';
-$labels['login'] = 'Prihlásiť';
-$labels['logout'] = 'Odhlásiť';
-$labels['mail'] = 'E-Mail';
-$labels['settings'] = 'Osobné nastavenia';
-$labels['addressbook'] = 'Adresár';
-$labels['inbox'] = 'Doručená pošta';
-$labels['drafts'] = 'Rozpísané';
-$labels['sent'] = 'Odoslané';
-$labels['trash'] = 'Kôš';
-$labels['junk'] = 'Nevyžiadaná pošta';
-$labels['subject'] = 'Predmet';
-$labels['from'] = 'Odosielateľ';
-$labels['to'] = 'Adresát';
-$labels['cc'] = 'Kópia';
-$labels['bcc'] = 'Tajná kópia';
-$labels['replyto'] = 'Odpovedať na';
-$labels['date'] = 'Dátum';
-$labels['size'] = 'Veľkosť';
-$labels['priority'] = 'Priorita';
-$labels['organization'] = 'Organizácia';
-$labels['reply-to'] = 'Odpovedať na';
-$labels['mailboxlist'] = 'Adresár';
-$labels['messagesfromto'] = 'Správy od $from do $to z $count';
-$labels['messagenrof'] = 'Správa $nr z $count';
-$labels['moveto'] = 'presunúť do...';
-$labels['download'] = 'stiahnuť';
-$labels['filename'] = 'Meno súboru';
-$labels['filesize'] = 'Veľkosť súboru';
-$labels['preferhtml'] = 'Uprednostniť HTML zobrazenie';
-$labels['htmlmessage'] = 'HTML správa';
-$labels['prettydate'] = 'Krajší dátum';
-$labels['addtoaddressbook'] = 'Pridaj do adresára';
-$labels['sun'] = 'Ned';
-$labels['mon'] = 'Pon';
-$labels['tue'] = 'Uto';
-$labels['wed'] = 'Str';
-$labels['thu'] = 'Štv';
-$labels['fri'] = 'Pia';
-$labels['sat'] = 'Sob';
-$labels['sunday'] = 'Nedeľa';
-$labels['monday'] = 'Pondelok';
-$labels['tuesday'] = 'Utorok';
-$labels['wednesday'] = 'Streda';
-$labels['thursday'] = 'Štvrtok';
-$labels['friday'] = 'Piatok';
-$labels['saturday'] = 'Sobota';
-$labels['today'] = 'Dnes';
-$labels['checkmail'] = 'Skontroluj nové správy';
-$labels['writenewmessage'] = 'Vytvor novú správu';
-$labels['replytomessage'] = 'Odpovedať';
-$labels['replytoallmessage'] = 'Odpovedať všetkým';
-$labels['forwardmessage'] = 'Poslať ďalej';
-$labels['deletemessage'] = 'Zmazať správu';
-$labels['movemessagetotrash'] = 'Presunúť správu do koša';
-$labels['printmessage'] = 'Vytlač správu';
-$labels['previousmessage'] = 'Zobraziť predchádzajúcu správu';
-$labels['previousmessages'] = 'Zobraziť predchádzajúcu stránku správ';
-$labels['firstmessage'] = 'Zobraziť prvú správu';
-$labels['firstmessages'] = 'Zobraziť prvú stránku správ';
-$labels['nextmessage'] = 'Zobraziť ďalšiu správu';
-$labels['nextmessages'] = 'Zobraziť ďalšiu stránku správ';
-$labels['lastmessage'] = 'Zobraziť poslednú správu';
-$labels['lastmessages'] = 'Zobraziť poslednú stránku správ';
-$labels['backtolist'] = 'Späť na zoznam správ';
-$labels['viewsource'] = 'Ukáž zdroj správy';
-$labels['markmessages'] = 'Označ správy';
-$labels['markread'] = 'Ako prečítané';
-$labels['markunread'] = 'Ako neprečítané';
-$labels['select'] = 'Výber';
-$labels['all'] = 'Všetky';
-$labels['none'] = 'Žiadnu';
-$labels['unread'] = 'Neprečítané';
-$labels['compact'] = 'Kompaktné';
-$labels['empty'] = 'Prázdne';
-$labels['purge'] = 'Vyprázdniť';
-$labels['quota'] = 'Využitie schránky';
-$labels['unknown'] = 'neznáme';
-$labels['unlimited'] = 'neobmedzené';
-$labels['quicksearch'] = 'Rýchle vyhľadávanie';
-$labels['resetsearch'] = 'Vyčisti vyhľadávanie';
-$labels['compose'] = 'Vytvoriť správu';
-$labels['savemessage'] = 'Uložiť do rozpísaných';
-$labels['sendmessage'] = 'Odoslať správu';
-$labels['addattachment'] = 'Pridať prílohu';
-$labels['charset'] = 'Znaková sada';
-$labels['editortype'] = 'Typ editora';
-$labels['returnreceipt'] = 'Doručenka';
-$labels['checkspelling'] = 'Skontroluj pravopis';
-$labels['resumeediting'] = 'Pokračovať v úpravách';
-$labels['revertto'] = 'Vrátiť sa na';
-$labels['attachments'] = 'Prílohy';
-$labels['upload'] = 'Nahrať';
-$labels['close'] = 'Zatvor';
-$labels['low'] = 'Nízka';
-$labels['lowest'] = 'Najnižšia';
-$labels['normal'] = 'Normálna';
-$labels['high'] = 'Vysoká';
-$labels['highest'] = 'Najvyššia';
-$labels['nosubject'] = '(bez predmetu)';
-$labels['showimages'] = 'Ukáž obrázky';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Čisty text';
-$labels['addcc'] = 'Pridať kópiu';
-$labels['addbcc'] = 'Pridať skrytú kopiu';
-$labels['addreplyto'] = 'Pridať odpoveď';
-$labels['mdnrequest'] = 'Odosielateľ tejto správy chce byť upozornený na to, že ste správu obdržali. Chcete potvrdiť prijatie správy?';
-$labels['receiptread'] = 'Potvrdenie o prijatí správy';
-$labels['yourmessage'] = 'Toto je potvrdenie o prijatí Vašej správy';
-$labels['receiptnote'] = 'Poznámka: Toto potvrdenie negarantuje, že správa bola príjemcom prečítaná a porozumel jej obsahu.';
-$labels['name'] = 'Celé meno';
-$labels['firstname'] = 'Meno';
-$labels['surname'] = 'Priezvisko';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Pridaj nový kontakt';
-$labels['editcontact'] = 'Uprav kontakt';
-$labels['edit'] = 'Uprav';
-$labels['cancel'] = 'Zruš';
-$labels['save'] = 'Ulož';
-$labels['delete'] = 'Zmaž';
-$labels['newcontact'] = 'Vytvor nový kontakt';
-$labels['deletecontact'] = 'Zmaž zvolené kontakty';
-$labels['composeto'] = 'Vytvor správu';
-$labels['contactsfromto'] = 'Kontakty od $from do $to z $count';
-$labels['print'] = 'Tlač';
-$labels['export'] = 'Export';
-$labels['previouspage'] = 'Predchádzajúca stránka';
-$labels['firstpage'] = 'Prvá stránka';
-$labels['nextpage'] = 'Nasledujúca stránka';
-$labels['lastpage'] = 'Posledná stránka';
-$labels['groups'] = 'Skupiny';
-$labels['personaladrbook'] = 'Osobné adresy';
-$labels['settingsfor'] = 'Nastavenia pre';
-$labels['preferences'] = 'Vlastnosti';
-$labels['userpreferences'] = 'Užívateľské vlastnosti';
-$labels['editpreferences'] = 'Uprav užívateľské vlastnosti';
-$labels['identities'] = 'Profily';
-$labels['manageidentities'] = 'Spravovať profily pre tento účet';
-$labels['newidentity'] = 'Nový profil';
-$labels['newitem'] = 'Nová položka';
-$labels['edititem'] = 'Uprav položku';
-$labels['setdefault'] = 'Obnoviť pôvodné';
-$labels['language'] = 'Jazyk';
-$labels['timezone'] = 'Časová zóna';
-$labels['pagesize'] = 'Riadky na stránku';
-$labels['signature'] = 'Podpis';
-$labels['dstactive'] = 'Letný čas';
-$labels['htmleditor'] = 'Vytvoriť HTML správu';
-$labels['htmlsignature'] = 'HTML podpis';
-$labels['previewpane'] = 'Ukáž náhlad výplne';
-$labels['autosavedraft'] = 'Automaticky ulož koncept';
-$labels['everynminutes'] = 'každých $n minút';
-$labels['never'] = 'nikdy';
-$labels['folder'] = 'Zložka';
-$labels['folders'] = 'Zložky';
-$labels['foldername'] = 'Meno zložky';
-$labels['subscribed'] = 'Podpísaný';
-$labels['messagecount'] = 'Počet správ';
-$labels['create'] = 'Vytvoriť';
-$labels['createfolder'] = 'Vytvor novú zložku';
-$labels['rename'] = 'Premenovať';
-$labels['renamefolder'] = 'Premenovať zložku';
-$labels['deletefolder'] = 'Zmaž zložku';
-$labels['managefolders'] = 'Spravovať zložky';
-$labels['sortby'] = 'Triediť podľa';
-$labels['sortasc'] = 'Triediť vzostupne';
-$labels['sortdesc'] = 'Triediť zostupne';
-
-?>
diff --git a/program/localization/sk/messages.inc b/program/localization/sk/messages.inc
deleted file mode 100644 (file)
index 9556810..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/sk/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Marek Kutnar <marek19@zmail.sk>                               |
- |         Lukas Kraic  <lukas.kraic@truni.sk>                           |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 1153 2008-02-28 20:04:12Z thomasb $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Chybné prihlásenie';
-$messages['cookiesdisabled'] = 'Váš internetový prehliadač nepodporuje cookies, ktoré sú potrebné pre prihlásenie';
-$messages['sessionerror'] = 'Vaše prihlásenie je neplatné alebo vypršala jeho platnosť';
-$messages['imaperror'] = 'Nepodarilo sa spojiť s IMAP serverom';
-$messages['nomessagesfound'] = 'Vo Vašej schránke nie je žiadna správa';
-$messages['loggedout'] = 'Odhlásenie prebehlo úspešne. Dovidenia.';
-$messages['mailboxempty'] = 'Schránka je prázdna';
-$messages['loading'] = 'Nahrávam...';
-$messages['loadingdata'] = 'Nahrávam údaje...';
-$messages['checkingmail'] = 'Kontrolujem nové správy...';
-$messages['sendingmessage'] = 'Posielam správu...';
-$messages['messagesent'] = 'Správa bola odoslaná';
-$messages['savingmessage'] = 'Ukladám správu...';
-$messages['messagesaved'] = 'Správa bola uložená do Nedokončené';
-$messages['successfullysaved'] = 'Uložené';
-$messages['addedsuccessfully'] = 'Kontakt bol pridaný do adresára';
-$messages['contactexists'] = 'Kontakt s touto e-mailovou adresou už existuje';
-$messages['blockedimages'] = 'Z bezpečnostných dôvodov sú v správe zablokované obrázky.';
-$messages['encryptedmessage'] = 'Táto správa je zakryptovaná, a nie je možné ju zobraziť!';
-$messages['nocontactsfound'] = 'Nemáte žiadne kontakty';
-$messages['contactnotfound'] = 'Požadovaný kontakt nebol nájdený';
-$messages['sendingfailed'] = 'Odosielanie správy zlyhalo';
-$messages['errorsaving'] = 'Vyskytla sa chyba pri ukladaní';
-$messages['errormoving'] = 'Nemôžem presunúť správu';
-$messages['errordeleting'] = 'Nemôžem zmazať správu';
-$messages['deletecontactconfirm'] = 'Ste si istý, že chcete zmazať zvolený(é) konakt(y)?';
-$messages['deletemessagesconfirm'] = 'Ste si istý, že chcete zmazať zvolenú(é) správu(y)?';
-$messages['deletefolderconfirm'] = 'Ste si istý, že chcete zmazať túto zložku?';
-$messages['purgefolderconfirm'] = 'Ste si istý, že chcete zmazať všetky správy v tejto zložke?';
-$messages['formincomplete'] = 'Formulár nie je kompletne vyplnený';
-$messages['noemailwarning'] = 'Prosím vložte platnú emailovú adresu';
-$messages['nonamewarning'] = 'Prosím zadajte meno';
-$messages['nopagesizewarning'] = 'Prosím zadajte počet strán';
-$messages['norecipientwarning'] = 'Prosím vložte aspoň jedného adresáta';
-$messages['nosubjectwarning'] = 'Predmet správy je prázdny. Chcete ho teraz zadať?';
-$messages['nobodywarning'] = 'Chcete odoslať správu bez textu?';
-$messages['notsentwarning'] = 'Správa nebola odoslaná, chcete ju zrušiť?';
-$messages['noldapserver'] = 'Prosím zvoľ LDAP server pre vyhľadávanie';
-$messages['nocontactsreturned'] = 'Neboli nájdené žiadne kontakty';
-$messages['nosearchname'] = 'Prosím vložte meno alebo emailovú adresu';
-$messages['searchsuccessful'] = '$nr správa(y) nájdené';
-$messages['searchnomatch'] = 'Hľadaný výraz nebol nájdený';
-$messages['searching'] = 'Hľadám...';
-$messages['checking'] = 'Kontrolujem...';
-$messages['nospellerrors'] = 'Pri kontrole pravopisu neboli nájdene chyby';
-$messages['folderdeleted'] = 'Adresár bol zmazaný';
-$messages['deletedsuccessfully'] = 'Úspešne zmazané';
-$messages['converting'] = 'Odstraňujem formátovanie zo správy...';
-$messages['messageopenerror'] = 'Nemôžem nahrať správu zo servera';
-$messages['fileuploaderror'] = 'Nahrávanie súboru neuspešné';
-$messages['filesizeerror'] = 'Nahrávaný súbor prekročil maximálnu velkost $size';
-$messages['copysuccess'] = 'Úspešne skopírovanie $nr adries';
-$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';
-$messages['movingmessage'] = 'Presúvam správu...';
-$messages['receiptsent'] = 'Potvrdenie o prijatí správy odoslané';
-$messages['errorsendingreceipt'] = 'Potvrdenie o prijatí správy nebolo možné odoslať';
-$messages['nodeletelastidentity'] = 'Identita sa nedá odstrániť, je posledná a musí zostať.';
-$messages['addsubfolderhint'] = 'Táto zložka bude vytvorená ako podzložka aktualne zvolenej zložky';
-
-?>
diff --git a/program/localization/sk_SK/labels.inc b/program/localization/sk_SK/labels.inc
new file mode 100644 (file)
index 0000000..81b398a
--- /dev/null
@@ -0,0 +1,229 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/sk/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Marek Kutnar <marek19@zmail.sk>                               |
+|         Lukas Kraic  <lukas.kraic@truni.sk>                           |
+|         Peter Mann   <peter.mann@tuke.sk>                             |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 1462 2008-06-01 15:40:16Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Vitajte v $product';
+$labels['username'] = 'Prihlasovacie meno';
+$labels['password'] = 'Heslo';
+$labels['server'] = 'Server';
+$labels['login'] = 'Prihlásiť';
+$labels['logout'] = 'Odhlásiť';
+$labels['mail'] = 'E-Mail';
+$labels['settings'] = 'Osobné nastavenia';
+$labels['addressbook'] = 'Adresár';
+$labels['inbox'] = 'Doručená pošta';
+$labels['drafts'] = 'Rozpísané';
+$labels['sent'] = 'Odoslané';
+$labels['trash'] = 'Kôš';
+$labels['junk'] = 'Nevyžiadaná pošta';
+$labels['subject'] = 'Predmet';
+$labels['from'] = 'Odosielateľ';
+$labels['to'] = 'Adresát';
+$labels['cc'] = 'Kópia';
+$labels['bcc'] = 'Tajná kópia';
+$labels['replyto'] = 'Odpovedať na';
+$labels['date'] = 'Dátum';
+$labels['size'] = 'Veľkosť';
+$labels['priority'] = 'Priorita';
+$labels['organization'] = 'Organizácia';
+$labels['reply-to'] = 'Odpovedať na';
+$labels['mailboxlist'] = 'Adresár';
+$labels['messagesfromto'] = 'Správy od $from do $to z $count';
+$labels['messagenrof'] = 'Správa $nr z $count';
+$labels['moveto'] = 'presunúť do...';
+$labels['download'] = 'stiahnuť';
+$labels['filename'] = 'Meno súboru';
+$labels['filesize'] = 'Veľkosť súboru';
+$labels['preferhtml'] = 'Uprednostniť HTML zobrazenie';
+$labels['htmlmessage'] = 'HTML správa';
+$labels['prettydate'] = 'Krajší dátum';
+$labels['addtoaddressbook'] = 'Pridať do adresára';
+$labels['sun'] = 'Ne';
+$labels['mon'] = 'Po';
+$labels['tue'] = 'Ut';
+$labels['wed'] = 'St';
+$labels['thu'] = 'Št';
+$labels['fri'] = 'Pi';
+$labels['sat'] = 'So';
+$labels['sunday'] = 'Nedeľa';
+$labels['monday'] = 'Pondelok';
+$labels['tuesday'] = 'Utorok';
+$labels['wednesday'] = 'Streda';
+$labels['thursday'] = 'Štvrtok';
+$labels['friday'] = 'Piatok';
+$labels['saturday'] = 'Sobota';
+$labels['jan'] = 'Jan';
+$labels['feb'] = 'Feb';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'Máj';
+$labels['jun'] = 'Jún';
+$labels['jul'] = 'Júl';
+$labels['aug'] = 'Aug';
+$labels['sep'] = 'Sep';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Nov';
+$labels['dec'] = 'Dec';
+$labels['longjan'] = 'Január';
+$labels['longfeb'] = 'Február';
+$labels['longmar'] = 'Marec';
+$labels['longapr'] = 'Apríl';
+$labels['longmay'] = 'Máj';
+$labels['longjun'] = 'Jún';
+$labels['longjul'] = 'Júl';
+$labels['longaug'] = 'August';
+$labels['longsep'] = 'September';
+$labels['longoct'] = 'Október';
+$labels['longnov'] = 'November';
+$labels['longdec'] = 'December';
+$labels['today'] = 'Dnes';
+$labels['checkmail'] = 'Skontrolovať nové správy';
+$labels['writenewmessage'] = 'Vytvoriť novú správu';
+$labels['replytomessage'] = 'Odpovedať';
+$labels['replytoallmessage'] = 'Odpovedať všetkým';
+$labels['forwardmessage'] = 'Poslať ďalej';
+$labels['deletemessage'] = 'Zmazať správu';
+$labels['movemessagetotrash'] = 'Presunúť správu do koša';
+$labels['printmessage'] = 'Vytlačiť správu';
+$labels['previousmessage'] = 'Zobraziť predchádzajúcu správu';
+$labels['previousmessages'] = 'Zobraziť predchádzajúcu stránku správ';
+$labels['firstmessage'] = 'Zobraziť prvú správu';
+$labels['firstmessages'] = 'Zobraziť prvú stránku správ';
+$labels['nextmessage'] = 'Zobraziť ďalšiu správu';
+$labels['nextmessages'] = 'Zobraziť ďalšiu stránku správ';
+$labels['lastmessage'] = 'Zobraziť poslednú správu';
+$labels['lastmessages'] = 'Zobraziť poslednú stránku správ';
+$labels['backtolist'] = 'Späť na zoznam správ';
+$labels['viewsource'] = 'Ukázať zdroj správy';
+$labels['markmessages'] = 'Označiť správy';
+$labels['markread'] = 'Ako prečítané';
+$labels['markunread'] = 'Ako neprečítané';
+$labels['select'] = 'Výber';
+$labels['all'] = 'Všetky';
+$labels['none'] = 'Žiadne';
+$labels['unread'] = 'Neprečítané';
+$labels['compact'] = 'Kompaktné';
+$labels['empty'] = 'Prázdne';
+$labels['purge'] = 'Vyprázdniť';
+$labels['quota'] = 'Zaplnenie schránky';
+$labels['unknown'] = 'neznáme';
+$labels['unlimited'] = 'neobmedzené';
+$labels['quicksearch'] = 'Rýchle vyhľadávanie';
+$labels['resetsearch'] = 'Vyčistiť vyhľadávanie';
+$labels['compose'] = 'Vytvoriť správu';
+$labels['savemessage'] = 'Uložiť do rozpísaných';
+$labels['sendmessage'] = 'Odoslať správu';
+$labels['addattachment'] = 'Pridať prílohu';
+$labels['charset'] = 'Znaková sada';
+$labels['editortype'] = 'Typ editora';
+$labels['returnreceipt'] = 'Potvrdenie o doručení';
+$labels['checkspelling'] = 'Skontrolovať pravopis';
+$labels['resumeediting'] = 'Pokračovať v úpravách';
+$labels['revertto'] = 'Vrátiť sa na';
+$labels['attachments'] = 'Prílohy';
+$labels['upload'] = 'Nahrať';
+$labels['close'] = 'Zatvoriť';
+$labels['low'] = 'Nízka';
+$labels['lowest'] = 'Najnižšia';
+$labels['normal'] = 'Normálna';
+$labels['high'] = 'Vysoká';
+$labels['highest'] = 'Najvyššia';
+$labels['nosubject'] = '(bez predmetu)';
+$labels['showimages'] = 'Ukázať obrázky';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Čistý text';
+$labels['addcc'] = 'Pridať kópiu';
+$labels['addbcc'] = 'Pridať skrytú kopiu';
+$labels['addreplyto'] = 'Pridať odpoveď';
+$labels['mdnrequest'] = 'Odosielateľ tejto správy chce byť upozornený na to, že ste správu obdržali. Chcete potvrdiť prijatie správy?';
+$labels['receiptread'] = 'Potvrdenie o prijatí správy';
+$labels['yourmessage'] = 'Toto je potvrdenie o prijatí Vašej správy';
+$labels['receiptnote'] = 'Poznámka: Toto potvrdenie negarantuje, že správa bola príjemcom prečítaná a porozumel jej obsahu.';
+$labels['name'] = 'Celé meno';
+$labels['firstname'] = 'Meno';
+$labels['surname'] = 'Priezvisko';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Pridať nový kontakt';
+$labels['editcontact'] = 'Upraviť kontakt';
+$labels['edit'] = 'Upraviť';
+$labels['cancel'] = 'Zrušiť';
+$labels['save'] = 'Uložiť';
+$labels['delete'] = 'Zmazať';
+$labels['newcontact'] = 'Vytvoriť nový kontakt';
+$labels['deletecontact'] = 'Zmazať zvolené kontakty';
+$labels['composeto'] = 'Vytvoriť správu pre';
+$labels['contactsfromto'] = 'Kontakty od $from do $to z $count';
+$labels['print'] = 'Tlač';
+$labels['export'] = 'Export';
+$labels['previouspage'] = 'Predchádzajúca stránka';
+$labels['firstpage'] = 'Prvá stránka';
+$labels['nextpage'] = 'Nasledujúca stránka';
+$labels['lastpage'] = 'Posledná stránka';
+$labels['groups'] = 'Skupiny';
+$labels['personaladrbook'] = 'Osobné adresy';
+$labels['settingsfor'] = 'Nastavenia pre';
+$labels['preferences'] = 'Vlastnosti';
+$labels['userpreferences'] = 'Používateľské nastavenia';
+$labels['editpreferences'] = 'Upraviť používateľské nastavenia';
+$labels['identities'] = 'Profily';
+$labels['manageidentities'] = 'Spravovať profily pre tento účet';
+$labels['newidentity'] = 'Nový profil';
+$labels['newitem'] = 'Nová položka';
+$labels['edititem'] = 'Upraviť položku';
+$labels['setdefault'] = 'Obnoviť pôvodné';
+$labels['language'] = 'Jazyk';
+$labels['timezone'] = 'Časová zóna';
+$labels['pagesize'] = 'Riadky na stránku';
+$labels['signature'] = 'Podpis';
+$labels['dstactive'] = 'Letný čas';
+$labels['htmleditor'] = 'Vytvoriť HTML správu';
+$labels['htmlsignature'] = 'HTML podpis';
+$labels['previewpane'] = 'Ukázať náhľad';
+$labels['logoutclear'] = 'Vyprázdniť kôš pri odhlásení';
+$labels['logoutcompact'] = 'Zhustiť priečinok Doručená pošta pri odhlásení';
+$labels['uisettings'] = 'Používateľské rozhranie';
+$labels['serversettings'] = 'Nastavenia servera';
+$labels['mailboxview'] = 'Pohľad na schránku';
+$labels['mdnrequests'] = 'Upozornenia odosielateľovi';
+$labels['askuser'] = 'spýtať sa používateľa';
+$labels['autosend'] = 'poslať automaticky';
+$labels['ignore'] = 'ignorovať';
+$labels['readwhendeleted'] = 'Označiť správu ';
+$labels['flagfordeletion'] = 'Pri odstránení správy iba označiť správu ako odstránenú';
+$labels['autosavedraft'] = 'Automaticky uložiť koncept';
+$labels['everynminutes'] = 'každých $n minút';
+$labels['never'] = 'nikdy';
+$labels['folder'] = 'Priečinok';
+$labels['folders'] = 'Priečinky';
+$labels['foldername'] = 'Názov priečinku';
+$labels['subscribed'] = 'Prihlásený k odberu';
+$labels['messagecount'] = 'Počet správ';
+$labels['create'] = 'Vytvoriť';
+$labels['createfolder'] = 'Vytvor nový priečinok';
+$labels['rename'] = 'Premenovať';
+$labels['renamefolder'] = 'Premenovať priečinok';
+$labels['deletefolder'] = 'Zmazať priečinok';
+$labels['managefolders'] = 'Spravovať priečinky';
+$labels['sortby'] = 'Triediť podľa';
+$labels['sortasc'] = 'Triediť vzostupne';
+$labels['sortdesc'] = 'Triediť zostupne';
+
+?>
diff --git a/program/localization/sk_SK/messages.inc b/program/localization/sk_SK/messages.inc
new file mode 100644 (file)
index 0000000..cf3f97b
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/sk/messages.inc                                              |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Marek Kutnar <marek19@zmail.sk>                               |
+|         Lukas Kraic  <lukas.kraic@truni.sk>                           |
+|         Peter Mann   <peter.mann@tuke.sk>                             |
++-----------------------------------------------------------------------+
+
+@version $Id: messages.inc 1462 2008-06-01 15:40:16Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Chybné prihlásenie';
+$messages['cookiesdisabled'] = 'Váš internetový prehliadač nepodporuje cookies, ktoré sú potrebné pre prihlásenie';
+$messages['sessionerror'] = 'Vaše prihlásenie je neplatné alebo vypršala jeho platnosť';
+$messages['imaperror'] = 'Nepodarilo sa spojiť s IMAP serverom';
+$messages['nomessagesfound'] = 'Vo Vašej schránke nie je žiadna správa';
+$messages['loggedout'] = 'Odhlásenie prebehlo úspešne. Dovidenia.';
+$messages['mailboxempty'] = 'Schránka je prázdna';
+$messages['loading'] = 'Načítava sa...';
+$messages['loadingdata'] = 'Načítavajú sa údaje...';
+$messages['checkingmail'] = 'Kontrolujú sa nové správy...';
+$messages['sendingmessage'] = 'Správa sa odosiela...';
+$messages['messagesent'] = 'Správa bola úspešne odoslaná';
+$messages['savingmessage'] = 'Správa sa ukladá...';
+$messages['messagesaved'] = 'Správa bola uložená medzi Rozpísané správy';
+$messages['successfullysaved'] = 'Úspešne uložená';
+$messages['addedsuccessfully'] = 'Kontakt bol pridaný do adresára';
+$messages['contactexists'] = 'Kontakt s touto e-mailovou adresou už existuje';
+$messages['blockedimages'] = 'Z bezpečnostných dôvodov sú v správe zablokované obrázky.';
+$messages['encryptedmessage'] = 'Táto správa je zašifrovaná, a nie je možné ju zobraziť!';
+$messages['nocontactsfound'] = 'Nemáte žiadne kontakty';
+$messages['contactnotfound'] = 'Požadovaný kontakt nebol nájdený';
+$messages['sendingfailed'] = 'Odosielanie správy zlyhalo';
+$messages['errorsaving'] = 'Vyskytla sa chyba pri ukladaní';
+$messages['errormoving'] = 'Správa sa nedá presunúť';
+$messages['errordeleting'] = 'Správa sa nedá zmazať';
+$messages['deletecontactconfirm'] = 'Ste si istý, že chcete zmazať zvolený(é) kontakt(y)?';
+$messages['deletemessagesconfirm'] = 'Ste si istý, že chcete zmazať zvolenú(é) správu(y)?';
+$messages['deletefolderconfirm'] = 'Ste si istý, že chcete zmazať tento priečinok?';
+$messages['purgefolderconfirm'] = 'Ste si istý, že chcete zmazať všetky správy v tomto priečinku?';
+$messages['formincomplete'] = 'Formulár nie je kompletne vyplnený';
+$messages['noemailwarning'] = 'Prosím, vložte platnú emailovú adresu';
+$messages['nonamewarning'] = 'Prosím, zadajte meno';
+$messages['nopagesizewarning'] = 'Prosím, zadajte veľkosť strany';
+$messages['norecipientwarning'] = 'Prosím, vložte aspoň jedného príjemcu';
+$messages['nosubjectwarning'] = 'Predmet správy je prázdny. Chcete ho teraz zadať?';
+$messages['nobodywarning'] = 'Chcete odoslať správu bez textu?';
+$messages['notsentwarning'] = 'Správa nebola odoslaná, chcete ju zrušiť?';
+$messages['noldapserver'] = 'Prosím, zvoľte LDAP server na vyhľadávanie';
+$messages['nocontactsreturned'] = 'Neboli nájdené žiadne kontakty';
+$messages['nosearchname'] = 'Prosím vložte meno alebo emailovú adresu';
+$messages['searchsuccessful'] = 'nájdených $nr správ';
+$messages['searchnomatch'] = 'Hľadaný výraz nebol nájdený';
+$messages['searching'] = 'Vyhľadáva sa...';
+$messages['checking'] = 'Kontroluje sa...';
+$messages['nospellerrors'] = 'Pri kontrole pravopisu neboli nájdené chyby';
+$messages['folderdeleted'] = 'Priečinok bol zmazaný';
+$messages['deletedsuccessfully'] = 'Úspešne zmazané';
+$messages['converting'] = 'Odstraňuje sa formátovanie správy...';
+$messages['messageopenerror'] = 'Nedá sa načítať správa zo servera';
+$messages['fileuploaderror'] = 'Načítanie súboru nebolo úspešné';
+$messages['filesizeerror'] = 'Načítavaný súbor prekročil maximálnu veľkosť $size';
+$messages['copysuccess'] = 'Úspešne sa skopírovalo $nr adries';
+$messages['copyerror'] = 'Nedá sa kopírovať žiadna adresa';
+$messages['sourceisreadonly'] = 'Tento zdroj adries je len na čítanie';
+$messages['errorsavingcontact'] = 'Nedá sa uložiť adresa kontaktu';
+$messages['movingmessage'] = 'Správa sa presúva...';
+$messages['receiptsent'] = 'Potvrdenie o prijatí správy bolo odoslané';
+$messages['errorsendingreceipt'] = 'Potvrdenie o prijatí správy sa nedalo odoslať';
+$messages['nodeletelastidentity'] = 'Identita sa nedá odstrániť, je posledná a musí zostať.';
+$messages['addsubfolderhint'] = 'Tento priečinok bude vytvorený ako podpriečinok aktuálne zvoleného priečinka';
+$messages['forbiddencharacter'] = 'Názov priečinka obsahuje nepovolený znak';
+
+?>
diff --git a/program/localization/sl/labels.inc b/program/localization/sl/labels.inc
deleted file mode 100644 (file)
index 98e7fa9..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-/*
-
-+-----------------------------------------------------------------------+
-| language/sl/labels.inc                                                |
-|                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
-| Licensed under the GNU GPL                                            |
-|                                                                       |
-+-----------------------------------------------------------------------+
-| Author: Andrej Sossi <asossi@dotcom.ts.it>                            |
-|         Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
-+-----------------------------------------------------------------------+
-
-@version $Id: labels.inc 1109 2008-02-17 20:22:05Z thomasb $
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Dobrodošel v $product';
-$labels['username'] = 'Uporabniško ime';
-$labels['password'] = 'Geslo';
-$labels['server'] = 'Strežnik';
-$labels['login'] = 'Prijava';
-$labels['logout'] = 'Odjava';
-$labels['mail'] = 'E-Pošta';
-$labels['settings'] = 'Osebne nastavitve';
-$labels['addressbook'] = 'Stiki';
-$labels['inbox'] = 'Prejeto';
-$labels['drafts'] = 'Osnutki';
-$labels['sent'] = 'Poslano';
-$labels['trash'] = 'Smeti';
-$labels['junk'] = 'Nezaželena  sporočila';
-$labels['subject'] = 'Zadeva';
-$labels['from'] = 'Pošiljatelj';
-$labels['to'] = 'Prejemnik';
-$labels['cc'] = 'Kp';
-$labels['bcc'] = 'Skp';
-$labels['replyto'] = 'Odgovor na';
-$labels['date'] = 'Datum';
-$labels['size'] = 'Velikost';
-$labels['priority'] = 'Prioriteta';
-$labels['organization'] = 'Organizacija';
-$labels['reply-to'] = 'Odgovor na';
-$labels['mailboxlist'] = 'Mape';
-$labels['messagesfromto'] = 'Sporočila $from do $to od $count';
-$labels['messagenrof'] = 'Sporočilo $nr od $count';
-$labels['moveto'] = 'premakni v...';
-$labels['download'] = 'prenesi';
-$labels['filename'] = 'Ime datoteke';
-$labels['filesize'] = 'Velikost datoteke';
-$labels['preferhtml'] = 'Prednostno HTML';
-$labels['htmlmessage'] = 'HTML sporočilo';
-$labels['prettydate'] = 'Bolj čitljivi datumi';
-$labels['addtoaddressbook'] = 'Dodaj v stike';
-$labels['sun'] = 'Ned';
-$labels['mon'] = 'Pon';
-$labels['tue'] = 'Tor';
-$labels['wed'] = 'Sre';
-$labels['thu'] = 'Čet';
-$labels['fri'] = 'Pet';
-$labels['sat'] = 'Sob';
-$labels['sunday'] = 'Nedelja';
-$labels['monday'] = 'Ponedeljek';
-$labels['tuesday'] = 'Torek';
-$labels['wednesday'] = 'Sreda';
-$labels['thursday'] = 'Četrtek';
-$labels['friday'] = 'Petek';
-$labels['saturday'] = 'Sobota';
-$labels['today'] = 'Danes';
-$labels['checkmail'] = 'Preglej nova sporočila';
-$labels['writenewmessage'] = 'Novo sporočilo';
-$labels['replytomessage'] = 'Odgovori na sporočilo';
-$labels['replytoallmessage'] = 'Odgovori pošiljatelju in vsem prejemnikom';
-$labels['forwardmessage'] = 'Posreduj sporočilo';
-$labels['deletemessage'] = 'Premakni sporočilo v smeti';
-$labels['movemessagetotrash'] = 'Premakni v smetnjak';
-$labels['printmessage'] = 'Natisni to sporočilo';
-$labels['previousmessage'] = 'Prikaži prejšnje sporočilo';
-$labels['previousmessages'] = 'Prikaži prejšnja sporočila';
-$labels['firstmessage'] = 'Prikaži prvo sporočilo';
-$labels['firstmessages'] = 'Prikaži prva sporočila';
-$labels['nextmessage'] = 'Prikaži naslednjo sporočilo';
-$labels['nextmessages'] = 'Prikaži naslednja sporočila';
-$labels['lastmessage'] = 'Prikaži zadnjo sporočilo';
-$labels['lastmessages'] = 'Prikaži zadnja sporočila';
-$labels['backtolist'] = 'Nazaj na seznam sporočil';
-$labels['viewsource'] = 'Prikaži izvirno kodo';
-$labels['markmessages'] = 'Označi sporočilo';
-$labels['markread'] = 'Kot prebrano';
-$labels['markunread'] = 'Kot neprebrano';
-$labels['select'] = 'Izberi';
-$labels['all'] = 'Vse';
-$labels['none'] = 'Nobenih';
-$labels['unread'] = 'Neprebrano';
-$labels['compact'] = 'Stisni';
-$labels['empty'] = 'Izprazni';
-$labels['purge'] = 'Počisti';
-$labels['quota'] = 'Poraba diska';
-$labels['unknown'] = 'neznana';
-$labels['unlimited'] = 'neomejena';
-$labels['quicksearch'] = 'Hitri iskalnik';
-$labels['resetsearch'] = 'Prekliči iskanje';
-$labels['compose'] = 'Sestavi sporočilo';
-$labels['savemessage'] = 'Shrani kot osnutek';
-$labels['sendmessage'] = 'Pošlji sporočilo zdaj';
-$labels['addattachment'] = 'Pripni datoteko';
-$labels['charset'] = 'Nabor znakov';
-$labels['editortype'] = 'Vrsta urejevalnika';
-$labels['returnreceipt'] = 'Potrdilo prejemnika';
-$labels['checkspelling'] = 'Preglej pravopis';
-$labels['resumeediting'] = 'Nadaljuj z urejanjem';
-$labels['revertto'] = 'Razveljavi';
-$labels['attachments'] = 'Priponke';
-$labels['upload'] = 'Naloži';
-$labels['close'] = 'Zapri';
-$labels['low'] = 'Nizka';
-$labels['lowest'] = 'Najnižja';
-$labels['normal'] = 'Normalna';
-$labels['high'] = 'Visoka';
-$labels['highest'] = 'Najvišja';
-$labels['nosubject'] = '(brez naslova)';
-$labels['showimages'] = 'Prikaži slike';
-$labels['htmltoggle'] = 'Obogateno besedilo (HTML)';
-$labels['plaintoggle'] = 'Samo besedilo';
-$labels['addcc'] = 'Dodaj Kp';
-$labels['addbcc'] = 'Dodaj Skp';
-$labels['addreplyto'] = 'Dodaj naslov za odgovor';
-$labels['mdnrequest'] = 'Pošiljatelj tega sporočila je zaprosil za portdilo, ko vi preberete to sporočilo. Hočete poslati obvestilo?';
-$labels['receiptread'] = 'Potrdilo o prebranem sporočilu';
-$labels['yourmessage'] = 'To je potrdilo, da je bilo vaše sporočilo prebrano';
-$labels['receiptnote'] = 'Pozor: to je samo potrdilo, da vaše sporočilo je bilo prikazano na prejemnikovem računalniku. To še ne pomeni, da je prejemnik prebral ali razumel vsebino vašega sporočila.';
-$labels['name'] = 'Ime za prikaz';
-$labels['firstname'] = 'Ime';
-$labels['surname'] = 'Priimek';
-$labels['email'] = 'E-Pošta';
-$labels['addcontact'] = 'Dodaj izbrane stike v imenik';
-$labels['editcontact'] = 'Uredi vizitko';
-$labels['edit'] = 'Uredi';
-$labels['cancel'] = 'Prekliči';
-$labels['save'] = 'Shrani';
-$labels['delete'] = 'Briši';
-$labels['newcontact'] = 'Dodaj vizitko';
-$labels['deletecontact'] = 'Izbriši izbrane vizitke';
-$labels['composeto'] = 'Sestavi sporočilo za';
-$labels['contactsfromto'] = 'Vizitke $from od $to do $count';
-$labels['print'] = 'Natisni';
-$labels['export'] = 'Izvozi';
-$labels['previouspage'] = 'Prejšnja stran';
-$labels['firstpage'] = 'Prva stran';
-$labels['nextpage'] = 'Naslednja stran';
-$labels['lastpage'] = 'Zadnja stran';
-$labels['groups'] = 'Skupine';
-$labels['personaladrbook'] = 'Osebni Stiki';
-$labels['settingsfor'] = 'Nastavitve za';
-$labels['preferences'] = 'Nastavitve';
-$labels['userpreferences'] = 'Uporabniške nastavitve';
-$labels['editpreferences'] = 'Uredi uporabniške nastavitve';
-$labels['identities'] = 'Identitete';
-$labels['manageidentities'] = 'Upravljaj identitete za ta račun';
-$labels['newidentity'] = 'Nova identiteta';
-$labels['newitem'] = 'Nov predmet';
-$labels['edititem'] = 'Uredi predmet';
-$labels['setdefault'] = 'Nastavi privzeto';
-$labels['language'] = 'Jezik';
-$labels['timezone'] = 'Časovni pas';
-$labels['pagesize'] = 'Vrstic na stran';
-$labels['signature'] = 'Podpis';
-$labels['dstactive'] = 'Avtomatična nastavitev sončne/legalne ure';
-$labels['htmleditor'] = 'Sestavi sporočila z obogatenim besedilom';
-$labels['htmlsignature'] = 'Podpis z obogatenim besedilom';
-$labels['previewpane'] = 'Prikaži predogled';
-$labels['autosavedraft'] = 'Avtomatično shrani osnutke';
-$labels['everynminutes'] = 'vsakih $n minut';
-$labels['never'] = 'nikoli';
-$labels['folder'] = 'Mapa';
-$labels['folders'] = 'Mape';
-$labels['foldername'] = 'Ime mape';
-$labels['subscribed'] = 'Vpisan';
-$labels['messagecount'] = 'Sporočila';
-$labels['create'] = 'Ustvari';
-$labels['createfolder'] = 'Ustvari novo mapo';
-$labels['rename'] = 'Preimenuj';
-$labels['renamefolder'] = 'Preimenuj mapo';
-$labels['deletefolder'] = 'Izbriši mapo';
-$labels['managefolders'] = 'Urejaj mape';
-$labels['sortby'] = 'Uredi po';
-$labels['sortasc'] = 'Uredi naraščajoče';
-$labels['sortdesc'] = 'Uredi padajoče';
-
-?>
diff --git a/program/localization/sl/messages.inc b/program/localization/sl/messages.inc
deleted file mode 100644 (file)
index fab3c20..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/*
-
-+-----------------------------------------------------------------------+
-| language/sl/messages.inc                                              |
-|                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
-| Licensed under the GNU GPL                                            |
-|                                                                       |
-+-----------------------------------------------------------------------+
-| Author: Andrej Sossi <asossi@dotcom.ts.it>                            |
-|         Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
-+-----------------------------------------------------------------------+
-
-@version $Id: messages.inc 1109 2008-02-17 20:22:05Z thomasb $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Prijava neuspešna';
-$messages['cookiesdisabled'] = 'Vaš brskalnik nima omogočenih piškotov';
-$messages['sessionerror'] = 'Vaša seja je napačna oz. potekla';
-$messages['imaperror'] = 'Povezava na IMAP strežnik neuspešna';
-$messages['nomessagesfound'] = 'Ni sporočil';
-$messages['loggedout'] = 'Uspešno ste zaključili sejo. Nasvidenje!';
-$messages['mailboxempty'] = 'Nabiralnik je prazen';
-$messages['loading'] = 'Nalagam...';
-$messages['loadingdata'] = 'Nalagam podatke...';
-$messages['checkingmail'] = 'Iščem nova sporočila...';
-$messages['sendingmessage'] = 'Pošiljam sporočilo...';
-$messages['messagesent'] = 'Sporočilo uspešno poslano';
-$messages['savingmessage'] = 'Shranjujem sporočilo';
-$messages['messagesaved'] = 'Sporočilo shranjeno v osnutke';
-$messages['successfullysaved'] = 'Uspešno shranjeno';
-$messages['addedsuccessfully'] = 'Vizitka uspešno dodana';
-$messages['contactexists'] = 'Vizitka s tem e-naslovom že obstaja!';
-$messages['blockedimages'] = 'Zaradi vaše varnosti slike v tem sporočilu niso prikazane.';
-$messages['encryptedmessage'] = 'To je zaščiteno sporočilo, na žalost ne more biti prikazano. Oprostite!';
-$messages['nocontactsfound'] = 'Ne najdem nobene vizitke';
-$messages['contactnotfound'] = 'Ne najdem iskane vizitke';
-$messages['sendingfailed'] = 'Pošiljanje sporočila neuspešno';
-$messages['errorsaving'] = 'Pri shranjevanju je prišlo do napake';
-$messages['errormoving'] = 'Ne morem premakniti sporočila';
-$messages['errordeleting'] = 'Ne morem izbrisati sporočila';
-$messages['deletecontactconfirm'] = 'Želite zbrisati izbrane vizitke?';
-$messages['deletemessagesconfirm'] = 'Želite zbrisati izbrana sporočila?';
-$messages['deletefolderconfirm'] = 'Želite zbrisati to mapo?';
-$messages['purgefolderconfirm'] = 'Želite zbrisati vsa sporočila v tej mapi?';
-$messages['formincomplete'] = 'Obrazec ni bil izpolnjen v celoti';
-$messages['noemailwarning'] = 'Prosim vpišite veljaven e-naslov';
-$messages['nonamewarning'] = 'Prosim vpišite ime';
-$messages['nopagesizewarning'] = 'Prosim vpišite velikost strani';
-$messages['norecipientwarning'] = 'Prosim vpišite vsaj enega naslovnika';
-$messages['nosubjectwarning'] = 'Polje "Naslov" je prazno. Ali ga želite vpisati zdaj?';
-$messages['nobodywarning'] = 'Pošlji to sporočilo brez besedila?';
-$messages['notsentwarning'] = 'Sporočilo ni bilo poslano. Želite opustiti vaše sporočilo?';
-$messages['noldapserver'] = 'Prosim izberite ldap strežnik za iskanje';
-$messages['nocontactsreturned'] = 'Ne najdem vizitk';
-$messages['nosearchname'] = 'Prosim vpišite ime ali e-naslov stika';
-$messages['searchsuccessful'] = 'Število dobljenih sporočil: $nr';
-$messages['searchnomatch'] = 'Iskanje ni doprineslo nobenega rezultata';
-$messages['searching'] = 'Iščem...';
-$messages['checking'] = 'Previrjam...';
-$messages['nospellerrors'] = 'Ni pravopisnih napak';
-$messages['folderdeleted'] = 'Mapa uspešno zbrisana';
-$messages['deletedsuccessfully'] = 'Uspešno zbrisano';
-$messages['converting'] = 'Brišem obogatitev besedila...';
-$messages['messageopenerror'] = 'Neuspešno nalaganje sporočila s stežnika';
-$messages['fileuploaderror'] = 'Neuspešno nalaganje datoteke';
-$messages['filesizeerror'] = 'Naložena datoteka presega maksimalno velikost $size';
-$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';
-$messages['movingmessage'] = 'Premakni besedilo...';
-$messages['receiptsent'] = 'Potrdilo o prebranem sporočilu je bilo uspešno poslano';
-$messages['errorsendingreceipt'] = 'Nemogoče poslati potrdilo o prebranem sporočilu';
-$messages['nodeletelastidentity'] = 'Nemogoče zbrisati identitete. Ta je edina, ki imate.';
-$messages['addsubfolderhint'] = 'Mapa bo narejena kot podmapa trenutno izbrane mape';
-
-?>
diff --git a/program/localization/sl_SI/labels.inc b/program/localization/sl_SI/labels.inc
new file mode 100644 (file)
index 0000000..98e7fa9
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/sl/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Andrej Sossi <asossi@dotcom.ts.it>                            |
+|         Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
++-----------------------------------------------------------------------+
+
+@version $Id: labels.inc 1109 2008-02-17 20:22:05Z thomasb $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Dobrodošel v $product';
+$labels['username'] = 'Uporabniško ime';
+$labels['password'] = 'Geslo';
+$labels['server'] = 'Strežnik';
+$labels['login'] = 'Prijava';
+$labels['logout'] = 'Odjava';
+$labels['mail'] = 'E-Pošta';
+$labels['settings'] = 'Osebne nastavitve';
+$labels['addressbook'] = 'Stiki';
+$labels['inbox'] = 'Prejeto';
+$labels['drafts'] = 'Osnutki';
+$labels['sent'] = 'Poslano';
+$labels['trash'] = 'Smeti';
+$labels['junk'] = 'Nezaželena  sporočila';
+$labels['subject'] = 'Zadeva';
+$labels['from'] = 'Pošiljatelj';
+$labels['to'] = 'Prejemnik';
+$labels['cc'] = 'Kp';
+$labels['bcc'] = 'Skp';
+$labels['replyto'] = 'Odgovor na';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Velikost';
+$labels['priority'] = 'Prioriteta';
+$labels['organization'] = 'Organizacija';
+$labels['reply-to'] = 'Odgovor na';
+$labels['mailboxlist'] = 'Mape';
+$labels['messagesfromto'] = 'Sporočila $from do $to od $count';
+$labels['messagenrof'] = 'Sporočilo $nr od $count';
+$labels['moveto'] = 'premakni v...';
+$labels['download'] = 'prenesi';
+$labels['filename'] = 'Ime datoteke';
+$labels['filesize'] = 'Velikost datoteke';
+$labels['preferhtml'] = 'Prednostno HTML';
+$labels['htmlmessage'] = 'HTML sporočilo';
+$labels['prettydate'] = 'Bolj čitljivi datumi';
+$labels['addtoaddressbook'] = 'Dodaj v stike';
+$labels['sun'] = 'Ned';
+$labels['mon'] = 'Pon';
+$labels['tue'] = 'Tor';
+$labels['wed'] = 'Sre';
+$labels['thu'] = 'Čet';
+$labels['fri'] = 'Pet';
+$labels['sat'] = 'Sob';
+$labels['sunday'] = 'Nedelja';
+$labels['monday'] = 'Ponedeljek';
+$labels['tuesday'] = 'Torek';
+$labels['wednesday'] = 'Sreda';
+$labels['thursday'] = 'Četrtek';
+$labels['friday'] = 'Petek';
+$labels['saturday'] = 'Sobota';
+$labels['today'] = 'Danes';
+$labels['checkmail'] = 'Preglej nova sporočila';
+$labels['writenewmessage'] = 'Novo sporočilo';
+$labels['replytomessage'] = 'Odgovori na sporočilo';
+$labels['replytoallmessage'] = 'Odgovori pošiljatelju in vsem prejemnikom';
+$labels['forwardmessage'] = 'Posreduj sporočilo';
+$labels['deletemessage'] = 'Premakni sporočilo v smeti';
+$labels['movemessagetotrash'] = 'Premakni v smetnjak';
+$labels['printmessage'] = 'Natisni to sporočilo';
+$labels['previousmessage'] = 'Prikaži prejšnje sporočilo';
+$labels['previousmessages'] = 'Prikaži prejšnja sporočila';
+$labels['firstmessage'] = 'Prikaži prvo sporočilo';
+$labels['firstmessages'] = 'Prikaži prva sporočila';
+$labels['nextmessage'] = 'Prikaži naslednjo sporočilo';
+$labels['nextmessages'] = 'Prikaži naslednja sporočila';
+$labels['lastmessage'] = 'Prikaži zadnjo sporočilo';
+$labels['lastmessages'] = 'Prikaži zadnja sporočila';
+$labels['backtolist'] = 'Nazaj na seznam sporočil';
+$labels['viewsource'] = 'Prikaži izvirno kodo';
+$labels['markmessages'] = 'Označi sporočilo';
+$labels['markread'] = 'Kot prebrano';
+$labels['markunread'] = 'Kot neprebrano';
+$labels['select'] = 'Izberi';
+$labels['all'] = 'Vse';
+$labels['none'] = 'Nobenih';
+$labels['unread'] = 'Neprebrano';
+$labels['compact'] = 'Stisni';
+$labels['empty'] = 'Izprazni';
+$labels['purge'] = 'Počisti';
+$labels['quota'] = 'Poraba diska';
+$labels['unknown'] = 'neznana';
+$labels['unlimited'] = 'neomejena';
+$labels['quicksearch'] = 'Hitri iskalnik';
+$labels['resetsearch'] = 'Prekliči iskanje';
+$labels['compose'] = 'Sestavi sporočilo';
+$labels['savemessage'] = 'Shrani kot osnutek';
+$labels['sendmessage'] = 'Pošlji sporočilo zdaj';
+$labels['addattachment'] = 'Pripni datoteko';
+$labels['charset'] = 'Nabor znakov';
+$labels['editortype'] = 'Vrsta urejevalnika';
+$labels['returnreceipt'] = 'Potrdilo prejemnika';
+$labels['checkspelling'] = 'Preglej pravopis';
+$labels['resumeediting'] = 'Nadaljuj z urejanjem';
+$labels['revertto'] = 'Razveljavi';
+$labels['attachments'] = 'Priponke';
+$labels['upload'] = 'Naloži';
+$labels['close'] = 'Zapri';
+$labels['low'] = 'Nizka';
+$labels['lowest'] = 'Najnižja';
+$labels['normal'] = 'Normalna';
+$labels['high'] = 'Visoka';
+$labels['highest'] = 'Najvišja';
+$labels['nosubject'] = '(brez naslova)';
+$labels['showimages'] = 'Prikaži slike';
+$labels['htmltoggle'] = 'Obogateno besedilo (HTML)';
+$labels['plaintoggle'] = 'Samo besedilo';
+$labels['addcc'] = 'Dodaj Kp';
+$labels['addbcc'] = 'Dodaj Skp';
+$labels['addreplyto'] = 'Dodaj naslov za odgovor';
+$labels['mdnrequest'] = 'Pošiljatelj tega sporočila je zaprosil za portdilo, ko vi preberete to sporočilo. Hočete poslati obvestilo?';
+$labels['receiptread'] = 'Potrdilo o prebranem sporočilu';
+$labels['yourmessage'] = 'To je potrdilo, da je bilo vaše sporočilo prebrano';
+$labels['receiptnote'] = 'Pozor: to je samo potrdilo, da vaše sporočilo je bilo prikazano na prejemnikovem računalniku. To še ne pomeni, da je prejemnik prebral ali razumel vsebino vašega sporočila.';
+$labels['name'] = 'Ime za prikaz';
+$labels['firstname'] = 'Ime';
+$labels['surname'] = 'Priimek';
+$labels['email'] = 'E-Pošta';
+$labels['addcontact'] = 'Dodaj izbrane stike v imenik';
+$labels['editcontact'] = 'Uredi vizitko';
+$labels['edit'] = 'Uredi';
+$labels['cancel'] = 'Prekliči';
+$labels['save'] = 'Shrani';
+$labels['delete'] = 'Briši';
+$labels['newcontact'] = 'Dodaj vizitko';
+$labels['deletecontact'] = 'Izbriši izbrane vizitke';
+$labels['composeto'] = 'Sestavi sporočilo za';
+$labels['contactsfromto'] = 'Vizitke $from od $to do $count';
+$labels['print'] = 'Natisni';
+$labels['export'] = 'Izvozi';
+$labels['previouspage'] = 'Prejšnja stran';
+$labels['firstpage'] = 'Prva stran';
+$labels['nextpage'] = 'Naslednja stran';
+$labels['lastpage'] = 'Zadnja stran';
+$labels['groups'] = 'Skupine';
+$labels['personaladrbook'] = 'Osebni Stiki';
+$labels['settingsfor'] = 'Nastavitve za';
+$labels['preferences'] = 'Nastavitve';
+$labels['userpreferences'] = 'Uporabniške nastavitve';
+$labels['editpreferences'] = 'Uredi uporabniške nastavitve';
+$labels['identities'] = 'Identitete';
+$labels['manageidentities'] = 'Upravljaj identitete za ta račun';
+$labels['newidentity'] = 'Nova identiteta';
+$labels['newitem'] = 'Nov predmet';
+$labels['edititem'] = 'Uredi predmet';
+$labels['setdefault'] = 'Nastavi privzeto';
+$labels['language'] = 'Jezik';
+$labels['timezone'] = 'Časovni pas';
+$labels['pagesize'] = 'Vrstic na stran';
+$labels['signature'] = 'Podpis';
+$labels['dstactive'] = 'Avtomatična nastavitev sončne/legalne ure';
+$labels['htmleditor'] = 'Sestavi sporočila z obogatenim besedilom';
+$labels['htmlsignature'] = 'Podpis z obogatenim besedilom';
+$labels['previewpane'] = 'Prikaži predogled';
+$labels['autosavedraft'] = 'Avtomatično shrani osnutke';
+$labels['everynminutes'] = 'vsakih $n minut';
+$labels['never'] = 'nikoli';
+$labels['folder'] = 'Mapa';
+$labels['folders'] = 'Mape';
+$labels['foldername'] = 'Ime mape';
+$labels['subscribed'] = 'Vpisan';
+$labels['messagecount'] = 'Sporočila';
+$labels['create'] = 'Ustvari';
+$labels['createfolder'] = 'Ustvari novo mapo';
+$labels['rename'] = 'Preimenuj';
+$labels['renamefolder'] = 'Preimenuj mapo';
+$labels['deletefolder'] = 'Izbriši mapo';
+$labels['managefolders'] = 'Urejaj mape';
+$labels['sortby'] = 'Uredi po';
+$labels['sortasc'] = 'Uredi naraščajoče';
+$labels['sortdesc'] = 'Uredi padajoče';
+
+?>
diff --git a/program/localization/sl_SI/messages.inc b/program/localization/sl_SI/messages.inc
new file mode 100644 (file)
index 0000000..fab3c20
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| language/sl/messages.inc                                              |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Andrej Sossi <asossi@dotcom.ts.it>                            |
+|         Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
++-----------------------------------------------------------------------+
+
+@version $Id: messages.inc 1109 2008-02-17 20:22:05Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Prijava neuspešna';
+$messages['cookiesdisabled'] = 'Vaš brskalnik nima omogočenih piškotov';
+$messages['sessionerror'] = 'Vaša seja je napačna oz. potekla';
+$messages['imaperror'] = 'Povezava na IMAP strežnik neuspešna';
+$messages['nomessagesfound'] = 'Ni sporočil';
+$messages['loggedout'] = 'Uspešno ste zaključili sejo. Nasvidenje!';
+$messages['mailboxempty'] = 'Nabiralnik je prazen';
+$messages['loading'] = 'Nalagam...';
+$messages['loadingdata'] = 'Nalagam podatke...';
+$messages['checkingmail'] = 'Iščem nova sporočila...';
+$messages['sendingmessage'] = 'Pošiljam sporočilo...';
+$messages['messagesent'] = 'Sporočilo uspešno poslano';
+$messages['savingmessage'] = 'Shranjujem sporočilo';
+$messages['messagesaved'] = 'Sporočilo shranjeno v osnutke';
+$messages['successfullysaved'] = 'Uspešno shranjeno';
+$messages['addedsuccessfully'] = 'Vizitka uspešno dodana';
+$messages['contactexists'] = 'Vizitka s tem e-naslovom že obstaja!';
+$messages['blockedimages'] = 'Zaradi vaše varnosti slike v tem sporočilu niso prikazane.';
+$messages['encryptedmessage'] = 'To je zaščiteno sporočilo, na žalost ne more biti prikazano. Oprostite!';
+$messages['nocontactsfound'] = 'Ne najdem nobene vizitke';
+$messages['contactnotfound'] = 'Ne najdem iskane vizitke';
+$messages['sendingfailed'] = 'Pošiljanje sporočila neuspešno';
+$messages['errorsaving'] = 'Pri shranjevanju je prišlo do napake';
+$messages['errormoving'] = 'Ne morem premakniti sporočila';
+$messages['errordeleting'] = 'Ne morem izbrisati sporočila';
+$messages['deletecontactconfirm'] = 'Želite zbrisati izbrane vizitke?';
+$messages['deletemessagesconfirm'] = 'Želite zbrisati izbrana sporočila?';
+$messages['deletefolderconfirm'] = 'Želite zbrisati to mapo?';
+$messages['purgefolderconfirm'] = 'Želite zbrisati vsa sporočila v tej mapi?';
+$messages['formincomplete'] = 'Obrazec ni bil izpolnjen v celoti';
+$messages['noemailwarning'] = 'Prosim vpišite veljaven e-naslov';
+$messages['nonamewarning'] = 'Prosim vpišite ime';
+$messages['nopagesizewarning'] = 'Prosim vpišite velikost strani';
+$messages['norecipientwarning'] = 'Prosim vpišite vsaj enega naslovnika';
+$messages['nosubjectwarning'] = 'Polje "Naslov" je prazno. Ali ga želite vpisati zdaj?';
+$messages['nobodywarning'] = 'Pošlji to sporočilo brez besedila?';
+$messages['notsentwarning'] = 'Sporočilo ni bilo poslano. Želite opustiti vaše sporočilo?';
+$messages['noldapserver'] = 'Prosim izberite ldap strežnik za iskanje';
+$messages['nocontactsreturned'] = 'Ne najdem vizitk';
+$messages['nosearchname'] = 'Prosim vpišite ime ali e-naslov stika';
+$messages['searchsuccessful'] = 'Število dobljenih sporočil: $nr';
+$messages['searchnomatch'] = 'Iskanje ni doprineslo nobenega rezultata';
+$messages['searching'] = 'Iščem...';
+$messages['checking'] = 'Previrjam...';
+$messages['nospellerrors'] = 'Ni pravopisnih napak';
+$messages['folderdeleted'] = 'Mapa uspešno zbrisana';
+$messages['deletedsuccessfully'] = 'Uspešno zbrisano';
+$messages['converting'] = 'Brišem obogatitev besedila...';
+$messages['messageopenerror'] = 'Neuspešno nalaganje sporočila s stežnika';
+$messages['fileuploaderror'] = 'Neuspešno nalaganje datoteke';
+$messages['filesizeerror'] = 'Naložena datoteka presega maksimalno velikost $size';
+$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';
+$messages['movingmessage'] = 'Premakni besedilo...';
+$messages['receiptsent'] = 'Potrdilo o prebranem sporočilu je bilo uspešno poslano';
+$messages['errorsendingreceipt'] = 'Nemogoče poslati potrdilo o prebranem sporočilu';
+$messages['nodeletelastidentity'] = 'Nemogoče zbrisati identitete. Ta je edina, ki imate.';
+$messages['addsubfolderhint'] = 'Mapa bo narejena kot podmapa trenutno izbrane mape';
+
+?>
diff --git a/program/localization/sr_CS/labels.inc b/program/localization/sr_CS/labels.inc
new file mode 100644 (file)
index 0000000..37ae6ec
--- /dev/null
@@ -0,0 +1,192 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/sr_cyrillic/labels.inc                                       |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Branko Kokanovic <branko.kokanovic@gmail.com                  |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\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'] = 'Cc';\r
+$labels['bcc'] = 'Bcc';\r
+$labels['replyto'] = 'Reply-To';\r
+$labels['date'] = 'Датум';\r
+$labels['size'] = 'Величина';\r
+$labels['priority'] = 'Приоритет';\r
+$labels['organization'] = 'Организација';\r
+$labels['reply-to'] = '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'] = 'Име датотекеe';\r
+$labels['filesize'] = 'Величина датотеке';\r
+$labels['preferhtml'] = 'Предност дај ХТМЛ формату';\r
+$labels['htmlmessage'] = 'ХТМЛ формат поруке';\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['markmessages'] = 'Обележи поруке';\r
+$labels['markread'] = 'Као прочитане';\r
+$labels['markunread'] = 'Као непрочитане';\r
+$labels['select'] = 'Означи';\r
+$labels['all'] = 'Све';\r
+$labels['none'] = 'Ниједну';\r
+$labels['unread'] = 'Непрочитане';\r
+$labels['compact'] = 'Компакција';\r
+$labels['empty'] = 'Испразни';\r
+$labels['purge'] = 'Oчисти';\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'] = 'Додај Cc';\r
+$labels['addbcc'] = 'Додај Bcc';\r
+$labels['addreplyto'] = 'Додај Reply-To';\r
+$labels['mdnrequest'] = 'Пошиљалац ове поруке је замолио да буде обавештен када прочитате ову поруку. Да ли желите да обавестите пошиљаоца?';\r
+$labels['receiptread'] = 'Обавештење о приспећу (прочитана порука)';\r
+$labels['yourmessage'] = 'Ово је обавештење о приспећу за вашу поруку';\r
+$labels['receiptnote'] = 'Пажња: Ово обавештење само потврђује да је порука приказана на рачунару примаоца. Не постоји гаранција да је прималац прочитао или разумео садржај поруке.';\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['messagecount'] = 'Поруке';\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
+?>\r
diff --git a/program/localization/sr_CS/messages.inc b/program/localization/sr_CS/messages.inc
new file mode 100644 (file)
index 0000000..1e51f81
--- /dev/null
@@ -0,0 +1,82 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/sr_cyrillic/messages.inc                                     |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Branko Kokanovic <branko.kokanovic@gmail.com>                 |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'Неуспешно пријављивање';\r
+$messages['cookiesdisabled'] = 'Ваш интернет прегледач не подржава колачиће';\r
+$messages['sessionerror'] = 'Сесија није валидна или је истекла';\r
+$messages['imaperror'] = 'Неуспешна конекција на IMAP сервер';\r
+$messages['nomessagesfound'] = 'Немате порука у сандучету';\r
+$messages['loggedout'] = 'Успешно сте се одјавили.';\r
+$messages['mailboxempty'] = 'Сандуче је празно';\r
+$messages['loading'] = 'Учитавање...';\r
+$messages['loadingdata'] = 'Учитавање података...';\r
+$messages['checkingmail'] = 'Провера нових порука у току...';\r
+$messages['sendingmessage'] = 'Порука се шаље...';\r
+$messages['messagesent'] = 'Порука је успешно послата';\r
+$messages['savingmessage'] = 'Порука се снима...';\r
+$messages['messagesaved'] = 'Порука успешно сачувана у Снимљене';\r
+$messages['successfullysaved'] = 'Снимање успешно обављено';\r
+$messages['addedsuccessfully'] = 'Контакт успешно додат у именик';\r
+$messages['contactexists'] = 'Контакт са овом е-мејл адресом већ постоји у именику';\r
+$messages['blockedimages'] = 'Због заштите приватности, слике са удаљених сервера су блокиране';\r
+$messages['encryptedmessage'] = 'Ова порука је шифрована, па се не може приказати';\r
+$messages['nocontactsfound'] = 'Није пронађен ниједан контакт';\r
+$messages['contactnotfound'] = 'Жељени контакт није нађен';\r
+$messages['sendingfailed'] = 'Грешка при слању поруке';\r
+$messages['errorsaving'] = 'Грешка при снимању поруке';\r
+$messages['errormoving'] = 'Грешка при премештању поруке';\r
+$messages['errordeleting'] = 'Грешка при брисању поруке';\r
+$messages['deletecontactconfirm'] = 'Да ли стварно желите да обришете изабране контакте?';\r
+$messages['deletemessagesconfirm'] = 'Да ли стварно желите да обришете изабране поруке?';\r
+$messages['deletefolderconfirm'] = 'Да ли заиста желите да обришете изабрану фасциклу?';\r
+$messages['purgefolderconfirm'] = 'Да ли заиста желите да обришете све поруке у фасцикли?';\r
+$messages['formincomplete'] = 'Формулар није у целости попуњен';\r
+$messages['noemailwarning'] = 'Унесите валидну е-мејл адресу';\r
+$messages['nonamewarning'] = 'Унесите име';\r
+$messages['nopagesizewarning'] = 'Унесите величину странице';\r
+$messages['norecipientwarning'] = 'Унесите примаоца/примаоце (За)';\r
+$messages['nosubjectwarning'] = 'Поље \'Наслов\' је празно. Желите ли да унесете наслов?';\r
+$messages['nobodywarning'] = 'Да ли желите да пошаљете поруку без текста?';\r
+$messages['notsentwarning'] = 'Порука није послата. Да ли желите да одбаците ову поруку?';\r
+$messages['noldapserver'] = 'Унесите LDAP сервер за претрагу';\r
+$messages['nocontactsreturned'] = 'Није пронађен ниједан контакт';\r
+$messages['nosearchname'] = 'Унесите име или е-мејл адресу';\r
+$messages['searchsuccessful'] = 'Број пронађених порука: $nr';\r
+$messages['searchnomatch'] = 'Тражена фраза није пронађена ни у једној поруци';\r
+$messages['searching'] = 'Претрага у току...';\r
+$messages['checking'] = 'Провера у току...';\r
+$messages['nospellerrors'] = 'Није пронађена ниједна правописна грешка';\r
+$messages['folderdeleted'] = 'Фасцикла успешно обрисана';\r
+$messages['deletedsuccessfully'] = 'Брисање успешно';\r
+$messages['converting'] = 'Уклањање форматирања из поруке...';\r
+$messages['messageopenerror'] = 'Порука се не може учитати са сервера';\r
+$messages['fileuploaderror'] = 'Слање датотеке неуспешно';\r
+$messages['filesizeerror'] = 'Послата датотека не може да прекорачи величину од $size';\r
+$messages['copysuccess'] = 'Успешно копирано $nr адреса';\r
+$messages['copyerror'] = 'Немогуће је ископирати иједну адресу';\r
+$messages['sourceisreadonly'] = 'Овај извор адресе је само за читање';\r
+$messages['errorsavingcontact'] = 'Неуспело снимање адресе контакта';\r
+$messages['movingmessage'] = 'Премештам поруку...';\r
+$messages['receiptsent'] = 'Успешно послато обавештење о приспећу';\r
+$messages['errorsendingreceipt'] = 'Неуспело слање обавештења о приспећу';\r
+$messages['nodeletelastidentity'] = 'Не можете обрисати овај идентитет, он Вам је последњи.';\r
+$messages['addsubfolderhint'] = 'Ова фасцикла ће бити креирана као подфасцикла тренутне';\r
+\r
+?>\r
diff --git a/program/localization/sr_cyrillic/labels.inc b/program/localization/sr_cyrillic/labels.inc
deleted file mode 100644 (file)
index 37ae6ec..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php\r
-\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/sr_cyrillic/labels.inc                                       |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Branko Kokanovic <branko.kokanovic@gmail.com                  |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\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'] = 'Cc';\r
-$labels['bcc'] = 'Bcc';\r
-$labels['replyto'] = 'Reply-To';\r
-$labels['date'] = 'Датум';\r
-$labels['size'] = 'Величина';\r
-$labels['priority'] = 'Приоритет';\r
-$labels['organization'] = 'Организација';\r
-$labels['reply-to'] = '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'] = 'Име датотекеe';\r
-$labels['filesize'] = 'Величина датотеке';\r
-$labels['preferhtml'] = 'Предност дај ХТМЛ формату';\r
-$labels['htmlmessage'] = 'ХТМЛ формат поруке';\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['markmessages'] = 'Обележи поруке';\r
-$labels['markread'] = 'Као прочитане';\r
-$labels['markunread'] = 'Као непрочитане';\r
-$labels['select'] = 'Означи';\r
-$labels['all'] = 'Све';\r
-$labels['none'] = 'Ниједну';\r
-$labels['unread'] = 'Непрочитане';\r
-$labels['compact'] = 'Компакција';\r
-$labels['empty'] = 'Испразни';\r
-$labels['purge'] = 'Oчисти';\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'] = 'Додај Cc';\r
-$labels['addbcc'] = 'Додај Bcc';\r
-$labels['addreplyto'] = 'Додај Reply-To';\r
-$labels['mdnrequest'] = 'Пошиљалац ове поруке је замолио да буде обавештен када прочитате ову поруку. Да ли желите да обавестите пошиљаоца?';\r
-$labels['receiptread'] = 'Обавештење о приспећу (прочитана порука)';\r
-$labels['yourmessage'] = 'Ово је обавештење о приспећу за вашу поруку';\r
-$labels['receiptnote'] = 'Пажња: Ово обавештење само потврђује да је порука приказана на рачунару примаоца. Не постоји гаранција да је прималац прочитао или разумео садржај поруке.';\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['messagecount'] = 'Поруке';\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
-?>\r
diff --git a/program/localization/sr_cyrillic/messages.inc b/program/localization/sr_cyrillic/messages.inc
deleted file mode 100644 (file)
index 1e51f81..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php\r
-\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/sr_cyrillic/messages.inc                                     |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Branko Kokanovic <branko.kokanovic@gmail.com>                 |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed'] = 'Неуспешно пријављивање';\r
-$messages['cookiesdisabled'] = 'Ваш интернет прегледач не подржава колачиће';\r
-$messages['sessionerror'] = 'Сесија није валидна или је истекла';\r
-$messages['imaperror'] = 'Неуспешна конекција на IMAP сервер';\r
-$messages['nomessagesfound'] = 'Немате порука у сандучету';\r
-$messages['loggedout'] = 'Успешно сте се одјавили.';\r
-$messages['mailboxempty'] = 'Сандуче је празно';\r
-$messages['loading'] = 'Учитавање...';\r
-$messages['loadingdata'] = 'Учитавање података...';\r
-$messages['checkingmail'] = 'Провера нових порука у току...';\r
-$messages['sendingmessage'] = 'Порука се шаље...';\r
-$messages['messagesent'] = 'Порука је успешно послата';\r
-$messages['savingmessage'] = 'Порука се снима...';\r
-$messages['messagesaved'] = 'Порука успешно сачувана у Снимљене';\r
-$messages['successfullysaved'] = 'Снимање успешно обављено';\r
-$messages['addedsuccessfully'] = 'Контакт успешно додат у именик';\r
-$messages['contactexists'] = 'Контакт са овом е-мејл адресом већ постоји у именику';\r
-$messages['blockedimages'] = 'Због заштите приватности, слике са удаљених сервера су блокиране';\r
-$messages['encryptedmessage'] = 'Ова порука је шифрована, па се не може приказати';\r
-$messages['nocontactsfound'] = 'Није пронађен ниједан контакт';\r
-$messages['contactnotfound'] = 'Жељени контакт није нађен';\r
-$messages['sendingfailed'] = 'Грешка при слању поруке';\r
-$messages['errorsaving'] = 'Грешка при снимању поруке';\r
-$messages['errormoving'] = 'Грешка при премештању поруке';\r
-$messages['errordeleting'] = 'Грешка при брисању поруке';\r
-$messages['deletecontactconfirm'] = 'Да ли стварно желите да обришете изабране контакте?';\r
-$messages['deletemessagesconfirm'] = 'Да ли стварно желите да обришете изабране поруке?';\r
-$messages['deletefolderconfirm'] = 'Да ли заиста желите да обришете изабрану фасциклу?';\r
-$messages['purgefolderconfirm'] = 'Да ли заиста желите да обришете све поруке у фасцикли?';\r
-$messages['formincomplete'] = 'Формулар није у целости попуњен';\r
-$messages['noemailwarning'] = 'Унесите валидну е-мејл адресу';\r
-$messages['nonamewarning'] = 'Унесите име';\r
-$messages['nopagesizewarning'] = 'Унесите величину странице';\r
-$messages['norecipientwarning'] = 'Унесите примаоца/примаоце (За)';\r
-$messages['nosubjectwarning'] = 'Поље \'Наслов\' је празно. Желите ли да унесете наслов?';\r
-$messages['nobodywarning'] = 'Да ли желите да пошаљете поруку без текста?';\r
-$messages['notsentwarning'] = 'Порука није послата. Да ли желите да одбаците ову поруку?';\r
-$messages['noldapserver'] = 'Унесите LDAP сервер за претрагу';\r
-$messages['nocontactsreturned'] = 'Није пронађен ниједан контакт';\r
-$messages['nosearchname'] = 'Унесите име или е-мејл адресу';\r
-$messages['searchsuccessful'] = 'Број пронађених порука: $nr';\r
-$messages['searchnomatch'] = 'Тражена фраза није пронађена ни у једној поруци';\r
-$messages['searching'] = 'Претрага у току...';\r
-$messages['checking'] = 'Провера у току...';\r
-$messages['nospellerrors'] = 'Није пронађена ниједна правописна грешка';\r
-$messages['folderdeleted'] = 'Фасцикла успешно обрисана';\r
-$messages['deletedsuccessfully'] = 'Брисање успешно';\r
-$messages['converting'] = 'Уклањање форматирања из поруке...';\r
-$messages['messageopenerror'] = 'Порука се не може учитати са сервера';\r
-$messages['fileuploaderror'] = 'Слање датотеке неуспешно';\r
-$messages['filesizeerror'] = 'Послата датотека не може да прекорачи величину од $size';\r
-$messages['copysuccess'] = 'Успешно копирано $nr адреса';\r
-$messages['copyerror'] = 'Немогуће је ископирати иједну адресу';\r
-$messages['sourceisreadonly'] = 'Овај извор адресе је само за читање';\r
-$messages['errorsavingcontact'] = 'Неуспело снимање адресе контакта';\r
-$messages['movingmessage'] = 'Премештам поруку...';\r
-$messages['receiptsent'] = 'Успешно послато обавештење о приспећу';\r
-$messages['errorsendingreceipt'] = 'Неуспело слање обавештења о приспећу';\r
-$messages['nodeletelastidentity'] = 'Не можете обрисати овај идентитет, он Вам је последњи.';\r
-$messages['addsubfolderhint'] = 'Ова фасцикла ће бити креирана као подфасцикла тренутне';\r
-\r
-?>\r
diff --git a/program/localization/sr_latin/labels.inc b/program/localization/sr_latin/labels.inc
deleted file mode 100644 (file)
index 565ba9c..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/sr_latin/labels.inc                                          |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Viktor Varga <vile@neobee.net>                                |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$labels = array();
-
-// login page
-$labels['welcome']   = 'Dobrodošli na $product';
-$labels['username']  = 'Korisničko ime';
-$labels['password']  = 'Lozinka';
-$labels['server']    = 'Server';
-$labels['login']     = 'Prijava';
-
-// taskbar
-$labels['logout']   = 'Odjava';
-$labels['mail']     = 'Sanduče';
-$labels['settings'] = 'Podešavanja';
-$labels['addressbook'] = 'Imenik';
-
-// mailbox names
-$labels['inbox']  = 'Inbox';
-$labels['drafts'] = 'Drafts';
-$labels['sent']   = 'Sent';
-$labels['trash']  = 'Trash';
-$labels['junk']   = 'Junk';
-
-// message listing
-$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';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
-$labels['mailboxlist'] = 'Fascikle';
-$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';
-
-// weekdays short
-$labels['sun'] = 'Ned';
-$labels['mon'] = 'Pon';
-$labels['tue'] = 'Uto';
-$labels['wed'] = 'Sre';
-$labels['thu'] = 'Čet';
-$labels['fri'] = 'Pet';
-$labels['sat'] = 'Sub';
-
-// weekdays long
-$labels['sunday']    = 'Nedelja';
-$labels['monday']    = 'Ponedeljak';
-$labels['tuesday']   = 'Utorak';
-$labels['wednesday'] = 'Sreda';
-$labels['thursday']  = 'Četvrtak';
-$labels['friday']    = 'Petak';
-$labels['saturday']  = 'Subota';
-
-$labels['today'] = 'danas';
-
-// toolbar buttons
-$labels['checkmail']        = 'Provera novih poruka';
-$labels['writenewmessage']  = 'Nova poruka';
-$labels['replytomessage']   = 'Odgovori na poruku';
-$labels['replytoallmessage'] = 'Odgovori pošiljaocu i svim primaocima';
-$labels['forwardmessage']   = 'Prosledi poruku';
-$labels['deletemessage']    = 'Prebaci poruku u korpu (Trash)';
-$labels['printmessage']     = 'Odštampaj poruku';
-$labels['previousmessages'] = 'Prikaži prethodni skup poruka';
-$labels['nextmessages']     = 'Prikaži sledeći skup poruka';
-$labels['backtolist']       = 'Povratak na listu poruka';
-$labels['viewsource']       = 'Prikaži poruku u izvornom obliku';
-
-$labels['select'] = 'Obeleži';
-$labels['all'] = 'Sve';
-$labels['none'] = 'Nijednu';
-$labels['unread'] = 'Nepročitane';
-
-$labels['compact'] = 'Kompakcija';
-$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';
-
-// message compose
-$labels['compose']  = 'Nova poruka';
-$labels['savemessage']  = 'Sačuvaj u \'Drafts\'';
-$labels['sendmessage']  = 'Pošalji poruku';
-$labels['addattachment']  = 'Priloži datoteku';
-$labels['charset']  = 'Karakter-set';
-$labels['returnreceipt'] = 'Potvrda o prispeću poruke';
-
-$labels['checkspelling'] = 'Provera pravopisa';
-$labels['resumeediting'] = 'Povratak u režim pisanja';
-$labels['revertto'] = 'Revert to';
-
-$labels['attachments'] = 'Prilozi (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';
-
-// address boook
-$labels['name']      = 'Puno ime';
-$labels['firstname'] = 'Ime';
-$labels['surname']   = 'Prezime';
-$labels['email']     = 'E-Mail';
-
-$labels['addcontact'] = 'Dodaj novi kontakt';
-$labels['editcontact'] = 'Izmeni kontakt';
-
-$labels['edit']   = 'Izmeni';
-$labels['cancel'] = 'Otkaži';
-$labels['save']   = 'Sačuvaj';
-$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']          = 'Štampaj';
-$labels['export']         = 'Izvezi';
-
-$labels['previouspage']   = 'Prikaži predhodni skup';
-$labels['nextpage']       = 'Prikaži sledeći skup';
-
-// LDAP search
-$labels['ldapsearch'] = 'Pretraga LDAP imenika';
-
-$labels['ldappublicsearchname']    = 'Ime kontakta';
-$labels['ldappublicsearchtype'] = 'Potpuna fraza?';
-$labels['ldappublicserverselect'] = 'Odaberi servere';
-$labels['ldappublicsearchfield'] = 'Pretraži na';
-$labels['ldappublicsearchform'] = 'Pretraži kontakte';
-$labels['ldappublicsearch'] = 'Pretraga';
-
-// settings
-$labels['settingsfor']  = 'Podešavanja za';
-
-$labels['preferences']  = 'Podešavanja';
-$labels['userpreferences']  = 'Opšta podešavanja';
-$labels['editpreferences']  = 'Izmena opštih podešavanja';
-
-$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']  = 'Letnje pomeranje vremena';
-
-$labels['folder']  = 'Fascikla';
-$labels['folders']  = 'Fascikle';
-$labels['foldername']  = 'Ime fascikle';
-$labels['subscribed']  = 'Subscribed';
-$labels['create']  = 'Kreiraj';
-$labels['createfolder']  = 'Kreiraj novu fasciklu';
-$labels['rename'] = 'Preimenuj';
-$labels['renamefolder'] = 'Preimenuj Fasciklu';
-$labels['deletefolder']  = 'Obriši Fasciklu';
-$labels['managefolders']  = 'Podesi Fasciklu';
-
-$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/sr_latin/messages.inc b/program/localization/sr_latin/messages.inc
deleted file mode 100644 (file)
index dfdbcc3..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/sr_latin/messages.inc                                        |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Viktor Varga <vile@neobee.net>                                |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$messages = array();
-$messages['loginfailed']  = 'Prijava neuspešna';
-$messages['cookiesdisabled'] = 'Vaš pretraživač ne podržava kolačiće (cookies)';
-$messages['sessionerror'] = 'Sesija je nije validna ili je istekla';
-$messages['imaperror'] = 'Neuspešna konekcija na IMAP server';
-$messages['nomessagesfound'] = 'Nema poruka u sandučetu';
-$messages['loggedout'] = 'Uspešno ste se odjavili.';
-$messages['mailboxempty'] = 'Sanduše je prazno';
-$messages['loading'] = 'Učitavanje...';
-$messages['loadingdata'] = 'Učitavanje podataka...';
-$messages['checkingmail'] = 'Provera novih poruka u toku...';
-$messages['sendingmessage'] = 'Poruka se šalje...';
-$messages['messagesent'] = 'Poruka je uspešno poslana';
-$messages['savingmessage'] = 'Poruka se snima...';
-$messages['messagesaved'] = 'Poruka uspešno sačuvana u \'Drafts\'';
-$messages['successfullysaved'] = 'Snimanje uspešno obavljeno';
-$messages['addedsuccessfully'] = 'Kontakt uspešno dodat 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 šifrovana pa se ne može prikazati';
-$messages['nocontactsfound'] = 'Imenik je prazan';
-$messages['sendingfailed'] = 'Greška pri slanju poruke';
-$messages['errorsaving'] = 'Greška pri snimanju';
-$messages['errormoving'] = 'Greška pri premeštanju poruke';
-$messages['errordeleting'] = 'Greška pri brisanju poruke';
-$messages['deletecontactconfirm']  = 'Da li želite da obrišete izabrane kontakte?';
-$messages['deletefolderconfirm']  = 'Da li zaista želite da obrišete ovu fasciklu?';
-$messages['purgefolderconfirm']  = 'Da li zaista želite da obrišete sve poruke u fascilli?';
-$messages['formincomplete'] = 'Forma nije u celosti popunjena';
-$messages['noemailwarning'] = 'Unesite validnu e-mail adresu';
-$messages['nonamewarning']  = 'Unesite ime';
-$messages['nopagesizewarning'] = 'Unesite veličinu stranice';
-$messages['norecipientwarning'] = 'Unesite primaoca / primaoce (ZA)';
-$messages['nosubjectwarning']  = 'Polje \'Naslov\' je prazno. Želite li da unesete naslov?';
-$messages['nobodywarning'] = 'Da li želite da pošaljete poruku bez teksta?';
-$messages['notsentwarning'] = 'Poruka nije poslana. Da li želite da odbacite ovu poruku?';
-$messages['noldapserver'] = 'Unesite LDAP server za pretragu';
-$messages['nocontactsreturned'] = 'Nije pronađen ni jedan kontakt';
-$messages['nosearchname'] = 'Unesite ime ili e-mail adresu';
-$messages['searchsuccessful'] = 'Broj pronađenih poruka: $nr';
-$messages['searchnomatch'] = 'Tražena fraza nije pronađena ni u jednoj poruci';
-$messages['searching'] = 'Pretraga u toku...';
-$messages['checking'] = 'Provera u toku...';
-$messages['nospellerrors'] = 'Nije pronađena ni jedna pravopisna greška';
-$messages['folderdeleted'] = 'Fascikla uspešno obrisana';
-
-?>
\ No newline at end of file
diff --git a/program/localization/sv_SE/labels.inc b/program/localization/sv_SE/labels.inc
new file mode 100644 (file)
index 0000000..2759359
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/se/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Fredrik Nygren <f.nygren@gmail.com>                           |
+ |         Andreas Henriksson <andreas@fatal.se>                                                |
+ |                Jonas Näsholm <hostmaster@bitfuse.net>                        |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1191 2008-03-13 08:10:49Z yllar $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Välkommen till $product';
+$labels['username'] = 'Användarnamn';
+$labels['password'] = 'Lösenord';
+$labels['server'] = 'Server';
+$labels['login'] = 'Logga in';
+$labels['logout'] = 'Logga ut';
+$labels['mail'] = 'Meddelanden';
+$labels['settings'] = 'Personliga inställningar';
+$labels['addressbook'] = 'Adressbok';
+$labels['inbox'] = 'Inkorg';
+$labels['drafts'] = 'Utkast';
+$labels['sent'] = 'Skickat';
+$labels['trash'] = 'Papperskorg';
+$labels['junk'] = 'Skräp';
+$labels['subject'] = 'Ämne';
+$labels['from'] = 'Avsändare';
+$labels['to'] = 'Mottagare';
+$labels['cc'] = 'Kopia';
+$labels['bcc'] = 'Hemlig kopia';
+$labels['replyto'] = 'Svara till';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Storlek';
+$labels['priority'] = 'Prioritet';
+$labels['organization'] = 'Organisation';
+$labels['reply-to'] = 'Svara till';
+$labels['mailboxlist'] = 'Mappar';
+$labels['messagesfromto'] = 'Meddelande $from till $to av $count';
+$labels['messagenrof'] = 'Meddelande $nr av $count';
+$labels['moveto'] = 'flytta till...';
+$labels['download'] = 'ladda ner';
+$labels['filename'] = 'Filnamn';
+$labels['filesize'] = 'Filstorlek';
+$labels['preferhtml'] = 'Visa HTML';
+$labels['htmlmessage'] = 'HTML-meddelande';
+$labels['prettydate'] = 'Fina datum';
+$labels['addtoaddressbook'] = 'Lägg till i adressbok';
+$labels['sun'] = 'Sön';
+$labels['mon'] = 'Mån';
+$labels['tue'] = 'Tis';
+$labels['wed'] = 'Ons';
+$labels['thu'] = 'Tor';
+$labels['fri'] = 'Fre';
+$labels['sat'] = 'Lör';
+$labels['sunday'] = 'Söndag';
+$labels['monday'] = 'Måndag';
+$labels['tuesday'] = 'Tisdag';
+$labels['wednesday'] = 'Onsdag';
+$labels['thursday'] = 'Torsdag';
+$labels['friday'] = 'Fredag';
+$labels['saturday'] = 'Lördag';
+$labels['today'] = 'Idag';
+$labels['checkmail'] = 'Hämta nya meddelanden';
+$labels['writenewmessage'] = 'Skapa nytt meddelande';
+$labels['replytomessage'] = 'Svara avsändaren';
+$labels['replytoallmessage'] = 'Svara avsändaren och alla mottagare';
+$labels['forwardmessage'] = 'Vidarebefordra meddelande';
+$labels['deletemessage'] = 'Radera meddelande';
+$labels['movemessagetotrash'] = 'Flytta meddelande till papperskorgen';
+$labels['printmessage'] = 'Skriv ut';
+$labels['previousmessage'] = 'Visa föregående meddelande';
+$labels['previousmessages'] = 'Visa tidigare grupp av meddelanden';
+$labels['firstmessage'] = 'Visa första meddelandet';
+$labels['firstmessages'] = 'Visa första gruppen av meddelanden';
+$labels['nextmessage'] = 'Visa nästa meddelande';
+$labels['nextmessages'] = 'Visa nästa grupp av meddelanden';
+$labels['lastmessage'] = 'Visa sista meddelandet';
+$labels['lastmessages'] = 'Visa sista gruppen av meddelanden';
+$labels['backtolist'] = 'Tillbaka till meddelandelistan';
+$labels['viewsource'] = 'Visa källa';
+$labels['markmessages'] = 'Markera meddelande';
+$labels['markread'] = 'Som läst';
+$labels['markunread'] = 'Som oläst';
+$labels['select'] = 'Välj';
+$labels['all'] = 'Alla';
+$labels['none'] = 'Ingen';
+$labels['unread'] = 'Olästa';
+$labels['compact'] = 'Packa';
+$labels['empty'] = 'Töm';
+$labels['purge'] = 'Rensa';
+$labels['quota'] = 'Diskutrymme';
+$labels['unknown'] = 'okänd';
+$labels['unlimited'] = 'obegränsad';
+$labels['quicksearch'] = 'Snabbsök';
+$labels['resetsearch'] = 'Återställ sökning';
+$labels['compose'] = 'Skapa nytt meddelande';
+$labels['savemessage'] = 'Spara utkast';
+$labels['sendmessage'] = 'Skicka meddelande';
+$labels['addattachment'] = 'Bifoga fil';
+$labels['charset'] = 'Teckenkodning';
+$labels['editortype'] = 'Typ av redigerare';
+$labels['returnreceipt'] = 'Mottagarkvitto';
+$labels['checkspelling'] = 'Kontrollera stavning';
+$labels['resumeediting'] = 'Återuppta redigering';
+$labels['revertto'] = 'Återgå till';
+$labels['attachments'] = 'Bilagor';
+$labels['upload'] = 'Bifoga';
+$labels['close'] = 'Stäng';
+$labels['low'] = 'Låg';
+$labels['lowest'] = 'Lägst';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Hög';
+$labels['highest'] = 'Högst';
+$labels['nosubject'] = '(inget ämne)';
+$labels['showimages'] = 'Visa bilder';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Oformaterad text';
+$labels['addcc'] = 'Kopia';
+$labels['addbcc'] = 'Hemlig kopia';
+$labels['addreplyto'] = 'Svara till';
+$labels['mdnrequest'] = 'Avsändaren har bett om att bli uppmärksammad när du läst det här meddelandet. Vill du skicka uppmärksamma avsändaren?';
+$labels['receiptread'] = 'Svarskvitto (läst)';
+$labels['yourmessage'] = 'Det här är ett svarskvitto för ditt meddelande';
+$labels['receiptnote'] = 'Notera: Det här kvittot berättar bara att meddelandet visats på mottagarens dator. Det finns ingen garanti att mottagaren har läst och förstått innehållet i meddelandet';
+$labels['name'] = 'Visa namn';
+$labels['firstname'] = 'Förnamn';
+$labels['surname'] = 'Efternamn';
+$labels['email'] = 'E-post';
+$labels['addcontact'] = 'Lägg till ny kontakt';
+$labels['editcontact'] = 'Redigera kontakt';
+$labels['edit'] = 'Redigera';
+$labels['cancel'] = 'Avbryt';
+$labels['save'] = 'Spara';
+$labels['delete'] = 'Radera';
+$labels['newcontact'] = 'Skapa nytt kontaktkort';
+$labels['deletecontact'] = 'Radera valda kontakter';
+$labels['composeto'] = 'Skriv meddelande till';
+$labels['contactsfromto'] = 'Kontakter $from till $to av $count';
+$labels['print'] = 'Skriv ut';
+$labels['export'] = 'Exportera';
+$labels['previouspage'] = 'Visa föregående grupp';
+$labels['firstpage'] = 'Visa första gruppen';
+$labels['nextpage'] = 'Visa nästa grupp';
+$labels['lastpage'] = 'Visa sista gruppen';
+$labels['groups'] = 'Grupper';
+$labels['personaladrbook'] = 'Personliga adresser';
+$labels['settingsfor'] = 'Inställningar för';
+$labels['preferences'] = 'Inställningar';
+$labels['userpreferences'] = 'Användarinställningar';
+$labels['editpreferences'] = 'Ändra användarinställningar';
+$labels['identities'] = 'Profiler';
+$labels['manageidentities'] = 'Hantera profiler för detta konto';
+$labels['newidentity'] = 'Ny profil';
+$labels['newitem'] = 'Ny post';
+$labels['edititem'] = 'Ändra post';
+$labels['setdefault'] = 'Sätt som standard';
+$labels['language'] = 'Språk';
+$labels['timezone'] = 'Tidszon';
+$labels['pagesize'] = 'Rader per sida';
+$labels['signature'] = 'Signatur';
+$labels['dstactive'] = 'Sommartid';
+$labels['htmleditor'] = 'Skriv HTML-meddelanden';
+$labels['htmlsignature'] = 'HTML-signatur';
+$labels['previewpane'] = 'Visa delad vy i inbox';
+$labels['autosavedraft'] = 'Spara utkast automatiskt';
+$labels['everynminutes'] = 'var $n minut';
+$labels['never'] = 'aldrig';
+$labels['folder'] = 'Mapp';
+$labels['folders'] = 'Mappar';
+$labels['foldername'] = 'Mappnamn';
+$labels['subscribed'] = 'Ansluten';
+$labels['messagecount'] = 'Meddelanden';
+$labels['create'] = 'Skapa';
+$labels['createfolder'] = 'Skapa ny mapp';
+$labels['rename'] = 'Byt namn';
+$labels['renamefolder'] = 'Byt mappnamn';
+$labels['deletefolder'] = 'Radera mapp';
+$labels['managefolders'] = 'Hantera mappar';
+$labels['sortby'] = 'Sortera på';
+$labels['sortasc'] = 'Sortera stigande';
+$labels['sortdesc'] = 'Sortera fallande';
+
+?>
diff --git a/program/localization/sv_SE/messages.inc b/program/localization/sv_SE/messages.inc
new file mode 100644 (file)
index 0000000..fa8a153
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/se/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Fredrik Nygren <f.nygren@gmail.com>                           |
+ |         Andreas Henriksson <andreas@fatal.se>                                                |
+ |                Jonas Näsholm <hostmaster@bitfuse.net>                        |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Inloggningen misslyckades';
+$messages['cookiesdisabled'] = 'Din webbläsare accepterar inte cookies';
+$messages['sessionerror'] = 'Din inloggning är felaktig eller har gått ut';
+$messages['imaperror'] = 'Kontakt med IMAP-servern misslyckades';
+$messages['nomessagesfound'] = 'Inga meddelanden';
+$messages['loggedout'] = 'Du är utloggad. Välkommen åter!';
+$messages['mailboxempty'] = 'Mappen är tom';
+$messages['loading'] = 'Laddar...';
+$messages['loadingdata'] = 'Laddar data...';
+$messages['checkingmail'] = 'Letar efter nya meddelanden...';
+$messages['sendingmessage'] = 'Skickar meddelande...';
+$messages['messagesent'] = 'Meddelandet har skickats';
+$messages['savingmessage'] = 'Sparar meddelande...';
+$messages['messagesaved'] = 'Meddelande sparades till utkast';
+$messages['successfullysaved'] = 'Sparat';
+$messages['addedsuccessfully'] = 'Kontakten har lagts till i adressboken';
+$messages['contactexists'] = 'En kontakt med den här adressen finns redan';
+$messages['blockedimages'] = 'För att skydda dig är bilder blockerade.';
+$messages['encryptedmessage'] = 'Meddelandet är krypterat och kan tyvärr inte visas.';
+$messages['nocontactsfound'] = 'Inga kontakter hittades';
+$messages['contactnotfound'] = 'Den efterfrågade kontanten hittades inte';
+$messages['sendingfailed'] = 'Meddelandet kunde inte skickas';
+$messages['errorsaving'] = 'Ett fel uppstod när meddelandet sparades';
+$messages['errormoving'] = 'Meddelandet kunde inte flyttas';
+$messages['errordeleting'] = 'Meddelandet kunde inte raderas';
+$messages['deletecontactconfirm'] = 'Vill du verkligen radera valda kontakter?';
+$messages['deletemessagesconfirm'] = 'Vill du verkligen ta bort valda meddelanden?';
+$messages['deletefolderconfirm'] = 'Vill du verkligen radera den här mappen?';
+$messages['purgefolderconfirm'] = 'Vill du verkligen radera alla meddelanden i den här mappen?';
+$messages['formincomplete'] = 'Formuläret var inte ifyllt i sin helhet';
+$messages['noemailwarning'] = 'Vänligen ange en giltig adress';
+$messages['nonamewarning'] = 'Vänligen ange ett namn';
+$messages['nopagesizewarning'] = 'Vänligen ange en sidstorlek';
+$messages['norecipientwarning'] = 'Vänligen ange minst en mottagare';
+$messages['nosubjectwarning'] = 'Ämnesfältet är tomt. Vill du lägga till något nu?';
+$messages['nobodywarning'] = 'Skicka det här meddelandet utan text?';
+$messages['notsentwarning'] = 'Meddelande har inte skickats. Vill du avbryta meddelandet?';
+$messages['noldapserver'] = 'Vänligen ange en LDAP-server att söka';
+$messages['nocontactsreturned'] = 'Inga kontakter hittades';
+$messages['nosearchname'] = 'Vänligen ange ett kontaktnamn eller en adress';
+$messages['searchsuccessful'] = '$nr meddelanden hittades';
+$messages['searchnomatch'] = 'Sökningen returnerade inga träffar';
+$messages['searching'] = 'Söker...';
+$messages['checking'] = 'Kontrollerar...';
+$messages['nospellerrors'] = 'Inget stavfel hittades';
+$messages['folderdeleted'] = 'Mappen raderades';
+$messages['deletedsuccessfully'] = 'Lyckad borttagning';
+$messages['converting'] = 'Tar bort formatering från meddelande...';
+$messages['messageopenerror'] = 'Kunde inte ladda meddelande från servern';
+$messages['fileuploaderror'] = 'Filuppladdning misslyckades';
+$messages['filesizeerror'] = 'Den uppladdade filen överstiger maxstorleken $size';
+$messages['copysuccess'] = 'Lyckad kopiering av $nr adresser';
+$messages['copyerror'] = 'Kunde inte kopiera några adresser';
+$messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad';
+$messages['errorsavingcontact'] = 'Kunde inte spara kontakt-adressen';
+$messages['movingmessage'] = 'Flyttar meddelande...';
+$messages['receiptsent'] = 'Ett läskvitto har skickats';
+$messages['errorsendingreceipt'] = 'Kunde inte skicka läskvittot';
+$messages['nodeletelastidentity'] = 'Du kan inte radera den här identiteten, det är din sista.';
+$messages['addsubfolderhint'] = 'Den här mappen kommer att skapas som en underkatalog till den valda';
+
+?>
\ No newline at end of file
diff --git a/program/localization/tr/labels.inc b/program/localization/tr/labels.inc
deleted file mode 100644 (file)
index 401c520..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/tr/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
-
-*/
-
-$labels = array();
-$labels['welcome'] = '$product \'a hoşgeldiniz';
-$labels['username'] = 'Kullanıcı Adı';
-$labels['password'] = 'Şifre';
-$labels['server'] = 'Sunucu';
-$labels['login'] = 'Oturum Aç';
-$labels['logout'] = 'Oturumu Kapat';
-$labels['mail'] = 'E-Posta';
-$labels['settings'] = 'Kişisel Ayarlar';
-$labels['addressbook'] = 'Rehber';
-$labels['inbox'] = 'Gelenler';
-$labels['drafts'] = 'Taslaklar';
-$labels['sent'] = 'Gönderilenler';
-$labels['trash'] = 'Çöp Kutusu';
-$labels['junk'] = 'Gereksiz(spam)';
-$labels['subject'] = 'Konu';
-$labels['from'] = 'Gönderen';
-$labels['to'] = 'Alıcı';
-$labels['cc'] = 'Karbon Kopya';
-$labels['bcc'] = 'Gizli Karbon Kopya';
-$labels['replyto'] = 'Yanıtların Gönderileceği Adres';
-$labels['date'] = 'Tarih';
-$labels['size'] = 'Boyut';
-$labels['priority'] = 'Öncelik';
-$labels['organization'] = 'Kuruluş';
-$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'] = 'şuraya taşı...';
-$labels['download'] = 'İndir';
-$labels['filename'] = 'Dosya Adı';
-$labels['filesize'] = 'Dosya Boyutu';
-$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'] = 'Cum';
-$labels['sat'] = 'Cts';
-$labels['sunday'] = 'Pazar';
-$labels['monday'] = 'Pazartesi';
-$labels['tuesday'] = 'Salı';
-$labels['wednesday'] = 'Çarşamba';
-$labels['thursday'] = 'Perşembe';
-$labels['friday'] = 'Cuma';
-$labels['saturday'] = 'Cumartesi';
-$labels['today'] = 'Bugün';
-$labels['checkmail'] = 'Yeni posta olup olmadığını kontrol et';
-$labels['writenewmessage'] = 'Yeni posta oluştur';
-$labels['replytomessage'] = 'Postayı yanıtla';
-$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ç';
-$labels['all'] = 'Hepsi';
-$labels['none'] = 'Hiçbiri';
-$labels['unread'] = 'Okunmamış';
-$labels['compact'] = 'Kompakt';
-$labels['empty'] = 'Boşalt';
-$labels['purge'] = 'Sil';
-$labels['quota'] = 'Disk kullanımı';
-$labels['unknown'] = 'bilinmeyen';
-$labels['unlimited'] = 'sınırsız';
-$labels['quicksearch'] = 'Hızlı arama';
-$labels['resetsearch'] = 'Aramayı sıfırla';
-$labels['compose'] = 'Yeni posta oluştur';
-$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';
-$labels['revertto'] = 'Revert to';
-$labels['attachments'] = 'Ekler';
-$labels['upload'] = 'Yükle';
-$labels['close'] = 'Kapat';
-$labels['low'] = 'Düşük';
-$labels['lowest'] = 'Çok düşük';
-$labels['normal'] = 'Normal';
-$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';
-$labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Seçili kişiyi rehbere ekle';
-$labels['editcontact'] = 'Kişiyi düzenle';
-$labels['edit'] = 'Düzenle';
-$labels['cancel'] = 'İptal';
-$labels['save'] = 'Kaydet';
-$labels['delete'] = 'Sil';
-$labels['newcontact'] = 'Yeni kişi Kartı Ekle';
-$labels['deletecontact'] = 'Seçili kişileri sil';
-$labels['composeto'] = 'Seçili kişiye posta gönder';
-$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['lastpage'] = 'Son sayfa';
-$labels['groups'] = 'Gruplar';
-$labels['personaladrbook'] = 'Adresler';
-$labels['settingsfor'] = 'Ayarlar';
-$labels['preferences'] = 'Tercihler';
-$labels['userpreferences'] = 'Kullanıcı tercihleri';
-$labels['editpreferences'] = 'Kullanıcı tercihlerini düzenle';
-$labels['identities'] = 'Kimlikler';
-$labels['manageidentities'] = 'Bu hesap için kimlikleri düzenle';
-$labels['newidentity'] = 'Yeni kimlik';
-$labels['newitem'] = 'Yeni etiket';
-$labels['edititem'] = 'Etiket düzenle';
-$labels['setdefault'] = 'Varsayılan olarak ayarla';
-$labels['language'] = 'Dil';
-$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';
-$labels['subscribed'] = 'Görülebilir';
-$labels['create'] = 'Yeni Oluştur';
-$labels['createfolder'] = 'Yeni klasör oluştur';
-$labels['rename'] = 'Yeniden adlandır';
-$labels['renamefolder'] = 'Klasörü yeniden adlandır';
-$labels['deletefolder'] = 'Klasörü sil';
-$labels['managefolders'] = 'Klasörleri düzenle';
-$labels['sortby'] = 'Sırala';
-$labels['sortasc'] = 'Azdan çoğa';
-$labels['sortdesc'] = 'Çoktan aza';
-
-?>
\ No newline at end of file
diff --git a/program/localization/tr/messages.inc b/program/localization/tr/messages.inc
deleted file mode 100644 (file)
index 68554f8..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/tr/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Giriş Başarısız';
-$messages['cookiesdisabled'] = 'Tarayıcınız cookileri kabul etmiyor';
-$messages['sessionerror'] = 'Oturumunuz sona ermiş veya hatalı';
-$messages['imaperror'] = 'IMAP Servera bağlanılamadı';
-$messages['nomessagesfound'] = 'Posta kutusunda mesaj bulunamadı';
-$messages['loggedout'] = 'Oturumu başarılı bir şekilde kapattınız. Güle güle!';
-$messages['mailboxempty'] = 'Posta kutusu boş';
-$messages['loading'] = 'Yükleniyor...';
-$messages['loadingdata'] = 'Veriler yükleniyor...';
-$messages['checkingmail'] = 'Yeni posta var mı diye kontrol ediliyor...';
-$messages['sendingmessage'] = 'Posta gönderiliyor...';
-$messages['messagesent'] = 'Posta gönderildi';
-$messages['savingmessage'] = 'Posta kaydediliyor...';
-$messages['messagesaved'] = 'Posta taslaklara kaydedildi';
-$messages['successfullysaved'] = 'Kaydedildi';
-$messages['addedsuccessfully'] = 'Kişi rehbere eklendi';
-$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ı';
-$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ış. Þimdi 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';
-$messages['nocontactsreturned'] = 'Kişi bulunamadı';
-$messages['nosearchname'] = 'Lütfen bir kişi ismi veya posta adresi girin';
-$messages['searchsuccessful'] = '$nr tane posta bulundu';
-$messages['searchnomatch'] = 'Aramanıza uygun hiçbir sonuç bulunamadı';
-$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/tr_TR/labels.inc b/program/localization/tr_TR/labels.inc
new file mode 100644 (file)
index 0000000..401c520
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/tr/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$labels = array();
+$labels['welcome'] = '$product \'a hoşgeldiniz';
+$labels['username'] = 'Kullanıcı Adı';
+$labels['password'] = 'Şifre';
+$labels['server'] = 'Sunucu';
+$labels['login'] = 'Oturum Aç';
+$labels['logout'] = 'Oturumu Kapat';
+$labels['mail'] = 'E-Posta';
+$labels['settings'] = 'Kişisel Ayarlar';
+$labels['addressbook'] = 'Rehber';
+$labels['inbox'] = 'Gelenler';
+$labels['drafts'] = 'Taslaklar';
+$labels['sent'] = 'Gönderilenler';
+$labels['trash'] = 'Çöp Kutusu';
+$labels['junk'] = 'Gereksiz(spam)';
+$labels['subject'] = 'Konu';
+$labels['from'] = 'Gönderen';
+$labels['to'] = 'Alıcı';
+$labels['cc'] = 'Karbon Kopya';
+$labels['bcc'] = 'Gizli Karbon Kopya';
+$labels['replyto'] = 'Yanıtların Gönderileceği Adres';
+$labels['date'] = 'Tarih';
+$labels['size'] = 'Boyut';
+$labels['priority'] = 'Öncelik';
+$labels['organization'] = 'Kuruluş';
+$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'] = 'şuraya taşı...';
+$labels['download'] = 'İndir';
+$labels['filename'] = 'Dosya Adı';
+$labels['filesize'] = 'Dosya Boyutu';
+$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'] = 'Cum';
+$labels['sat'] = 'Cts';
+$labels['sunday'] = 'Pazar';
+$labels['monday'] = 'Pazartesi';
+$labels['tuesday'] = 'Salı';
+$labels['wednesday'] = 'Çarşamba';
+$labels['thursday'] = 'Perşembe';
+$labels['friday'] = 'Cuma';
+$labels['saturday'] = 'Cumartesi';
+$labels['today'] = 'Bugün';
+$labels['checkmail'] = 'Yeni posta olup olmadığını kontrol et';
+$labels['writenewmessage'] = 'Yeni posta oluştur';
+$labels['replytomessage'] = 'Postayı yanıtla';
+$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ç';
+$labels['all'] = 'Hepsi';
+$labels['none'] = 'Hiçbiri';
+$labels['unread'] = 'Okunmamış';
+$labels['compact'] = 'Kompakt';
+$labels['empty'] = 'Boşalt';
+$labels['purge'] = 'Sil';
+$labels['quota'] = 'Disk kullanımı';
+$labels['unknown'] = 'bilinmeyen';
+$labels['unlimited'] = 'sınırsız';
+$labels['quicksearch'] = 'Hızlı arama';
+$labels['resetsearch'] = 'Aramayı sıfırla';
+$labels['compose'] = 'Yeni posta oluştur';
+$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';
+$labels['revertto'] = 'Revert to';
+$labels['attachments'] = 'Ekler';
+$labels['upload'] = 'Yükle';
+$labels['close'] = 'Kapat';
+$labels['low'] = 'Düşük';
+$labels['lowest'] = 'Çok düşük';
+$labels['normal'] = 'Normal';
+$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';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Seçili kişiyi rehbere ekle';
+$labels['editcontact'] = 'Kişiyi düzenle';
+$labels['edit'] = 'Düzenle';
+$labels['cancel'] = 'İptal';
+$labels['save'] = 'Kaydet';
+$labels['delete'] = 'Sil';
+$labels['newcontact'] = 'Yeni kişi Kartı Ekle';
+$labels['deletecontact'] = 'Seçili kişileri sil';
+$labels['composeto'] = 'Seçili kişiye posta gönder';
+$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['lastpage'] = 'Son sayfa';
+$labels['groups'] = 'Gruplar';
+$labels['personaladrbook'] = 'Adresler';
+$labels['settingsfor'] = 'Ayarlar';
+$labels['preferences'] = 'Tercihler';
+$labels['userpreferences'] = 'Kullanıcı tercihleri';
+$labels['editpreferences'] = 'Kullanıcı tercihlerini düzenle';
+$labels['identities'] = 'Kimlikler';
+$labels['manageidentities'] = 'Bu hesap için kimlikleri düzenle';
+$labels['newidentity'] = 'Yeni kimlik';
+$labels['newitem'] = 'Yeni etiket';
+$labels['edititem'] = 'Etiket düzenle';
+$labels['setdefault'] = 'Varsayılan olarak ayarla';
+$labels['language'] = 'Dil';
+$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';
+$labels['subscribed'] = 'Görülebilir';
+$labels['create'] = 'Yeni Oluştur';
+$labels['createfolder'] = 'Yeni klasör oluştur';
+$labels['rename'] = 'Yeniden adlandır';
+$labels['renamefolder'] = 'Klasörü yeniden adlandır';
+$labels['deletefolder'] = 'Klasörü sil';
+$labels['managefolders'] = 'Klasörleri düzenle';
+$labels['sortby'] = 'Sırala';
+$labels['sortasc'] = 'Azdan çoğa';
+$labels['sortdesc'] = 'Çoktan aza';
+
+?>
\ No newline at end of file
diff --git a/program/localization/tr_TR/messages.inc b/program/localization/tr_TR/messages.inc
new file mode 100644 (file)
index 0000000..68554f8
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/tr/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Giriş Başarısız';
+$messages['cookiesdisabled'] = 'Tarayıcınız cookileri kabul etmiyor';
+$messages['sessionerror'] = 'Oturumunuz sona ermiş veya hatalı';
+$messages['imaperror'] = 'IMAP Servera bağlanılamadı';
+$messages['nomessagesfound'] = 'Posta kutusunda mesaj bulunamadı';
+$messages['loggedout'] = 'Oturumu başarılı bir şekilde kapattınız. Güle güle!';
+$messages['mailboxempty'] = 'Posta kutusu boş';
+$messages['loading'] = 'Yükleniyor...';
+$messages['loadingdata'] = 'Veriler yükleniyor...';
+$messages['checkingmail'] = 'Yeni posta var mı diye kontrol ediliyor...';
+$messages['sendingmessage'] = 'Posta gönderiliyor...';
+$messages['messagesent'] = 'Posta gönderildi';
+$messages['savingmessage'] = 'Posta kaydediliyor...';
+$messages['messagesaved'] = 'Posta taslaklara kaydedildi';
+$messages['successfullysaved'] = 'Kaydedildi';
+$messages['addedsuccessfully'] = 'Kişi rehbere eklendi';
+$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ı';
+$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ış. Þimdi 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';
+$messages['nocontactsreturned'] = 'Kişi bulunamadı';
+$messages['nosearchname'] = 'Lütfen bir kişi ismi veya posta adresi girin';
+$messages['searchsuccessful'] = '$nr tane posta bulundu';
+$messages['searchnomatch'] = 'Aramanıza uygun hiçbir sonuç bulunamadı';
+$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
deleted file mode 100644 (file)
index 8269934..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/uk/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Natali Stasyuk <natali@onlineua.net>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$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['movemessagetotrash'] = 'Перемістити повідомлення у смітник';
-$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['savemessage'] = 'Зберегти чернетку';
-$labels['sendmessage'] = 'Відіслати зараз';
-$labels['addattachment'] = 'Додати вкладення';
-$labels['charset'] = 'Набір символів';
-$labels['editortype'] = 'Редактор';
-$labels['returnreceipt'] = 'Запит відповіді';
-$labels['checkspelling'] = 'Перевірити орфографію';
-$labels['resumeediting'] = 'Продовжити редагування';
-$labels['revertto'] = 'Відмінити правки';
-$labels['attachments'] = 'Вкладення';
-$labels['upload'] = 'Завантажити';
-$labels['close'] = 'Закрити';
-$labels['low'] = 'Низький';
-$labels['lowest'] = 'Найнижчий';
-$labels['normal'] = 'Нормальний';
-$labels['high'] = 'Високий';
-$labels['highest'] = 'Найвищий';
-$labels['nosubject'] = '(без теми)';
-$labels['showimages'] = 'Показати зображення';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Звичайний текст';
-$labels['addcc'] = 'Додати Cc';
-$labels['addbcc'] = 'Додати Bcc';
-$labels['addreplyto'] = 'Додати Reply-To';
-$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'] = 'Персональні адреси';
-$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
deleted file mode 100644 (file)
index 6abef04..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/*
-
- +-----------------------------------------------------------------------+
- | language/uk/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Natali Stasyuk <natali@onlineua.net>                          |
- +-----------------------------------------------------------------------+
-
- @version $Id$
-
-*/
-
-$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'] = 'Неможливо зберегти адресу контакта';
-$messages['movingmessage'] = 'Переміщую повідомлення...';
-
-?>
\ No newline at end of file
diff --git a/program/localization/uk_UA/labels.inc b/program/localization/uk_UA/labels.inc
new file mode 100644 (file)
index 0000000..8269934
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/uk/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Natali Stasyuk <natali@onlineua.net>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$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['movemessagetotrash'] = 'Перемістити повідомлення у смітник';
+$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['savemessage'] = 'Зберегти чернетку';
+$labels['sendmessage'] = 'Відіслати зараз';
+$labels['addattachment'] = 'Додати вкладення';
+$labels['charset'] = 'Набір символів';
+$labels['editortype'] = 'Редактор';
+$labels['returnreceipt'] = 'Запит відповіді';
+$labels['checkspelling'] = 'Перевірити орфографію';
+$labels['resumeediting'] = 'Продовжити редагування';
+$labels['revertto'] = 'Відмінити правки';
+$labels['attachments'] = 'Вкладення';
+$labels['upload'] = 'Завантажити';
+$labels['close'] = 'Закрити';
+$labels['low'] = 'Низький';
+$labels['lowest'] = 'Найнижчий';
+$labels['normal'] = 'Нормальний';
+$labels['high'] = 'Високий';
+$labels['highest'] = 'Найвищий';
+$labels['nosubject'] = '(без теми)';
+$labels['showimages'] = 'Показати зображення';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Звичайний текст';
+$labels['addcc'] = 'Додати Cc';
+$labels['addbcc'] = 'Додати Bcc';
+$labels['addreplyto'] = 'Додати Reply-To';
+$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'] = 'Персональні адреси';
+$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_UA/messages.inc b/program/localization/uk_UA/messages.inc
new file mode 100644 (file)
index 0000000..6abef04
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/uk/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Natali Stasyuk <natali@onlineua.net>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$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'] = 'Неможливо зберегти адресу контакта';
+$messages['movingmessage'] = 'Переміщую повідомлення...';
+
+?>
\ No newline at end of file
diff --git a/program/localization/vi_VN/labels.inc b/program/localization/vi_VN/labels.inc
new file mode 100644 (file)
index 0000000..e4335ec
--- /dev/null
@@ -0,0 +1,217 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/vn/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Vinh Bui <bqvinh@buivinh.info>                                |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$labels = array();\r
+\r
+// login page\r
+$labels['welcome']   = 'Xin mời sử dụng $product';\r
+$labels['username']  = 'Tên người dùng';\r
+$labels['password']  = 'Mật khẩu';\r
+$labels['server']    = 'Máy chủ?';\r
+$labels['login']     = 'Đăng nhập';\r
+\r
+// taskbar\r
+$labels['logout']   = 'Đăng xuất';\r
+$labels['mail']     = 'E-Mail';\r
+$labels['settings'] = 'Thiết lập';\r
+$labels['addressbook'] = 'Sổ địa chỉ';\r
+\r
+// mailbox names\r
+$labels['inbox']  = 'Inbox';\r
+$labels['drafts'] = 'Drafts';\r
+$labels['sent']   = 'Sent';\r
+$labels['trash']  = 'Trash';\r
+$labels['junk']   = 'Junk';\r
+\r
+// message listing\r
+$labels['subject'] = 'Tiêu đề';\r
+$labels['from']    = 'Người gửi';\r
+$labels['to']      = 'Người nhận';\r
+$labels['cc']      = 'Đồng nhận';\r
+$labels['bcc']     = 'Đồng nhận (2)';\r
+$labels['replyto'] = 'Trả lời vào';\r
+$labels['date']    = 'Ngày';\r
+$labels['size']    = 'D.Lượng';\r
+$labels['priority'] = 'Ưu tiên';\r
+$labels['organization'] = 'Cơ quan';\r
+\r
+// aliases\r
+$labels['reply-to'] = $labels['replyto'];\r
+\r
+$labels['mailboxlist'] = 'Thư mục';\r
+$labels['messagesfromto'] = 'Thư $from - $to / $count';\r
+$labels['messagenrof'] = 'Thư $nr / $count';\r
+\r
+$labels['moveto']   = 'chuyển đến...';\r
+$labels['download'] = 'tải xuống';\r
+\r
+$labels['filename'] = 'Tên file';\r
+$labels['filesize'] = 'Dung lượng';\r
+\r
+$labels['preferhtml'] = 'Dùng HTML';\r
+$labels['htmlmessage'] = 'Thư kiểu HTML';\r
+$labels['prettydate'] = 'Hiển thị ngày đầy đủ';\r
+\r
+$labels['addtoaddressbook'] = 'Thêm và sổ địa chỉ';\r
+\r
+// weekdays short\r
+$labels['sun'] = 'CN';\r
+$labels['mon'] = 'T2';\r
+$labels['tue'] = 'T3';\r
+$labels['wed'] = 'T4';\r
+$labels['thu'] = 'T5';\r
+$labels['fri'] = 'T6';\r
+$labels['sat'] = 'T7';\r
+\r
+// weekdays long\r
+$labels['sunday']    = 'Chủ nhật';\r
+$labels['monday']    = 'Thứ hai';\r
+$labels['tuesday']   = 'Thứ ba';\r
+$labels['wednesday'] = 'Thứ tư';\r
+$labels['thursday']  = 'Thứ năm';\r
+$labels['friday']    = 'Thứ sáu';\r
+$labels['saturday']  = 'Thứ bẩy';\r
+\r
+$labels['today'] = 'Hôm nay';\r
+\r
+// toolbar buttons\r
+$labels['checkmail']        = 'Kiểm tra thư mới';\r
+$labels['writenewmessage']  = 'Soạn thư mới';\r
+$labels['replytomessage']   = 'Trả lời thư';\r
+$labels['replytoallmessage'] = 'Trả lời tất cả';\r
+$labels['forwardmessage']   = 'Chuyển thư';\r
+$labels['deletemessage']    = 'Xóa thư';\r
+$labels['printmessage']     = 'In thư';\r
+$labels['previousmessages'] = 'Hiển thị các thư trước';\r
+$labels['nextmessages']     = 'Hiển thị các thư sau';\r
+$labels['backtolist']       = 'Trở về danh sách thư';\r
+$labels['viewsource']       = 'Hiển thị mã nguồn';\r
+\r
+$labels['select'] = 'Chọn';\r
+$labels['all'] = 'Toàn bộ';\r
+$labels['none'] = 'Bỏ chọn';\r
+$labels['unread'] = 'Chưa đọc';\r
+\r
+$labels['compact'] = 'Rút gọn';\r
+$labels['empty'] = 'Xóa rỗng';\r
+$labels['purge'] = 'Tối giản';\r
+\r
+$labels['quota'] = 'Hạn mức';\r
+$labels['unknown']  = 'không rõ';\r
+$labels['unlimited']  = 'không hạn chế';\r
+\r
+$labels['quicksearch']  = 'Tìm nhanh';\r
+$labels['resetsearch']  = 'Xóa bỏ tìm kiếm';\r
+\r
+// message compose\r
+$labels['compose']  = 'Soạn thư';\r
+$labels['savemessage']  = 'Lưu thư đang soạn';\r
+$labels['sendmessage']  = 'Gửi thư';\r
+$labels['addattachment']  = 'Gửi kèm';\r
+$labels['charset']  = 'Bộ ký tự';\r
+$labels['returnreceipt'] = 'Báo nhận';\r
+\r
+$labels['checkspelling'] = 'Kiểm tra chính tả';\r
+$labels['resumeediting'] = 'Soạn thảo';\r
+$labels['revertto'] = 'Chuyển về';\r
+\r
+$labels['attachments'] = 'Gửi kèm';\r
+$labels['upload'] = 'Tải lên';\r
+$labels['close']  = 'Đóng';\r
+\r
+$labels['low']     = 'Thấp';\r
+$labels['lowest']  = 'Thấp nhất';\r
+$labels['normal']  = 'Bình thường';\r
+$labels['high']    = 'Khẩn';\r
+$labels['highest'] = 'Thượng khẩn';\r
+\r
+$labels['nosubject']  = '(no subject)';\r
+$labels['showimages'] = 'Hiển thị ảnh';\r
+\r
+// address boook\r
+$labels['name']      = 'Tên hiển thị';\r
+$labels['firstname'] = 'Tên';\r
+$labels['surname']   = 'Họ';\r
+$labels['email']     = 'E-Mail';\r
+\r
+$labels['addcontact'] = 'Thêm mới địa chỉ';\r
+$labels['editcontact'] = 'Sửa địa chỉ cũ';\r
+\r
+$labels['edit']   = 'Sửa đổi';\r
+$labels['cancel'] = 'Ngưng';\r
+$labels['save']   = 'Lưu';\r
+$labels['delete'] = 'Xóa';\r
+\r
+$labels['newcontact']     = 'Thêm mới địa chỉ liên hệ';\r
+$labels['deletecontact']  = 'Xóa địa chỉ được chọn';\r
+$labels['composeto']      = 'Soạn thư cho';\r
+$labels['contactsfromto'] = 'Địa chỉ từ $from - $to / $count';\r
+$labels['print']          = 'In thư';\r
+$labels['export']         = 'Export';\r
+\r
+$labels['previouspage']   = 'Trang trước';\r
+$labels['nextpage']       = 'Trang tiếp';\r
+\r
+// LDAP search\r
+$labels['ldapsearch'] = 'LDAP directory search';\r
+\r
+$labels['ldappublicsearchname']    = 'Tên địa chỉ';\r
+$labels['ldappublicsearchtype'] = 'Khớp toàn bộ?';\r
+$labels['ldappublicserverselect'] = 'Chọn máy chủ';\r
+$labels['ldappublicsearchfield'] = 'Tìm trên';\r
+$labels['ldappublicsearchform'] = 'Tìm địa chỉ liên hệ';\r
+$labels['ldappublicsearch'] = 'Tìm kiếm';\r
+\r
+// settings\r
+$labels['settingsfor']  = 'Thiết lập cho';\r
+\r
+$labels['preferences']  = 'Tham số';\r
+$labels['userpreferences']  = 'Tham số người dùng';\r
+$labels['editpreferences']  = 'Sửa đổi';\r
+\r
+$labels['identities']  = 'Người dùng';\r
+$labels['manageidentities']  = 'Quản trị người dùng';\r
+$labels['newidentity']  = 'Người dùng mới';\r
+\r
+$labels['newitem']  = 'Thêm mới';\r
+$labels['edititem']  = 'Sửa đổi';\r
+\r
+$labels['setdefault']  = 'Thiết lập mặc định';\r
+$labels['language']  = 'Ngôn ngữ';\r
+$labels['timezone']  = 'Múi giờ';\r
+$labels['pagesize']  = 'Số dòng trên trang';\r
+$labels['signature'] = 'Chữ ký';\r
+$labels['dstactive']  = 'Giờ mùa hè';\r
+\r
+$labels['folder']  = 'Thư mục';\r
+$labels['folders']  = 'Thư mục';\r
+$labels['foldername']  = 'Tên thư mục';\r
+$labels['subscribed']  = 'Cho sử dụng';\r
+$labels['create']  = 'Tạo';\r
+$labels['createfolder']  = 'Tạo thư mục mới';\r
+$labels['rename'] = 'Đổi tên';\r
+$labels['renamefolder'] = 'Đổi tên thư mục';\r
+$labels['deletefolder']  = 'Xóa thư mục';\r
+$labels['managefolders']  = 'Quản trị thư mục';\r
+\r
+$labels['sortby'] = 'Sắp xếp';\r
+$labels['sortasc']  = 'Xếp tăng dần';\r
+$labels['sortdesc'] = 'Xếp giảm dần';\r
+\r
+?>
\ No newline at end of file
diff --git a/program/localization/vi_VN/messages.inc b/program/localization/vi_VN/messages.inc
new file mode 100644 (file)
index 0000000..9cf2fdb
--- /dev/null
@@ -0,0 +1,66 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/vn/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Vinh Bui <bqvinh@buivinh.info>                                |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed']  = 'Không đăng nhập được';\r
+$messages['cookiesdisabled'] = 'Trình duyệt không hỗ trợ cookies';\r
+$messages['sessionerror'] = 'Phiên làm việc không hợp lệ hoặc đã hết hạn';\r
+$messages['imaperror'] = 'Không kết nối được với máy chủ IMAP';\r
+$messages['nomessagesfound'] = 'Không có thư trong hòm thư này';\r
+$messages['loggedout'] = 'Phiên làm việc đã kết thúc. Hẹn gặp lại!';\r
+$messages['mailboxempty'] = 'Hộp thư rỗng';\r
+$messages['loading'] = 'Vui lòng chờ trong giây lát...';\r
+$messages['loadingdata'] = 'Đang nạp dữ liệu...';\r
+$messages['checkingmail'] = 'Kiểm tra thư mới...';\r
+$messages['sendingmessage'] = 'Đang gửi thư...';\r
+$messages['messagesent'] = 'Thư đã được gửi';\r
+$messages['savingmessage'] = 'Đang lưu thư...';\r
+$messages['messagesaved'] = 'Thư đã được gửi vào ngăn Drafts';\r
+$messages['successfullysaved'] = 'Đã lưu thành công';\r
+$messages['addedsuccessfully'] = 'Địa chỉ liên hệ đã được lưu';\r
+$messages['contactexists'] = 'Địa chỉ liên hệ với e-mail này đã được lưu trước đây';\r
+$messages['blockedimages'] = 'Để bảo vệ tính riêng tư, chức năng hiện ảnh từ xa bị cấm trong thư này.';\r
+$messages['encryptedmessage'] = 'Thư này được mã hóa, không thể xem. Rất tiếc!';\r
+$messages['nocontactsfound'] = 'Không tìm thấy địa chỉ liên hệ';\r
+$messages['sendingfailed'] = 'Không gửi được thư';\r
+$messages['errorsaving'] = 'Lỗi khi lưu';\r
+$messages['errormoving'] = 'Không thể chuyển được thư';\r
+$messages['errordeleting'] = 'Không thể xóa được thư';\r
+$messages['deletecontactconfirm']  = 'Xóa bỏ các địa chỉ được chọn?';\r
+$messages['deletefolderconfirm']  = 'Xóa bỏ thư mục này?';\r
+$messages['purgefolderconfirm']  = 'Xóa toàn bộ thư trong thư mục nào?';\r
+$messages['formincomplete'] = 'Mẫu chưa được điền xong';\r
+$messages['noemailwarning'] = 'Nhập địa chỉ email';\r
+$messages['nonamewarning']  = 'Nhập tên';\r
+$messages['nopagesizewarning'] = 'Nhập kích cỡ của trang';\r
+$messages['norecipientwarning'] = 'Thư cần có it nhất 1 người nhận';\r
+$messages['nosubjectwarning']  = 'Mục "Tiêu đề" chưa có. Điền tiêu đề ?';\r
+$messages['nobodywarning'] = 'Thư không nội dung, vẫn tiếp tục gửi?';\r
+$messages['notsentwarning'] = 'Thư chưa được gửi. Bỏ qua thư đang soạn?';\r
+$messages['noldapserver'] = 'Chọn máy chủ ldap server để tìm';\r
+$messages['nocontactsreturned'] = 'Không tìm thấy địa chỉ';\r
+$messages['nosearchname'] = 'Nhập địa chỉ hoặc email';\r
+$messages['searchsuccessful'] = '$nr messages found';\r
+$messages['searchnomatch'] = 'Không tìm thấy';\r
+$messages['searching'] = 'Tìm kiếm...';\r
+$messages['checking'] = 'Kiểm tra...';\r
+$messages['nospellerrors'] = 'Không có lỗi chính tả';\r
+$messages['folderdeleted'] = 'Thư mục đã được xóa';\r
+\r
+?>
\ No newline at end of file
diff --git a/program/localization/vn/labels.inc b/program/localization/vn/labels.inc
deleted file mode 100644 (file)
index e4335ec..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php\r
-\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/vn/labels.inc                                                |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Vinh Bui <bqvinh@buivinh.info>                                |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$labels = array();\r
-\r
-// login page\r
-$labels['welcome']   = 'Xin mời sử dụng $product';\r
-$labels['username']  = 'Tên người dùng';\r
-$labels['password']  = 'Mật khẩu';\r
-$labels['server']    = 'Máy chủ?';\r
-$labels['login']     = 'Đăng nhập';\r
-\r
-// taskbar\r
-$labels['logout']   = 'Đăng xuất';\r
-$labels['mail']     = 'E-Mail';\r
-$labels['settings'] = 'Thiết lập';\r
-$labels['addressbook'] = 'Sổ địa chỉ';\r
-\r
-// mailbox names\r
-$labels['inbox']  = 'Inbox';\r
-$labels['drafts'] = 'Drafts';\r
-$labels['sent']   = 'Sent';\r
-$labels['trash']  = 'Trash';\r
-$labels['junk']   = 'Junk';\r
-\r
-// message listing\r
-$labels['subject'] = 'Tiêu đề';\r
-$labels['from']    = 'Người gửi';\r
-$labels['to']      = 'Người nhận';\r
-$labels['cc']      = 'Đồng nhận';\r
-$labels['bcc']     = 'Đồng nhận (2)';\r
-$labels['replyto'] = 'Trả lời vào';\r
-$labels['date']    = 'Ngày';\r
-$labels['size']    = 'D.Lượng';\r
-$labels['priority'] = 'Ưu tiên';\r
-$labels['organization'] = 'Cơ quan';\r
-\r
-// aliases\r
-$labels['reply-to'] = $labels['replyto'];\r
-\r
-$labels['mailboxlist'] = 'Thư mục';\r
-$labels['messagesfromto'] = 'Thư $from - $to / $count';\r
-$labels['messagenrof'] = 'Thư $nr / $count';\r
-\r
-$labels['moveto']   = 'chuyển đến...';\r
-$labels['download'] = 'tải xuống';\r
-\r
-$labels['filename'] = 'Tên file';\r
-$labels['filesize'] = 'Dung lượng';\r
-\r
-$labels['preferhtml'] = 'Dùng HTML';\r
-$labels['htmlmessage'] = 'Thư kiểu HTML';\r
-$labels['prettydate'] = 'Hiển thị ngày đầy đủ';\r
-\r
-$labels['addtoaddressbook'] = 'Thêm và sổ địa chỉ';\r
-\r
-// weekdays short\r
-$labels['sun'] = 'CN';\r
-$labels['mon'] = 'T2';\r
-$labels['tue'] = 'T3';\r
-$labels['wed'] = 'T4';\r
-$labels['thu'] = 'T5';\r
-$labels['fri'] = 'T6';\r
-$labels['sat'] = 'T7';\r
-\r
-// weekdays long\r
-$labels['sunday']    = 'Chủ nhật';\r
-$labels['monday']    = 'Thứ hai';\r
-$labels['tuesday']   = 'Thứ ba';\r
-$labels['wednesday'] = 'Thứ tư';\r
-$labels['thursday']  = 'Thứ năm';\r
-$labels['friday']    = 'Thứ sáu';\r
-$labels['saturday']  = 'Thứ bẩy';\r
-\r
-$labels['today'] = 'Hôm nay';\r
-\r
-// toolbar buttons\r
-$labels['checkmail']        = 'Kiểm tra thư mới';\r
-$labels['writenewmessage']  = 'Soạn thư mới';\r
-$labels['replytomessage']   = 'Trả lời thư';\r
-$labels['replytoallmessage'] = 'Trả lời tất cả';\r
-$labels['forwardmessage']   = 'Chuyển thư';\r
-$labels['deletemessage']    = 'Xóa thư';\r
-$labels['printmessage']     = 'In thư';\r
-$labels['previousmessages'] = 'Hiển thị các thư trước';\r
-$labels['nextmessages']     = 'Hiển thị các thư sau';\r
-$labels['backtolist']       = 'Trở về danh sách thư';\r
-$labels['viewsource']       = 'Hiển thị mã nguồn';\r
-\r
-$labels['select'] = 'Chọn';\r
-$labels['all'] = 'Toàn bộ';\r
-$labels['none'] = 'Bỏ chọn';\r
-$labels['unread'] = 'Chưa đọc';\r
-\r
-$labels['compact'] = 'Rút gọn';\r
-$labels['empty'] = 'Xóa rỗng';\r
-$labels['purge'] = 'Tối giản';\r
-\r
-$labels['quota'] = 'Hạn mức';\r
-$labels['unknown']  = 'không rõ';\r
-$labels['unlimited']  = 'không hạn chế';\r
-\r
-$labels['quicksearch']  = 'Tìm nhanh';\r
-$labels['resetsearch']  = 'Xóa bỏ tìm kiếm';\r
-\r
-// message compose\r
-$labels['compose']  = 'Soạn thư';\r
-$labels['savemessage']  = 'Lưu thư đang soạn';\r
-$labels['sendmessage']  = 'Gửi thư';\r
-$labels['addattachment']  = 'Gửi kèm';\r
-$labels['charset']  = 'Bộ ký tự';\r
-$labels['returnreceipt'] = 'Báo nhận';\r
-\r
-$labels['checkspelling'] = 'Kiểm tra chính tả';\r
-$labels['resumeediting'] = 'Soạn thảo';\r
-$labels['revertto'] = 'Chuyển về';\r
-\r
-$labels['attachments'] = 'Gửi kèm';\r
-$labels['upload'] = 'Tải lên';\r
-$labels['close']  = 'Đóng';\r
-\r
-$labels['low']     = 'Thấp';\r
-$labels['lowest']  = 'Thấp nhất';\r
-$labels['normal']  = 'Bình thường';\r
-$labels['high']    = 'Khẩn';\r
-$labels['highest'] = 'Thượng khẩn';\r
-\r
-$labels['nosubject']  = '(no subject)';\r
-$labels['showimages'] = 'Hiển thị ảnh';\r
-\r
-// address boook\r
-$labels['name']      = 'Tên hiển thị';\r
-$labels['firstname'] = 'Tên';\r
-$labels['surname']   = 'Họ';\r
-$labels['email']     = 'E-Mail';\r
-\r
-$labels['addcontact'] = 'Thêm mới địa chỉ';\r
-$labels['editcontact'] = 'Sửa địa chỉ cũ';\r
-\r
-$labels['edit']   = 'Sửa đổi';\r
-$labels['cancel'] = 'Ngưng';\r
-$labels['save']   = 'Lưu';\r
-$labels['delete'] = 'Xóa';\r
-\r
-$labels['newcontact']     = 'Thêm mới địa chỉ liên hệ';\r
-$labels['deletecontact']  = 'Xóa địa chỉ được chọn';\r
-$labels['composeto']      = 'Soạn thư cho';\r
-$labels['contactsfromto'] = 'Địa chỉ từ $from - $to / $count';\r
-$labels['print']          = 'In thư';\r
-$labels['export']         = 'Export';\r
-\r
-$labels['previouspage']   = 'Trang trước';\r
-$labels['nextpage']       = 'Trang tiếp';\r
-\r
-// LDAP search\r
-$labels['ldapsearch'] = 'LDAP directory search';\r
-\r
-$labels['ldappublicsearchname']    = 'Tên địa chỉ';\r
-$labels['ldappublicsearchtype'] = 'Khớp toàn bộ?';\r
-$labels['ldappublicserverselect'] = 'Chọn máy chủ';\r
-$labels['ldappublicsearchfield'] = 'Tìm trên';\r
-$labels['ldappublicsearchform'] = 'Tìm địa chỉ liên hệ';\r
-$labels['ldappublicsearch'] = 'Tìm kiếm';\r
-\r
-// settings\r
-$labels['settingsfor']  = 'Thiết lập cho';\r
-\r
-$labels['preferences']  = 'Tham số';\r
-$labels['userpreferences']  = 'Tham số người dùng';\r
-$labels['editpreferences']  = 'Sửa đổi';\r
-\r
-$labels['identities']  = 'Người dùng';\r
-$labels['manageidentities']  = 'Quản trị người dùng';\r
-$labels['newidentity']  = 'Người dùng mới';\r
-\r
-$labels['newitem']  = 'Thêm mới';\r
-$labels['edititem']  = 'Sửa đổi';\r
-\r
-$labels['setdefault']  = 'Thiết lập mặc định';\r
-$labels['language']  = 'Ngôn ngữ';\r
-$labels['timezone']  = 'Múi giờ';\r
-$labels['pagesize']  = 'Số dòng trên trang';\r
-$labels['signature'] = 'Chữ ký';\r
-$labels['dstactive']  = 'Giờ mùa hè';\r
-\r
-$labels['folder']  = 'Thư mục';\r
-$labels['folders']  = 'Thư mục';\r
-$labels['foldername']  = 'Tên thư mục';\r
-$labels['subscribed']  = 'Cho sử dụng';\r
-$labels['create']  = 'Tạo';\r
-$labels['createfolder']  = 'Tạo thư mục mới';\r
-$labels['rename'] = 'Đổi tên';\r
-$labels['renamefolder'] = 'Đổi tên thư mục';\r
-$labels['deletefolder']  = 'Xóa thư mục';\r
-$labels['managefolders']  = 'Quản trị thư mục';\r
-\r
-$labels['sortby'] = 'Sắp xếp';\r
-$labels['sortasc']  = 'Xếp tăng dần';\r
-$labels['sortdesc'] = 'Xếp giảm dần';\r
-\r
-?>
\ No newline at end of file
diff --git a/program/localization/vn/messages.inc b/program/localization/vn/messages.inc
deleted file mode 100644 (file)
index 9cf2fdb..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php\r
-\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/vn/messages.inc                                              |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Vinh Bui <bqvinh@buivinh.info>                                |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed']  = 'Không đăng nhập được';\r
-$messages['cookiesdisabled'] = 'Trình duyệt không hỗ trợ cookies';\r
-$messages['sessionerror'] = 'Phiên làm việc không hợp lệ hoặc đã hết hạn';\r
-$messages['imaperror'] = 'Không kết nối được với máy chủ IMAP';\r
-$messages['nomessagesfound'] = 'Không có thư trong hòm thư này';\r
-$messages['loggedout'] = 'Phiên làm việc đã kết thúc. Hẹn gặp lại!';\r
-$messages['mailboxempty'] = 'Hộp thư rỗng';\r
-$messages['loading'] = 'Vui lòng chờ trong giây lát...';\r
-$messages['loadingdata'] = 'Đang nạp dữ liệu...';\r
-$messages['checkingmail'] = 'Kiểm tra thư mới...';\r
-$messages['sendingmessage'] = 'Đang gửi thư...';\r
-$messages['messagesent'] = 'Thư đã được gửi';\r
-$messages['savingmessage'] = 'Đang lưu thư...';\r
-$messages['messagesaved'] = 'Thư đã được gửi vào ngăn Drafts';\r
-$messages['successfullysaved'] = 'Đã lưu thành công';\r
-$messages['addedsuccessfully'] = 'Địa chỉ liên hệ đã được lưu';\r
-$messages['contactexists'] = 'Địa chỉ liên hệ với e-mail này đã được lưu trước đây';\r
-$messages['blockedimages'] = 'Để bảo vệ tính riêng tư, chức năng hiện ảnh từ xa bị cấm trong thư này.';\r
-$messages['encryptedmessage'] = 'Thư này được mã hóa, không thể xem. Rất tiếc!';\r
-$messages['nocontactsfound'] = 'Không tìm thấy địa chỉ liên hệ';\r
-$messages['sendingfailed'] = 'Không gửi được thư';\r
-$messages['errorsaving'] = 'Lỗi khi lưu';\r
-$messages['errormoving'] = 'Không thể chuyển được thư';\r
-$messages['errordeleting'] = 'Không thể xóa được thư';\r
-$messages['deletecontactconfirm']  = 'Xóa bỏ các địa chỉ được chọn?';\r
-$messages['deletefolderconfirm']  = 'Xóa bỏ thư mục này?';\r
-$messages['purgefolderconfirm']  = 'Xóa toàn bộ thư trong thư mục nào?';\r
-$messages['formincomplete'] = 'Mẫu chưa được điền xong';\r
-$messages['noemailwarning'] = 'Nhập địa chỉ email';\r
-$messages['nonamewarning']  = 'Nhập tên';\r
-$messages['nopagesizewarning'] = 'Nhập kích cỡ của trang';\r
-$messages['norecipientwarning'] = 'Thư cần có it nhất 1 người nhận';\r
-$messages['nosubjectwarning']  = 'Mục "Tiêu đề" chưa có. Điền tiêu đề ?';\r
-$messages['nobodywarning'] = 'Thư không nội dung, vẫn tiếp tục gửi?';\r
-$messages['notsentwarning'] = 'Thư chưa được gửi. Bỏ qua thư đang soạn?';\r
-$messages['noldapserver'] = 'Chọn máy chủ ldap server để tìm';\r
-$messages['nocontactsreturned'] = 'Không tìm thấy địa chỉ';\r
-$messages['nosearchname'] = 'Nhập địa chỉ hoặc email';\r
-$messages['searchsuccessful'] = '$nr messages found';\r
-$messages['searchnomatch'] = 'Không tìm thấy';\r
-$messages['searching'] = 'Tìm kiếm...';\r
-$messages['checking'] = 'Kiểm tra...';\r
-$messages['nospellerrors'] = 'Không có lỗi chính tả';\r
-$messages['folderdeleted'] = 'Thư mục đã được xóa';\r
-\r
-?>
\ No newline at end of file
index 19486f5f14d2a3c536b21903c2436bb1c6b1b2ca..e7eb62b24cbb27383ba4256941b0af94b9202b0c 100644 (file)
@@ -2,18 +2,19 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | localization/zh_CN/labels.inc                                         |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| localization/zh_CN/labels.inc                                         |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
+|         Zhang Huang bin <michaelbibby@gmail.com>                      |
++-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1255 2008-04-05 12:49:21Z thomasb $
+@version $Id: labels.inc 1428 2008-05-26 17:18:31Z alec $
 
 */
 
@@ -68,6 +69,30 @@ $labels['wednesday'] = '星期三';
 $labels['thursday'] = '星期四';
 $labels['friday'] = '星期五';
 $labels['saturday'] = '星期六';
+$labels['jan'] = '一月';
+$labels['feb'] = '二月';
+$labels['mar'] = '三月';
+$labels['apr'] = '四月';
+$labels['may'] = '五月';
+$labels['jun'] = '六月';
+$labels['jul'] = '七月';
+$labels['aug'] = '八月';
+$labels['sep'] = '九月';
+$labels['oct'] = '十月';
+$labels['nov'] = '十一月';
+$labels['dec'] = '十二月';
+$labels['longjan'] = '一月';
+$labels['longfeb'] = '二月';
+$labels['longmar'] = '三月';
+$labels['longapr'] = '四月';
+$labels['longmay'] = '五月';
+$labels['longjun'] = '六月';
+$labels['longjul'] = '七月';
+$labels['longaug'] = '八月';
+$labels['longsep'] = '九月';
+$labels['longoct'] = '十月';
+$labels['longnov'] = '十一月';
+$labels['longdec'] = '十二月';
 $labels['today'] = '今日';
 $labels['checkmail'] = '检查邮件';
 $labels['writenewmessage'] = '写新邮件';
@@ -75,6 +100,7 @@ $labels['replytomessage'] = '回复';
 $labels['replytoallmessage'] = '全部回复';
 $labels['forwardmessage'] = '转发';
 $labels['deletemessage'] = '删除';
+$labels['movemessagetotrash'] = '移动邮件到回收站';
 $labels['printmessage'] = '打印';
 $labels['previousmessage'] = '上一封';
 $labels['previousmessages'] = '上一页';
@@ -86,6 +112,9 @@ $labels['lastmessage'] = '最后一封';
 $labels['lastmessages'] = '最后一页';
 $labels['backtolist'] = '返回邮件列表';
 $labels['viewsource'] = '显示邮件原文';
+$labels['markmessages'] = '标记邮件';
+$labels['markread'] = '已读';
+$labels['markunread'] = '未读';
 $labels['select'] = '选择';
 $labels['all'] = '全部';
 $labels['none'] = '无';
@@ -120,6 +149,13 @@ $labels['nosubject'] = '(无主题)';
 $labels['showimages'] = '显示图片';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = '纯文本';
+$labels['addcc'] = '添加抄送';
+$labels['addbcc'] = '添加暗送';
+$labels['addreplyto'] = '添加回复';
+$labels['mdnrequest'] = '发件人要求在您阅读这封邮件时发送通知。您是否希望通知发件人?';
+$labels['receiptread'] = '发送回执(已读)';
+$labels['yourmessage'] = '这是您的邮件回执';
+$labels['receiptnote'] = '注意:回执只表示邮件在收件人的电脑上被打开过,不表示收件人已经阅读或已理解邮件的内容。';
 $labels['name'] = '显示名称';
 $labels['firstname'] = '名称';
 $labels['surname'] = '姓氏';
@@ -160,6 +196,17 @@ $labels['dstactive'] = '夏令时';
 $labels['htmleditor'] = '使用HTML编辑器';
 $labels['htmlsignature'] = '使用HTML签名';
 $labels['previewpane'] = '显示预览窗口';
+$labels['logoutclear'] = '退出时清空回收站';
+$labels['logoutcompact'] = '退出时压缩收件箱';
+$labels['uisettings'] = '用户界面';
+$labels['serversettings'] = '服务器设置';
+$labels['mailboxview'] = '邮箱查看';
+$labels['mdnrequests'] = '发件人通知';
+$labels['askuser'] = '询问用户';
+$labels['autosend'] = '自动发送';
+$labels['ignore'] = '乎略';
+$labels['readwhendeleted'] = '删除后标记为已读';
+$labels['flagfordeletion'] = '标记邮件为已删除而不是实际删除';
 $labels['autosavedraft'] = '自动保存到草稿箱';
 $labels['everynminutes'] = '第 $n 分钟';
 $labels['never'] = '从不';
@@ -167,6 +214,7 @@ $labels['folder'] = '邮件夹';
 $labels['folders'] = '邮件夹';
 $labels['foldername'] = '邮件夹名称';
 $labels['subscribed'] = '已订阅';
+$labels['messagecount'] = '邮件数量';
 $labels['create'] = '建立';
 $labels['createfolder'] = '建立新邮件夹';
 $labels['rename'] = '重命名';
index dcf5a9aa649f863a9115157755fbf06d47f3f1b7..22afe93e62068634beab1a49a167a13f2638a167 100644 (file)
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
+ |         Zhang Huang bin <michaelbibby@gmail.com>                      |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 1255 2008-04-05 12:49:21Z thomasb $
+ @version $Id: messages.inc 1415 2008-05-21 13:23:00Z alec $
 
 */
 
index 3d256b9efbf9cd57e7146b477c29c03696d22dc1..ed883a141e4ee9c12c85bb0721ef9a88d09aa1f8 100644 (file)
@@ -14,7 +14,7 @@
  |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1086 2008-02-15 05:43:32Z tomekp $
+ @version $Id: labels.inc 1277 2008-04-10 10:01:46Z alec $
 
 */
 
@@ -31,8 +31,8 @@ $labels['addressbook'] = '通訊錄';
 $labels['inbox'] = '信件匣';
 $labels['drafts'] = '草稿匣';
 $labels['sent'] = '寄件備份';
-$labels['trash'] = '垃圾é\83µä»¶';
-$labels['junk'] = '垃圾桶';
+$labels['trash'] = '垃圾桶';
+$labels['junk'] = '垃圾é\83µä»¶';
 $labels['subject'] = '主旨';
 $labels['from'] = '寄件者';
 $labels['to'] = '收件者';
index 20e98ce59a4293204a0bb93cd2acf98cb7534faa..d429dbad6a59089a4595826daee46115441a89b1 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: delete.inc 573 2007-05-18 11:29:25Z thomasb $
+ $Id: delete.inc 1361 2008-05-07 22:16:00Z richs $
 
 */
 
-if (($cid = get_input_value('_cid', RCUBE_INPUT_POST)) && preg_match('/^[0-9]+(,[0-9]+)*$/', $cid))
+if (($cid = get_input_value('_cid', RCUBE_INPUT_POST)) &&
+    (preg_match('/^[0-9]+(,[0-9]+)*$/', $cid) ||
+     preg_match('/^[a-zA-Z0-9=]+(,[a-zA-Z0-9=]+)*$/', $cid))
+   )
   {
   $deleted = $CONTACTS->delete($cid);
   if (!$deleted)
index 918625ea619174fed1f8c397e13416607a7a0c1d..4ba92a7ad40ca11b195a59fc6177f3944fa924b9 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: edit.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: edit.inc 1361 2008-05-07 22:16:00Z richs $
 
 */
 
@@ -33,10 +33,10 @@ if ($CONTACTS->readonly)
 
 function rcmail_contact_editform($attrib)
 {
-  global $CONTACTS, $OUTPUT;
+  global $RCMAIL, $CONTACTS, $OUTPUT;
 
   // check if we have a valid result
-  if ($GLOBALS['_action'] != 'add' && !(($result = $CONTACTS->get_result()) && ($record = $result->first())))
+  if ($RCMAIL->action != 'add' && !(($result = $CONTACTS->get_result()) && ($record = $result->first())))
   {
     $OUTPUT->show_message('contactnotfound');
     return false;
@@ -83,20 +83,20 @@ $OUTPUT->add_handler('contacteditform', 'rcmail_contact_editform');
 // similar function as in /steps/settings/edit_identity.inc
 function get_form_tags($attrib)
   {
-  global $CONTACTS, $OUTPUT, $EDIT_FORM, $SESS_HIDDEN_FIELD;  
+  global $CONTACTS, $EDIT_FORM, $RCMAIL;
 
   $result = $CONTACTS->get_result();
   $form_start = '';
   if (!strlen($EDIT_FORM))
     {
-    $hiddenfields = new hiddenfield(array('name' => '_task', 'value' => $GLOBALS['_task']));
+    $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $RCMAIL->task));
     $hiddenfields->add(array('name' => '_action', 'value' => 'save', 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
+    $hiddenfields->add(array('name' => '_source', 'value' => get_input_value('_source', RCUBE_INPUT_GPC)));
     
     if (($result = $CONTACTS->get_result()) && ($record = $result->first()))
       $hiddenfields->add(array('name' => '_cid', 'value' => $record['ID']));
     
-    $form_start = !strlen($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
-    $form_start .= "\n$SESS_HIDDEN_FIELD\n";
+    $form_start = !strlen($attrib['form']) ? $RCMAIL->output->form_tag(array('name' => "form", 'method' => "post")) : '';
     $form_start .= $hiddenfields->show();
     }
     
@@ -104,18 +104,18 @@ function get_form_tags($attrib)
   $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form';
   
   if (!strlen($EDIT_FORM))
-    $OUTPUT->add_gui_object('editform', $form_name);
+    $RCMAIL->output->add_gui_object('editform', $form_name);
   
   $EDIT_FORM = $form_name;
 
-  return array($form_start, $form_end);  
+  return array($form_start, $form_end); 
   }
 
 
 
 if (!$CONTACTS->get_result() && template_exists('addcontact'))
-  parse_template('addcontact');
+  $OUTPUT->send('addcontact');
 
 // this will be executed if no template for addcontact exists
-parse_template('editcontact');
-?>
\ No newline at end of file
+$OUTPUT->send('editcontact');
+?>
index 44468d15ff99541367f624dde9823b83ad1fa985..068fdb762bfc17e39624737f27f181f79e8354e9 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 930 2007-11-25 17:34:19Z thomasb $
+ $Id: func.inc 1412 2008-05-21 07:45:54Z alec $
 
 */
 
-require_once('include/rcube_contacts.inc');
-require_once('include/rcube_ldap.inc');
-
 // instantiate a contacts object according to the given source
 if (($source = get_input_value('_source', RCUBE_INPUT_GPC)) && isset($CONFIG['ldap_public'][$source]))
   $CONTACTS = new rcube_ldap($CONFIG['ldap_public'][$source]);
-else
-  $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
+else if (strtolower($CONFIG['address_book_type']) == 'ldap') {
+    // Get the first LDAP address book.
+    $source = key((array)$CONFIG['ldap_public']);
+    $prop = current((array)$CONFIG['ldap_public']);
+    $CONTACTS = new rcube_ldap($prop);
+} else {
+    $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
+} // end else
 
 $CONTACTS->set_pagesize($CONFIG['pagesize']);
 
@@ -45,9 +48,13 @@ $OUTPUT->set_env('source', $source ? $source : '0');
 $OUTPUT->set_env('readonly', $CONTACTS->readonly, false);
 
 // add list of address sources to client env
-$js_list = array("0" => array('id' => 0, 'readonly' => false));
+$js_list = array();
+if (strtolower($CONFIG['address_book_type']) != 'ldap') {
+  // We are using the DB address book, add it.
+  $js_list = array("0" => array('id' => 0, 'readonly' => false));
+} // end if
 foreach ((array)$CONFIG['ldap_public'] as $id => $prop)
-  $js_list[$id] = array('id' => $id, 'readonly' => !$prop['writeable']);
+  $js_list[$id] = array('id' => $id, 'readonly' => !$prop['writable']);
 $OUTPUT->set_env('address_sources', $js_list);
 
 
@@ -69,19 +76,28 @@ function rcmail_directory_list($attrib)
     
   // allow the following attributes to be added to the <ul> tag
   $out = '<ul' . create_attrib_string($attrib, array('style', 'class', 'id')) . ">\n";
-  $out .= sprintf($line_templ,
-    'rcmli'.$local_id,
-    !$current ? 'selected' : '',
-    Q(rcmail_url('list', array('_source' => 0))),
-    JS_OBJECT_NAME,
-    $local_id,
-    JS_OBJECT_NAME,
-    $local_id,
-    JS_OBJECT_NAME,
-    $local_id,
-    JS_OBJECT_NAME,
-    $local_id,
-    rcube_label('personaladrbook'));
+  if (strtolower($CONFIG['address_book_type']) != 'ldap') {
+    $out .= sprintf($line_templ,
+      'rcmli'.$local_id,
+      !$current ? 'selected' : '',
+      Q(rcmail_url('list', array('_source' => 0))),
+      JS_OBJECT_NAME,
+      $local_id,
+      JS_OBJECT_NAME,
+      $local_id,
+      JS_OBJECT_NAME,
+      $local_id,
+      JS_OBJECT_NAME,
+      $local_id,
+      rcube_label('personaladrbook'));
+  } // end if
+  else {
+    // DB address book not used, see if a source is set, if not use the
+    // first LDAP directory.
+    if (!$current) {
+      $current = key((array)$CONFIG['ldap_public']);
+    } // end if
+  } // end else
   
   foreach ((array)$CONFIG['ldap_public'] as $id => $prop)
   {
@@ -157,7 +173,7 @@ function rcmail_js_contacts_list($result, $prefix='')
     
     // format each col
     foreach ($a_show_cols as $col)
-      $a_row_cols[$col] = $row[$col];
+      $a_row_cols[$col] = Q($row[$col]);
     
     $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols);
     }
@@ -223,7 +239,8 @@ function rcmail_get_rowcount_text()
 
   return $out;
   }
-  
+
+$OUTPUT->set_pagetitle(rcube_label('addressbook'));
   
 // register UI objects
 $OUTPUT->add_handlers(array(
@@ -231,7 +248,7 @@ $OUTPUT->add_handlers(array(
   'addresslist' => 'rcmail_contacts_list',
   'addressframe' => 'rcmail_contact_frame',
   'recordscountdisplay' => 'rcmail_rowcount_display',
-  'searchform' => 'rcmail_search_form'
+  'searchform' => array($OUTPUT, 'search_form')
 ));
 
 ?>
index f80f6ce442fae33c1c51ee182cbcdc4e654cce8a..234a3c9909e8be5f85fae15b72b1ee6f5c317295 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save.inc 638 2007-07-03 17:25:05Z thomasb $
+ $Id: save.inc 1407 2008-05-19 17:47:45Z thomasb $
 
 */
 
@@ -28,7 +28,7 @@ if ($CONTACTS->readonly)
 }
 
 // check input
-if ((!get_input_value('_name', RCUBE_INPUT_POST) || !get_input_value('_email', RCUBE_INPUT_POST)) && $_framed)
+if ((!get_input_value('_name', RCUBE_INPUT_POST) || !get_input_value('_email', RCUBE_INPUT_POST)))
 {
   $OUTPUT->show_message('formincomplete', 'warning');
   rcmail_overwrite_action(empty($_POST['_cid']) ? 'add' : 'show');
@@ -54,18 +54,15 @@ if (!empty($cid))
 {
   if ($CONTACTS->update($cid, $a_record))
   {
-    if ($_framed)
-    {
-      // define list of cols to be displayed
-      $a_js_cols = array();
-      $record = $CONTACTS->get_record($cid, true);
-
-      foreach (array('name', 'email') as $col)
-        $a_js_cols[] = (string)$record[$col];
-
-      // update the changed col in list
-      $OUTPUT->command('parent.update_contact_row', $cid, $a_js_cols);
-    }
+    // define list of cols to be displayed
+    $a_js_cols = array();
+    $record = $CONTACTS->get_record($cid, true);
+
+    foreach (array('name', 'email') as $col)
+      $a_js_cols[] = (string)$record[$col];
+
+    // update the changed col in list
+    $OUTPUT->command('parent.update_contact_row', $cid, $a_js_cols);
       
     // show confirmation
     $OUTPUT->show_message('successfullysaved', 'confirmation');    
@@ -96,19 +93,16 @@ else
   // insert record and send response
   if ($insert_id = $CONTACTS->insert($a_record))
   {
-    if ($_framed)
-    {
-      // add contact row or jump to the page where it should appear
-      $CONTACTS->reset();
-      $result = $CONTACTS->search($CONTACTS->primary_key, $insert_id);
-
-      rcmail_js_contacts_list($result, 'parent.');
-      $OUTPUT->command('parent.contact_list.select', $insert_id);
-
-      // update record count display
-      $CONTACTS->reset();
-      $OUTPUT->command('parent.set_rowcount', rcmail_get_rowcount_text());
-    }
+    // add contact row or jump to the page where it should appear
+    $CONTACTS->reset();
+    $result = $CONTACTS->search($CONTACTS->primary_key, $insert_id);
+
+    rcmail_js_contacts_list($result, 'parent.');
+    $OUTPUT->command('parent.contact_list.select', $insert_id);
+
+    // update record count display
+    $CONTACTS->reset();
+    $OUTPUT->command('parent.set_rowcount', rcmail_get_rowcount_text());
 
     // show confirmation
     $OUTPUT->show_message('successfullysaved', 'confirmation');
index a3060b4fd38f59d0ce7216c75a10a9ff86c02731..f028fa2be309fb634f6921950f6b57ffbc313eea 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: error.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: error.inc 1347 2008-04-30 14:07:29Z thomasb $
 
 */
 
@@ -99,9 +99,8 @@ EOF;
 
 if (template_exists('error'))
   {
-  $OUTPUT->scripts = array();
-  $OUTPUT->script_files = array();
-  parse_template('error');
+  $OUTPUT->reset();
+  $OUTPUT->send('error');
   }
 
 
index 775a36b2b74fcdc4411ce5531dfa5c3c25edec40..d2a334e4111a41ef7eebbcb8ce25a386d565fa84 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: addcontact.inc 638 2007-07-03 17:25:05Z thomasb $
+ $Id: addcontact.inc 1365 2008-05-08 08:22:18Z alec $
 
 */
 
-require_once('include/rcube_contacts.inc');
-
 $done = false;
 
 if (!empty($_POST['_address']))
 {
-  $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
+  $CONTACTS = array();
+  if (strtolower($CONFIG['address_book_type']) == 'ldap') {
+    // Use the first writable LDAP address book.
+    foreach ($CONFIG["ldap_public"] as $id => $prop) {
+      if ($prop["writable"]) {
+        $CONTACTS = new rcube_ldap($prop);
+        break;
+      } // end if
+    } // end foreach
+  } // end if
+  else {
+    $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
+  } // end else
   $contact_arr = $IMAP->decode_address_list(get_input_value('_address', RCUBE_INPUT_POST, true), 1, false);
   
   if (!empty($contact_arr[1]['mailto']))
@@ -52,4 +62,4 @@ if (!$done)
   $OUTPUT->show_message('errorsavingcontact', 'warning');
 
 $OUTPUT->send();
-?>
\ No newline at end of file
+?>
index 3e0301613171cd376602bb4c5bbcf1f40410161d..dee8ca61b4100d6e24834cc9367acb7d9092f33f 100644 (file)
@@ -37,7 +37,7 @@ foreach ($a_mailboxes as $mbox_name)
       $OUTPUT->set_env('messagecount', $IMAP->messagecount());
       $OUTPUT->command('set_unread_count', $mbox_name, $unread_count, ($mbox_name == 'INBOX'));
       $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
-      $OUTPUT->command('set_quota', $IMAP->get_quota());
+      $OUTPUT->command('set_quota', rcmail_quota_content($IMAP->get_quota()));
 
       // add new message headers to list
       $a_headers = array();
index 661649dd0400cdeca09fe779dcf1cea4709356d1..f24c119dd9d046b61770a0603044e4b10a247a4a 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/compose.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: compose.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: compose.inc 1493 2008-06-08 18:17:09Z alec $
 
 */
 
-require_once('Mail/mimeDecode.php');
-require_once('lib/html2text.inc');
-
 // define constants for message compose mode
 define('RCUBE_COMPOSE_REPLY', 0x0106);
 define('RCUBE_COMPOSE_FORWARD', 0x0107);
@@ -29,7 +26,7 @@ define('RCUBE_COMPOSE_DRAFT', 0x0108);
 
 
 // remove an attachment
-if ($_action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_POST['_file'], $regs))
+if ($RCMAIL->action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_POST['_file'], $regs))
 {
   $id = $regs[1];
   if (is_array($_SESSION['compose']['attachments'][$id]))
@@ -42,7 +39,7 @@ if ($_action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_POST['_
   }
 }
 
-if ($_action=='display-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs))
+if ($RCMAIL->action=='display-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs))
 {
   $id = $regs[1];
   if (is_array($_SESSION['compose']['attachments'][$id]))
@@ -84,28 +81,22 @@ else if ($msg_uid = get_input_value('_forward_uid', RCUBE_INPUT_GET))
 else if ($msg_uid = get_input_value('_draft_uid', RCUBE_INPUT_GET))
   $compose_mode = RCUBE_COMPOSE_DRAFT;
 
-
 if (!empty($msg_uid))
 {
   // similar as in program/steps/mail/show.inc
-  $MESSAGE = array('UID' => $msg_uid);
-  $MESSAGE['headers'] = &$IMAP->get_headers($msg_uid);
-  $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid);
+  $MESSAGE = new rcube_message($msg_uid);
   
-  if (!empty($MESSAGE['headers']->charset))
-    $IMAP->set_charset($MESSAGE['headers']->charset);
+  if (!empty($MESSAGE->headers->charset))
+    $IMAP->set_charset($MESSAGE->headers->charset);
     
-  $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject);
-  $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']);
-  
   if ($compose_mode == RCUBE_COMPOSE_REPLY)
   {
     $_SESSION['compose']['reply_uid'] = $msg_uid;
-    $_SESSION['compose']['reply_msgid'] = $MESSAGE['headers']->messageID;
-    $_SESSION['compose']['references']  = trim($MESSAGE['headers']->references . " " . $MESSAGE['headers']->messageID);
+    $_SESSION['compose']['reply_msgid'] = $MESSAGE->headers->messageID;
+    $_SESSION['compose']['references']  = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID);
 
     if (!empty($_GET['_all']))
-      $MESSAGE['reply_all'] = 1;
+      $MESSAGE->reply_all = 1;
   }
   else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
   {
@@ -159,14 +150,14 @@ function rcmail_compose_headers($attrib)
       }
         
       $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'tabindex');
-      $field_type = 'textarea';            
+      $field_type = 'html_textarea';
       break;
 
     case 'replyto':
     case 'reply-to':
       $fname = '_replyto';
       $allow_attrib = array('id', 'class', 'style', 'size', 'tabindex');
-      $field_type = 'textfield';
+      $field_type = 'html_inputfield';
       break;    
   }
  
@@ -176,19 +167,19 @@ function rcmail_compose_headers($attrib)
   else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY)
   {
     // get recipent address(es) out of the message headers
-    if ($header=='to' && !empty($MESSAGE['headers']->replyto))
-      $fvalue = $MESSAGE['headers']->replyto;
+    if ($header=='to' && !empty($MESSAGE->headers->replyto))
+      $fvalue = $MESSAGE->headers->replyto;
 
-    else if ($header=='to' && !empty($MESSAGE['headers']->from))
-      $fvalue = $MESSAGE['headers']->from;
+    else if ($header=='to' && !empty($MESSAGE->headers->from))
+      $fvalue = $MESSAGE->headers->from;
 
     // add recipent of original message if reply to all
-    else if ($header=='cc' && !empty($MESSAGE['reply_all']))
+    else if ($header=='cc' && !empty($MESSAGE->reply_all))
     {
-      if ($v = $MESSAGE['headers']->to)
+      if ($v = $MESSAGE->headers->to)
         $fvalue .= $v;
 
-      if ($v = $MESSAGE['headers']->cc)
+      if ($v = $MESSAGE->headers->cc)
         $fvalue .= (!empty($fvalue) ? ', ' : '') . $v;
     }
 
@@ -199,7 +190,7 @@ function rcmail_compose_headers($attrib)
       $fvalue = '';
       foreach ($to_addresses as $addr_part)
       {
-        if (!empty($addr_part['mailto']) && !in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE['FROM'] || !in_array($addr_part['mailto'], $MESSAGE['FROM'])))
+        if (!empty($addr_part['mailto']) && !in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE->compose_from || !in_array($addr_part['mailto'], $MESSAGE->compose_from)))
         {
           $fvalue .= (strlen($fvalue) ? ', ':'').$addr_part['string'];
           $sa_recipients[] = $addr_part['mailto'];
@@ -210,14 +201,14 @@ function rcmail_compose_headers($attrib)
   else if ($header && $compose_mode == RCUBE_COMPOSE_DRAFT)
   {
     // get drafted headers
-    if ($header=='to' && !empty($MESSAGE['headers']->to))
-      $fvalue = $IMAP->decode_header($MESSAGE['headers']->to);
+    if ($header=='to' && !empty($MESSAGE->headers->to))
+      $fvalue = $MESSAGE->get_header('to');
 
-    if ($header=='cc' && !empty($MESSAGE['headers']->cc))
-      $fvalue = $IMAP->decode_header($MESSAGE['headers']->cc);
+    if ($header=='cc' && !empty($MESSAGE->headers->cc))
+      $fvalue = $MESSAGE->get_header('cc');
 
-    if ($header=='bcc' && !empty($MESSAGE['headers']->bcc))
-      $fvalue = $IMAP->decode_header($MESSAGE['headers']->bcc);
+    if ($header=='bcc' && !empty($MESSAGE->headers->bcc))
+      $fvalue = $MESSAGE->get_header('bcc');
   }
 
         
@@ -231,7 +222,7 @@ function rcmail_compose_headers($attrib)
 
     // create teaxtarea object
     $input = new $field_type($field_attrib);
-    $out = $input->show($fvalue);    
+    $out = $input->show($fvalue);
   }
   
   if ($form_start)
@@ -254,20 +245,20 @@ function rcmail_compose_header_from($attrib)
 
   // extract all recipients of the reply-message
   $a_recipients = array();
-  if ($compose_mode == RCUBE_COMPOSE_REPLY && is_object($MESSAGE['headers']))
+  if ($compose_mode == RCUBE_COMPOSE_REPLY && is_object($MESSAGE->headers))
   {
-    $MESSAGE['FROM'] = array();
+    $MESSAGE->compose_from = array();
 
-    $a_to = $IMAP->decode_address_list($MESSAGE['headers']->to);
+    $a_to = $IMAP->decode_address_list($MESSAGE->headers->to);
     foreach ($a_to as $addr)
     {
       if (!empty($addr['mailto']))
         $a_recipients[] = $addr['mailto'];
     }
 
-    if (!empty($MESSAGE['headers']->cc))
+    if (!empty($MESSAGE->headers->cc))
     {
-      $a_cc = $IMAP->decode_address_list($MESSAGE['headers']->cc);
+      $a_cc = $IMAP->decode_address_list($MESSAGE->headers->cc);
       foreach ($a_cc as $addr)
       {
         if (!empty($addr['mailto']))
@@ -285,7 +276,7 @@ function rcmail_compose_header_from($attrib)
     $a_signatures = array();
 
     $field_attrib['onchange'] = JS_OBJECT_NAME.".change_identity(this)";
-    $select_from = new select($field_attrib);
+    $select_from = new html_select($field_attrib);
 
     while ($sql_arr = $DB->fetch_assoc($sql_result))
     {
@@ -301,7 +292,7 @@ function rcmail_compose_header_from($attrib)
         {
             $h2t = new html2text($a_signatures[$identity_id]['text'], false, false);
             $plainTextPart = $h2t->get_text();
-            $a_signatures[$identity_id]['plain_text'] = trim($plainTextPart);
+            $a_signatures[$identity_id]['plain_text'] = trim(html_entity_decode($plainTextPart, ENT_NOQUOTES, 'UTF-8'));
         }
       }
 
@@ -309,10 +300,10 @@ function rcmail_compose_header_from($attrib)
       if (in_array($sql_arr['email'], $a_recipients))
         $from_id = $sql_arr['identity_id'];
 
-      if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE['FROM']))
-        $MESSAGE['FROM'][] = $sql_arr['email'];
+      if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE->compose_from))
+        $MESSAGE->compose_from[] = $sql_arr['email'];
 
-      if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE['headers']->from, $sql_arr['email']))
+      if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE->headers->from, $sql_arr['email']))
         $from_id = $sql_arr['identity_id'];
     }
 
@@ -327,7 +318,7 @@ function rcmail_compose_header_from($attrib)
   }
   else
   {
-    $input_from = new textfield($field_attrib);
+    $input_from = new html_inputfield($field_attrib);
     $out = $input_from->show($_POST['_from']);
   }
   
@@ -340,7 +331,7 @@ function rcmail_compose_header_from($attrib)
 
 function rcmail_compose_body($attrib)
 {
-  global $CONFIG, $OUTPUT, $MESSAGE, $compose_mode;
+  global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode;
   
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
@@ -359,79 +350,55 @@ function rcmail_compose_body($attrib)
 
   // use posted message body
   if (!empty($_POST['_message']))
+  {
+    $body = get_input_value('_message', RCUBE_INPUT_POST, true);
+  }
+  else if ($compose_mode)
+  {
+    if ($isHtml && $MESSAGE->has_html_part())
     {
-    $body = get_input_value('_message', RCUBE_INPUT_POST, TRUE);
-    }
-  // compose reply-body
-  else if ($compose_mode == RCUBE_COMPOSE_REPLY)
-    {
-    $hasHtml = rcmail_has_html_part($MESSAGE['parts']); 
-    if ($hasHtml && $CONFIG['htmleditor'])
-      {
-      $body = rcmail_first_html_part($MESSAGE);
+      $body = $MESSAGE->first_html_part();
       $isHtml = true;
-      }
-    else
-      {
-      $body = rcmail_first_text_part($MESSAGE);
-      $isHtml = false;
-      }
-
-    $body = rcmail_create_reply_body($body, $isHtml);
     }
-  // forward message body inline
-  else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
-    {
-    $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
-    if ($hasHtml && $CONFIG['htmleditor'])
-      {
-      $body = rcmail_first_html_part($MESSAGE);
-      $isHtml = true;
-      }
     else
-      {
-      $body = rcmail_first_text_part($MESSAGE);
-      $isHtml = false;
-      }
-
-    $body = rcmail_create_forward_body($body, $isHtml);
-    }
-  else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
     {
-    $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
-    if ($hasHtml && $CONFIG['htmleditor'])
-      {
-      $body = rcmail_first_html_part($MESSAGE);
-      $isHtml = true;
-      }
-    else
-      {
-      $body = rcmail_first_text_part($MESSAGE);
+      $body = $MESSAGE->first_text_part();
       $isHtml = false;
-      }
-
-    $body = rcmail_create_draft_body($body, $isHtml);
     }
+    
+    // compose reply-body
+    if ($compose_mode == RCUBE_COMPOSE_REPLY)
+      $body = rcmail_create_reply_body($body, $isHtml);
+    // forward message body inline
+    else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
+      $body = rcmail_create_forward_body($body, $isHtml);
+    // load draft message body
+    else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
+      $body = rcmail_create_draft_body($body, $isHtml);
+  }
+
+  $tinylang = substr($_SESSION['language'], 0, 2);
+  if (!file_exists('program/js/tiny_mce/langs/'.$tinylang.'.js'))
+    $tinylang = 'en'; 
 
   $OUTPUT->include_script('tiny_mce/tiny_mce.js');
   $OUTPUT->include_script("editor.js");
-  $OUTPUT->add_script('rcmail_editor_init("$__skin_path");');
+  $OUTPUT->add_script('rcmail_editor_init("$__skin_path", "'.$tinylang.'");');
 
   $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) : ''));
+  $saveid = new html_hiddenfield(array('name' => '_draft_saveid', 'value' => $compose_mode==RCUBE_COMPOSE_DRAFT ? str_replace(array('<','>'), "", $MESSAGE->headers->messageID) : ''));
   $out .= $saveid->show();
 
-  $drafttoggle = new hiddenfield(array('name' => '_draft', 'value' => 'yes'));
+  $drafttoggle = new html_hiddenfield(array('name' => '_draft', 'value' => 'yes'));
   $out .= $drafttoggle->show();
 
-  $msgtype = new hiddenfield(array('name' => '_is_html', 'value' => ($isHtml?"1":"0")));
+  $msgtype = new html_hiddenfield(array('name' => '_is_html', 'value' => ($isHtml?"1":"0")));
   $out .= $msgtype->show();
 
   // If desired, set this text area to be editable by TinyMCE
-  if ($isHtml)
-    $attrib['mce_editable'] = "true";
-  $textarea = new textarea($attrib);
+  if ($isHtml) $attrib['class'] = "mce_editor";
+  $textarea = new html_textarea($attrib);
   $out .= $textarea->show($body);
   $out .= $form_end ? "\n$form_end" : '';
 
@@ -453,21 +420,21 @@ function rcmail_compose_body($attrib)
       "googie.setCurrentLanguage('%s');\n".
       "googie.decorateTextarea('%s');\n".
       "%s.set_env('spellcheck', googie);",
-      $GLOBALS['COMM_PATH'],
+      $RCMAIL->comm_path,
       JQ(Q(rcube_label('checkspelling'))),
       JQ(Q(rcube_label('resumeediting'))),
       JQ(Q(rcube_label('close'))),
       JQ(Q(rcube_label('revertto'))),
       JQ(Q(rcube_label('nospellerrors'))),
       $lang_set,
-      substr($_SESSION['user_lang'], 0, 2),
+      substr($_SESSION['language'], 0, 2),
       $attrib['id'],
       JS_OBJECT_NAME), 'foot');
 
     rcube_add_label('checking');
     }
  
-  $out .= "\n".'<iframe name="savetarget" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
+  $out .= "\n".'<iframe name="savetarget" src="program/blank.gif" style="width:0;height:0;border:none;visibility:hidden;"></iframe>';
 
   return $out;
 }
@@ -498,11 +465,11 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
 
     // add title line
     $prefix = sprintf("\n\n\nOn %s, %s wrote:\n",
-             $MESSAGE['headers']->date,
-             $IMAP->decode_header($MESSAGE['headers']->from));
+      $MESSAGE->headers->date,
+      $MESSAGE->get_header('from'));
 
     // try to remove the signature
-    if ($sp = strrstr($body, '-- '))
+    if ($sp = strrpos($body, '-- '))
       {
       if ($body{$sp+3}==' ' || $body{$sp+3}=="\n" || $body{$sp+3}=="\r")
         $body = substr($body, 0, $sp-1);
@@ -511,12 +478,10 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
   }
   else
   {
-    $prefix = sprintf("<br><br>On %s, %s wrote:<br><blockquote type=\"cite\" " .
-                      "style=\"padding-left: 5px; border-left: #1010ff 2px solid; " .
-                      "margin-left: 5px; width: 100%%\">",
-                      $MESSAGE['headers']->date,
-                      $IMAP->decode_header($MESSAGE['headers']->from));
-
+    $prefix = sprintf("<br /><br />On %s, %s wrote:<br />\n",
+      $MESSAGE->headers->date,
+      Q($MESSAGE->get_header('from')));
+    $prefix .= '<blockquote type="cite" style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%">';
     $suffix = "</blockquote>";
   }
 
@@ -528,35 +493,35 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
 {
   global $IMAP, $MESSAGE;
 
-  if (! $bodyIsHtml)
+  if (!$bodyIsHtml)
   {
     // soft-wrap message first
     $body = wordwrap($body, 80);
   
     $prefix = sprintf("\n\n\n-------- Original Message --------\nSubject: %s\nDate: %s\nFrom: %s\nTo: %s\n\n",
-                     $MESSAGE['subject'],
-                     $MESSAGE['headers']->date,
-                     $IMAP->decode_header($MESSAGE['headers']->from),
-                     $IMAP->decode_header($MESSAGE['headers']->to));
+      $MESSAGE->subject,
+      $MESSAGE->headers->date,
+      $MESSAGE->get_header('from'),
+      $MESSAGE->get_header('to'));
   }
   else
   {
     $prefix = sprintf(
-        "<br><br>-------- Original Message --------" .
+      "<br><br>-------- Original Message --------" .
         "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Subject: </th><td>%s</td></tr>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Date: </th><td>%s</td></tr>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">From: </th><td>%s</td></tr>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">To: </th><td>%s</td></tr>" .
         "</tbody></table><br>",
-                     Q($MESSAGE['subject']),
-                     Q($MESSAGE['headers']->date),
-                     Q($IMAP->decode_header($MESSAGE['headers']->from)),
-                     Q($IMAP->decode_header($MESSAGE['headers']->to)));
+      Q($MESSAGE->subject),
+      Q($MESSAGE->headers->date),
+      Q($MESSAGE->get_header('from')),
+      Q($MESSAGE->get_header('to')));
   }
 
   // add attachments
-  if (!isset($_SESSION['compose']['forward_attachments']) && is_array($MESSAGE['parts']))
+  if (!isset($_SESSION['compose']['forward_attachments']) && is_array($MESSAGE->mime_parts))
     rcmail_write_compose_attachments($MESSAGE);
     
   return $prefix.$body;
@@ -565,15 +530,15 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
 
 function rcmail_create_draft_body($body, $bodyIsHtml)
 {
-  global $IMAP, $MESSAGE;
+  global $MESSAGE;
   
   /**
    * add attachments
-   * sizeof($MESSAGE['parts'] can be 1 - e.g. attachment, but no text!
+   * sizeof($MESSAGE->mime_parts can be 1 - e.g. attachment, but no text!
    */
   if (!isset($_SESSION['compose']['forward_attachments'])
-      && is_array($MESSAGE['parts'])
-      && count($MESSAGE['parts']) > 0)
+      && is_array($MESSAGE->mime_parts)
+      && count($MESSAGE->mime_parts) > 0)
     rcmail_write_compose_attachments($MESSAGE);
 
   return $body;
@@ -582,14 +547,14 @@ function rcmail_create_draft_body($body, $bodyIsHtml)
   
 function rcmail_write_compose_attachments(&$message)
 {
-  global $IMAP, $CONFIG;
+  global $RCMAIL, $IMAP;
 
-  $temp_dir = unslashify($CONFIG['temp_dir']);
+  $temp_dir = unslashify($RCMAIL->config->get('temp_dir'));
 
   if (!is_array($_SESSION['compose']['attachments']))
     $_SESSION['compose']['attachments'] = array();
   
-  foreach ($message['parts'] as $pid => $part)
+  foreach ((array)$message->mime_parts as $pid => $part)
   {
     if ($part->ctype_primary != 'message' &&
         ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] ||
@@ -598,7 +563,7 @@ function rcmail_write_compose_attachments(&$message)
       $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
       if ($fp = fopen($tmp_path, 'w'))
       {
-        fwrite($fp, $IMAP->get_message_part($message['UID'], $pid, $part->encoding));
+        fwrite($fp, $message->get_part_content($pid));
         fclose($fp);
         
         $_SESSION['compose']['attachments'][] = array(
@@ -610,19 +575,19 @@ function rcmail_write_compose_attachments(&$message)
     }
   }
        
-  $_SESSION['compose']['forward_attachments'] = TRUE;
+  $_SESSION['compose']['forward_attachments'] = true;
 }
 
 
 function rcmail_compose_subject($attrib)
 {
-  global $CONFIG, $MESSAGE, $compose_mode;
+  global $MESSAGE, $compose_mode;
   
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
   
   $attrib['name'] = '_subject';
-  $textfield = new textfield($attrib);
+  $textfield = new html_inputfield($attrib);
 
   $subject = '';
 
@@ -633,24 +598,24 @@ function rcmail_compose_subject($attrib)
   // create a reply-subject
   else if ($compose_mode == RCUBE_COMPOSE_REPLY)
   {
-    if (eregi('^re:', $MESSAGE['subject']))
-      $subject = $MESSAGE['subject'];
+    if (eregi('^re:', $MESSAGE->subject))
+      $subject = $MESSAGE->subject;
     else
-      $subject = 'Re: '.$MESSAGE['subject'];
+      $subject = 'Re: '.$MESSAGE->subject;
   }
 
   // create a forward-subject
   else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
   {
-    if (eregi('^fwd:', $MESSAGE['subject']))
-      $subject = $MESSAGE['subject'];
+    if (eregi('^fwd:', $MESSAGE->subject))
+      $subject = $MESSAGE->subject;
     else
-      $subject = 'Fwd: '.$MESSAGE['subject'];
+      $subject = 'Fwd: '.$MESSAGE->subject;
   }
 
   // creeate a draft-subject
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
-    $subject = $MESSAGE['subject'];
+    $subject = $MESSAGE->subject;
   
   $out = $form_start ? "$form_start\n" : '';
   $out .= $textfield->show($subject);
@@ -668,64 +633,50 @@ function rcmail_compose_attachment_list($attrib)
   if (!$attrib['id'])
     $attrib['id'] = 'rcmAttachmentList';
   
-  // allow the following attributes to be added to the <ul> tag
-  $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style'));
-  $out = '<ul'. $attrib_str . ">\n";
+  $out = "\n";
   
   if (is_array($_SESSION['compose']['attachments']))
   {
     if ($attrib['deleteicon'])
-      $button = sprintf('<img src="%s%s" alt="%s" border="0" style="padding-right:2px;vertical-align:middle" />',
-                        $CONFIG['skin_path'],
-                        $attrib['deleteicon'],
-                        rcube_label('delete'));
+      $button = html::img(array(
+        'src' => $CONFIG['skin_path'] . $attrib['deleteicon'],
+        'alt' => rcube_label('delete'),
+        'style' => "border:0;padding-right:2px;vertical-align:middle"));
     else
-      $button = rcube_label('delete');
+      $button = Q(rcube_label('delete'));
 
     foreach ($_SESSION['compose']['attachments'] as $id => $a_prop)
-      $out .= sprintf('<li id="rcmfile%d"><a href="#delete" onclick="return %s.command(\'remove-attachment\',\'rcmfile%d\', this)" title="%s">%s</a>%s</li>',
-                      $id,
-                      JS_OBJECT_NAME,
-                      $id,
-                      Q(rcube_label('delete')),
-                      $button,
-                      Q($a_prop['name']));
+      $out .= html::tag('li', array('id' => "rcmfile".$id),
+        html::a(array(
+            'href' => "#delete",
+            'title' => rcube_label('delete'),
+              'onclick' => sprintf("return %s.command(\'remove-attachment\',\'rcmfile%d\', this)", JS_OBJECT_NAME, $id)),
+          $button) . Q($a_prop['name']));
   }
 
   $OUTPUT->add_gui_object('attachmentlist', $attrib['id']);
     
-  $out .= '</ul>';
-  return $out;
+  return html::tag('ul', $attrib, $out, html::$common_attrib);
 }
 
 
 function rcmail_compose_attachment_form($attrib)
 {
-  global $OUTPUT, $SESS_HIDDEN_FIELD;
+  global $OUTPUT;
 
   // add ID if not given
   if (!$attrib['id'])
     $attrib['id'] = 'rcmUploadbox';
   
-  // allow the following attributes to be added to the <div> tag
-  $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style'));
-  $input_field = rcmail_compose_attachment_field(array());
-  $label_send = rcube_label('upload');
-  $label_close = rcube_label('close');
-  $js_instance = JS_OBJECT_NAME;
+  $button = new html_inputfield(array('type' => 'button', 'class' => 'button'));
+  
+  $out = html::div($attrib,
+    $OUTPUT->form_tag(array('name' => 'form', 'method' => 'post', 'enctype' => 'multipart/form-data')) .
+    rcmail_compose_attachment_field(array()) . html::br() .
+    $button->show(rcube_label('close'), array('onclick' => "document.getElementById('$attrib[id]').style.visibility='hidden'")) .
+    $button->show(rcube_label('upload'), array('onclick' => JS_OBJECT_NAME . ".command('send-attachment', this.form)"))
+  );
   
-  $out = <<<EOF
-<div$attrib_str>
-<form action="./" method="post" enctype="multipart/form-data">
-$SESS_HIDDEN_FIELD
-$input_field<br />
-<input type="button" value="$label_close" class="button" onclick="document.getElementById('$attrib[id]').style.visibility='hidden'" />
-<input type="button" value="$label_send" class="button" onclick="$js_instance.command('send-attachment', this.form)" />
-</form>
-</div>
-EOF;
-
   
   $OUTPUT->add_gui_object('uploadbox', $attrib['id']);
   return $out;
@@ -750,7 +701,7 @@ function rcmail_priority_selector($attrib)
   unset($attrib['form']);
   
   $attrib['name'] = '_priority';
-  $selector = new select($attrib);
+  $selector = new html_select($attrib);
 
   $selector->add(array(rcube_label('lowest'),
                        rcube_label('low'),
@@ -759,7 +710,7 @@ function rcmail_priority_selector($attrib)
                        rcube_label('highest')),
                  array(5, 4, 0, 2, 1));
                  
-  $sel = isset($_POST['_priority']) ? $_POST['_priority'] : intval($MESSAGE['headers']->priority);
+  $sel = isset($_POST['_priority']) ? $_POST['_priority'] : intval($MESSAGE->headers->priority);
 
   $out = $form_start ? "$form_start\n" : '';
   $out .= $selector->show($sel);
@@ -771,7 +722,7 @@ function rcmail_priority_selector($attrib)
 
 function rcmail_receipt_checkbox($attrib)
 {
-  global $MESSAGE;
+  global $MESSAGE, $compose_mode;
   
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
@@ -781,10 +732,11 @@ function rcmail_receipt_checkbox($attrib)
 
   $attrib['name'] = '_receipt';
   $attrib['value'] = '1';
-  $checkbox = new checkbox($attrib);
+  $checkbox = new html_checkbox($attrib);
 
   $out = $form_start ? "$form_start\n" : '';
-  $out .= $checkbox->show($MESSAGE['headers']->mdn_to ? 1 : 0);
+  $out .= $checkbox->show(
+    $compose_mode == RCUBE_COMPOSE_DRAFT && $MESSAGE->headers->mdn_to ? 1 : 0);
   $out .= $form_end ? "\n$form_end" : '';
 
   return $out;
@@ -800,39 +752,20 @@ function rcmail_editor_selector($attrib)
     'plain' => 'plaintoggle'
   );
 
-  // determine whether HTML or plain text should be checked 
-  if ($CONFIG['htmleditor'])
-    $useHtml = true;
-  else
-    $useHtml = false;
+  // determine whether HTML or plain text should be checked
+  $useHtml = $CONFIG['htmleditor'] ? true : false;
 
-  if ($compose_mode == RCUBE_COMPOSE_REPLY ||
-      $compose_mode == RCUBE_COMPOSE_FORWARD ||
-      $compose_mode == RCUBE_COMPOSE_DRAFT)
-  {
-    $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
-    $useHtml = ($hasHtml && $CONFIG['htmleditor']);
-  }
+  if ($compose_mode)
+    $useHtml = ($useHtml && $MESSAGE->has_html_part());
 
   $selector = '';
-  
-  $attrib['name'] = '_editorSelect';
-  $attrib['onchange'] = 'return rcmail_toggle_editor(this)';
+  $chosenvalue = $useHtml ? 'html' : 'plain';
+  $radio = new html_radiobutton(array('name' => '_editorSelect', 'onclick' => 'return rcmail_toggle_editor(this)'));
   foreach ($choices as $value => $text)
   {
-    $checked = '';
-    if ((($value == 'html') && $useHtml) ||
-        (($value != 'html') && !$useHtml))
-      $attrib['checked'] = 'true';
-    else
-      unset($attrib['checked']);
-
     $attrib['id'] = '_' . $value;
-    $rb = new radiobutton($attrib);
-    $selector .= sprintf("%s<label for=\"%s\">%s</label>",
-                         $rb->show($value),
-                         $attrib['id'],
-                         rcube_label($text));
+    $attrib['value'] = $value;
+    $selector .= $radio->show($chosenvalue, $attrib) . html::label($attrib['id'], Q(rcube_label($text)));
   }
 
   return $selector;
@@ -841,16 +774,15 @@ function rcmail_editor_selector($attrib)
 
 function get_form_tags($attrib)
 {
-  global $CONFIG, $OUTPUT, $MESSAGE_FORM, $SESS_HIDDEN_FIELD;  
+  global $RCMAIL, $MESSAGE_FORM;
 
   $form_start = '';
   if (!strlen($MESSAGE_FORM))
   {
-    $hiddenfields = new hiddenfield(array('name' => '_task', 'value' => $GLOBALS['_task']));
+    $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $RCMAIL->task));
     $hiddenfields->add(array('name' => '_action', 'value' => 'send'));
 
-    $form_start = empty($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
-    $form_start .= "\n$SESS_HIDDEN_FIELD\n";
+    $form_start = empty($attrib['form']) ? $RCMAIL->output->form_tag(array('name' => "form", 'method' => "post")) : '';
     $form_start .= $hiddenfields->show();
   }
     
@@ -858,11 +790,11 @@ function get_form_tags($attrib)
   $form_name = !empty($attrib['form']) ? $attrib['form'] : 'form';
   
   if (!strlen($MESSAGE_FORM))
-    $OUTPUT->add_gui_object('messageform', $form_name);
+    $RCMAIL->output->add_gui_object('messageform', $form_name);
   
   $MESSAGE_FORM = $form_name;
 
-  return array($form_start, $form_end);  
+  return array($form_start, $form_end);
 }
 
 
@@ -881,9 +813,6 @@ $OUTPUT->add_handlers(array(
 
 /****** get contacts for this user and add them to client scripts ********/
 
-require_once('include/rcube_contacts.inc');
-require_once('include/rcube_ldap.inc'); 
-
 $CONTACTS = new rcube_contacts($DB, $USER->ID);
 $CONTACTS->set_pagesize(1000);
 
@@ -900,10 +829,11 @@ if (isset($CONFIG['ldap_public']))
   /* LDAP autocompletion */ 
   foreach ($CONFIG['ldap_public'] as $ldapserv_config) 
     { 
-    if ($ldapserv_config['fuzzy_search'] != 1) 
+    if ($ldapserv_config['fuzzy_search'] != 1 || 
+        $ldapserv_config['global_search'] != 1)
       { 
       continue; 
-         } 
+      }
         
     $LDAP = new rcube_ldap($ldapserv_config); 
     $LDAP->connect(); 
@@ -927,6 +857,8 @@ if (isset($CONFIG['ldap_public']))
 if ($a_contacts) 
   { 
        $OUTPUT->set_env('contacts', $a_contacts); 
-  } 
-parse_template('compose');
-?>
\ No newline at end of file
+  }
+
+$OUTPUT->send('compose');
+
+?>
index 1b740ae6540e501b0226bf795f40922e59703ec9..d0825ffac891fb2e8539a217507ec919661c93b4 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: folders.inc 1020 2008-02-05 22:56:29Z thomasb $
+ $Id: folders.inc 1344 2008-04-30 08:21:42Z thomasb $
 */
 
 $mbox_name = $IMAP->get_mailbox_name();
 
 // send EXPUNGE command
-if ($_action=='expunge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
+if ($RCMAIL->action=='expunge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
 {
   $success = $IMAP->expunge($mbox);
 
@@ -29,7 +29,7 @@ if ($_action=='expunge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
   if ($success && !empty($_REQUEST['_reload']))
   {
     $OUTPUT->command('message_list.clear');
-    $_action = 'list';
+    $RCMAIL->action = 'list';
     return;
   }
   else
@@ -37,7 +37,7 @@ if ($_action=='expunge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
 }
 
 // clear mailbox
-else if ($_action=='purge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
+else if ($RCMAIL->action=='purge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
 {
   // we should only be purging trash and junk
   if($mbox == $CONFIG['trash_mbox'] || $mbox == $CONFIG['junk_mbox']) 
index 1668994729252f22b1bf4ba59df158cc2e8526bc..a9a2d41d1dc3b77374f8a42bf5f9bd86d3f0c317 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/func.inc                                           |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: func.inc 1494 2008-06-09 12:22:54Z alec $
 
 */
 
-require_once('lib/html2text.inc');
 require_once('lib/enriched.inc');
 require_once('include/rcube_smtp.inc');
 
@@ -55,11 +54,6 @@ if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search
   }
 
 
-// define url for getting message parts
-if (strlen($_GET['_uid']))
-  $GET_URL = rcmail_url('get', array('_mbox'=>$IMAP->get_mailbox_name(), '_uid'=>get_input_value('_uid', RCUBE_INPUT_GET)));
-
-
 // set current mailbox in client environment
 $OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name());
 $OUTPUT->set_env('quota', $IMAP->get_capability('quota'));
@@ -72,15 +66,17 @@ if ($CONFIG['junk_mbox'])
   $OUTPUT->set_env('junk_mailbox', $CONFIG['junk_mbox']);
 
 if (!$OUTPUT->ajax_call)
-  rcube_add_label('checkingmail', 'deletemessage', 'movemessagetotrash');
+  rcube_add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage');
 
 // set page title
-if (empty($_action) || $_action == 'list')
+if (empty($RCMAIL->action) || $RCMAIL->action == 'list')
   $OUTPUT->set_pagetitle(rcmail_localize_foldername($IMAP->get_mailbox_name()));
 
 
 
-// return the message list as HTML table
+/**
+ * return the message list as HTML table
+ */
 function rcmail_message_list($attrib)
   {
   global $IMAP, $CONFIG, $COMM_PATH, $OUTPUT;
@@ -140,7 +136,7 @@ function rcmail_message_list($attrib)
 
     // make sort links
     $sort = '';
-    if ($IMAP->get_capability('sort') && in_array($col, $a_sort_cols))
+    if (in_array($col, $a_sort_cols))
       {
       // have buttons configured
       if (!empty($attrib['sortdescbutton']) || !empty($attrib['sortascbutton']))
@@ -232,7 +228,10 @@ function rcmail_message_list($attrib)
                     $zebra_class);    
     
     $out .= sprintf("<td class=\"icon\">%s</td>\n", $message_icon ? sprintf($image_tag, $skin_path, $message_icon, '') : '');
-    
+
+    if (!empty($header->charset))
+      $IMAP->set_charset($header->charset);
+  
     // format each col
     foreach ($a_show_cols as $col)
       {
@@ -241,8 +240,8 @@ function rcmail_message_list($attrib)
       else if ($col=='subject')
         {
         $action = $mbox==$CONFIG['drafts_mbox'] ? 'compose' : 'show';
-        $uid_param = $mbox==$CONFIG['drafts_mbox'] ? '_draf_uid' : '_uid';
-        $cont = Q(rcube_imap::decode_mime_string($header->$col, $header->charset));
+        $uid_param = $mbox==$CONFIG['drafts_mbox'] ? '_draft_uid' : '_uid';
+        $cont = Q($IMAP->decode_header($header->$col));
         if (empty($cont)) $cont = Q(rcube_label('nosubject'));
         $cont = sprintf('<a href="%s" onclick="return rcube_event.cancel(event)">%s</a>', Q(rcmail_url($action, array($uid_param=>$header->uid, '_mbox'=>$mbox))), $cont);
         }
@@ -298,7 +297,9 @@ function rcmail_message_list($attrib)
   }
 
 
-// return javascript commands to add rows to the message list
+/**
+ * return javascript commands to add rows to the message list
+ */
 function rcmail_js_message_list($a_headers, $insert_top=FALSE)
   {
   global $CONFIG, $IMAP, $OUTPUT;
@@ -322,6 +323,9 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE)
     if (empty($header))
       continue;
 
+    if (!empty($header->charset))
+      $IMAP->set_charset($header->charset);
+
     // format each col; similar as in rcmail_message_list()
     foreach ($a_show_cols as $col)
       {
@@ -330,8 +334,8 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE)
       else if ($col=='subject')
         {
         $action = $mbox==$CONFIG['drafts_mbox'] ? 'compose' : 'show';
-        $uid_param = $mbox==$CONFIG['drafts_mbox'] ? '_draf_uid' : '_uid';
-        $cont = Q(rcube_imap::decode_mime_string($header->$col, $header->charset));
+        $uid_param = $mbox==$CONFIG['drafts_mbox'] ? '_draft_uid' : '_uid';
+        $cont = Q($IMAP->decode_header($header->$col));
         if (!$cont) $cont = Q(rcube_label('nosubject'));
         $cont = sprintf('<a href="%s" onclick="return rcube_event.cancel(event)">%s</a>', Q(rcmail_url($action, array($uid_param=>$header->uid, '_mbox'=>$mbox))), $cont);
         }
@@ -358,7 +362,9 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE)
   }
 
 
-// return an HTML iframe for loading mail content
+/**
+ * return an HTML iframe for loading mail content
+ */
 function rcmail_messagecontent_frame($attrib)
   {
   global $OUTPUT;
@@ -381,6 +387,9 @@ function rcmail_messagecontent_frame($attrib)
   }
 
 
+/**
+ *
+ */
 function rcmail_messagecount_display($attrib)
   {
   global $IMAP, $OUTPUT;
@@ -401,6 +410,9 @@ function rcmail_messagecount_display($attrib)
   }
 
 
+/**
+ *
+ */
 function rcmail_quota_display($attrib)
   {
   global $OUTPUT, $COMM_PATH;
@@ -408,30 +420,46 @@ function rcmail_quota_display($attrib)
   if (!$attrib['id'])
     $attrib['id'] = 'rcmquotadisplay';
 
+  if(isset($attrib['display']))
+    $_SESSION['quota_display'] = $attrib['display'];
+
   $OUTPUT->add_gui_object('quotadisplay', $attrib['id']);
 
   // allow the following attributes to be added to the <span> tag
-  $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
+  $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'display'));
 
   $out = '<span' . $attrib_str . '>';
-  $out .= rcmail_quota_content($attrib['display']);
+  $out .= rcmail_quota_content();
   $out .= '</span>';
   return $out;
   }
 
 
-function rcmail_quota_content($display)
+/**
+ *
+ */
+function rcmail_quota_content($quota=NULL)
   {
   global $IMAP, $COMM_PATH;
 
-  if (!$IMAP->get_capability('QUOTA'))
-    $quota_text = rcube_label('unknown');
-  else if ($quota = $IMAP->get_quota())
+  $display = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+
+  if (is_array($quota) && !empty($quota['used']) && !empty($quota['total']))
+    {
+      if (!isset($quota['percent']))
+        $quota['percent'] = $quota['used'] / $quota['total'];
+    }
+  elseif (!$IMAP->get_capability('QUOTA'))
+    return rcube_label('unknown');
+  else
+    $quota = $IMAP->get_quota();
+
+  if ($quota)
     {
-    $quota_text = sprintf("%s / %s (%.0f%%)",
-                          show_bytes($quota["used"] * 1024),
-                          show_bytes($quota["total"] * 1024),
-                          $quota["percent"]);
+    $quota_text = sprintf('%s / %s (%.0f%%)',
+                          show_bytes($quota['used'] * 1024),
+                          show_bytes($quota['total'] * 1024),
+                          $quota['percent']);
 
     // show quota as image (by Brett Patterson)
     if ($display == 'image' && function_exists('imagegif'))
@@ -453,14 +481,17 @@ function rcmail_quota_content($display)
   }
 
 
+/**
+ *
+ */
 function rcmail_get_messagecount_text($count=NULL, $page=NULL)
   {
   global $IMAP, $MESSAGE;
   
-  if (isset($MESSAGE['index']))
+  if (isset($MESSAGE->index))
     {
     return rcube_label(array('name' => 'messagenrof',
-                             'vars' => array('nr'  => $MESSAGE['index']+1,
+                             'vars' => array('nr'  => $MESSAGE->index+1,
                                              'count' => $count!==NULL ? $count : $IMAP->messagecount())));
     }
 
@@ -482,246 +513,116 @@ function rcmail_get_messagecount_text($count=NULL, $page=NULL)
   }
 
 
-/* Stolen from Squirrelmail */
-function sq_deent(&$attvalue, $regex, $hex=false)
-  {
-  $ret_match = false;
-  preg_match_all($regex, $attvalue, $matches);
-  if (is_array($matches) && sizeof($matches[0]) > 0)
-    {
-    $repl = Array();
-    for ($i = 0; $i < sizeof($matches[0]); $i++)
-      {
-      $numval = $matches[1][$i];
-      if ($hex)
-        $numval = hexdec($numval);
-      $repl{$matches[0][$i]} = chr($numval);
-      }
-    $attvalue = strtr($attvalue, $repl);
-    return true;
-    }
-  else
-    return false;
-  }
-
-
-/* Stolen verbatim from Squirrelmail */
-function sq_defang(&$attvalue)
-  {
-  /* Skip this if there aren't ampersands or backslashes. */
-  if ((strpos($attvalue, '&') === false) &&
-      (strpos($attvalue, '\\') === false))
-    return;
-  $m = false;
-  do
-    {
-    $m = false;
-    $m = $m || sq_deent($attvalue, '/\&#0*(\d+);*/s');
-    $m = $m || sq_deent($attvalue, '/\&#x0*((\d|[a-f])+);*/si', true);
-    $m = $m || sq_deent($attvalue, '/\\\\(\d+)/s', true);
-    } while ($m == true);
-  $attvalue = stripslashes($attvalue);
-  }
-
-
-function rcmail_html_filter($html)
-  {
-  preg_match_all('/<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+\s*|\s*)\/?>/', $html, $tags);
-
-  /* From Squirrelmail: Translate all dangerous Unicode or Shift_JIS characters which are accepted by
-   * IE as regular characters. */
-  $replace = array(array('&#x029F;', '&#0671;',  /* L UNICODE IPA Extension */
-                         '&#x0280;', '&#0640;',  /* R UNICODE IPA Extension */
-                         '&#x0274;', '&#0628;',  /* N UNICODE IPA Extension */
-                         '&#xFF25;', '&#65317;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER E */
-                         '&#xFF45;', '&#65349;', /* Unicode FULLWIDTH LATIN SMALL LETTER E */
-                         '&#xFF38;', '&#65336;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER X */
-                         '&#xFF58;', '&#65368;', /* Unicode FULLWIDTH LATIN SMALL LETTER X */
-                         '&#xFF30;', '&#65328;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER P */
-                         '&#xFF50;', '&#65360;', /* Unicode FULLWIDTH LATIN SMALL LETTER P */
-                         '&#xFF32;', '&#65330;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER R */
-                         '&#xFF52;', '&#65362;', /* Unicode FULLWIDTH LATIN SMALL LETTER R */
-                         '&#xFF33;', '&#65331;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER S */
-                         '&#xFF53;', '&#65363;', /* Unicode FULLWIDTH LATIN SMALL LETTER S */
-                         '&#xFF29;', '&#65321;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER I */
-                         '&#xFF49;', '&#65353;', /* Unicode FULLWIDTH LATIN SMALL LETTER I */
-                         '&#xFF2F;', '&#65327;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER O */
-                         '&#xFF4F;', '&#65359;', /* Unicode FULLWIDTH LATIN SMALL LETTER O */
-                         '&#xFF2E;', '&#65326;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER N */
-                         '&#xFF4E;', '&#65358;', /* Unicode FULLWIDTH LATIN SMALL LETTER N */
-                         '&#xFF2C;', '&#65324;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER L */
-                         '&#xFF4C;', '&#65356;', /* Unicode FULLWIDTH LATIN SMALL LETTER L */
-                         '&#xFF35;', '&#65333;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER U */
-                         '&#xFF55;', '&#65365;', /* Unicode FULLWIDTH LATIN SMALL LETTER U */
-                         '&#x207F;', '&#8319;' , /* Unicode SUPERSCRIPT LATIN SMALL LETTER N */
-                         "\xEF\xBC\xA5", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER E */
-                                         /* in unicode this is some Chinese char range */
-                         "\xEF\xBD\x85", /* Shift JIS FULLWIDTH LATIN SMALL LETTER E */
-                         "\xEF\xBC\xB8", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER X */
-                         "\xEF\xBD\x98", /* Shift JIS FULLWIDTH LATIN SMALL LETTER X */
-                         "\xEF\xBC\xB0", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER P */
-                         "\xEF\xBD\x90", /* Shift JIS FULLWIDTH LATIN SMALL LETTER P */
-                         "\xEF\xBC\xB2", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER R */
-                         "\xEF\xBD\x92", /* Shift JIS FULLWIDTH LATIN SMALL LETTER R */
-                         "\xEF\xBC\xB3", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER S */
-                         "\xEF\xBD\x93", /* Shift JIS FULLWIDTH LATIN SMALL LETTER S */
-                         "\xEF\xBC\xA9", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER I */
-                         "\xEF\xBD\x89", /* Shift JIS FULLWIDTH LATIN SMALL LETTER I */
-                         "\xEF\xBC\xAF", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER O */
-                         "\xEF\xBD\x8F", /* Shift JIS FULLWIDTH LATIN SMALL LETTER O */
-                         "\xEF\xBC\xAE", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER N */
-                         "\xEF\xBD\x8E", /* Shift JIS FULLWIDTH LATIN SMALL LETTER N */
-                         "\xEF\xBC\xAC", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER L */
-                         "\xEF\xBD\x8C", /* Shift JIS FULLWIDTH LATIN SMALL LETTER L */
-                         "\xEF\xBC\xB5", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER U */
-                         "\xEF\xBD\x95", /* Shift JIS FULLWIDTH LATIN SMALL LETTER U */
-                         "\xE2\x81\xBF", /* Shift JIS FULLWIDTH SUPERSCRIPT N */
-                         "\xCA\x9F",   /* L UNICODE IPA Extension */
-                         "\xCA\x80",   /* R UNICODE IPA Extension */
-                         "\xC9\xB4"),  /* N UNICODE IPA Extension */
-                   array('l', 'l', 'r', 'r', 'n', 'n', 'E', 'E', 'e', 'e', 'X', 'X', 'x', 'x',
-                         'P', 'P', 'p', 'p', 'R', 'R', 'r', 'r', 'S', 'S', 's', 's', 'I', 'I',
-                         'i', 'i', 'O', 'O', 'o', 'o', 'N', 'N', 'n', 'n', 'L', 'L', 'l', 'l',
-                         'U', 'U', 'u', 'u', 'n', 'n', 'E', 'e', 'X', 'x', 'P', 'p', 'R', 'r',
-                         'S', 's', 'I', 'i', 'O', 'o', 'N', 'n', 'L', 'l', 'U', 'u', 'n', 'l', 'r', 'n'));
-  if ((count($tags)>3) && (count($tags[3])>0))
-    foreach ($tags[3] as $nr=>$value)
-      {
-      /* Remove comments */
-      $newvalue = preg_replace('/(\/\*.*\*\/)/','$2',$value);
-      /* Translate dangerous characters */
-      $newvalue = str_replace($replace[0], $replace[1], $newvalue);
-      sq_defang($newvalue);
-      /* Rename dangerous CSS */
-      $newvalue = preg_replace('/expression/i', 'idiocy', $newvalue);
-      $newvalue = preg_replace('/url/i', 'idiocy', $newvalue);
-      $newattrs = preg_replace('/'.preg_quote($value, '/').'$/', $newvalue, $tags[1][$nr]);
-      $newtag = preg_replace('/'.preg_quote($tags[1][$nr], '/').'/', $newattrs, $tags[0][$nr]);
-      $html = preg_replace('/'.preg_quote($tags[0][$nr], '/').'/', $newtag, $html);
-      }
-  return $html;
-  }
-
-
-function rcmail_print_body($part, $safe=FALSE, $plain=FALSE)
-  {
-  global $IMAP, $REMOTE_OBJECTS;
+/**
+ * Convert the given message part to proper HTML
+ * which can be displayed the message view
+ *
+ * @param object rcube_message_part Message part
+ * @param bool  True if external objects (ie. images ) are allowed
+ * @param bool  True if part should be converted to plaintext
+ * @return string Formatted HTML string
+ */
+function rcmail_print_body($part, $safe=false, $plain=false)
+{
+  global $REMOTE_OBJECTS;
   
-  $body = is_array($part->replaces) ? strtr($part->body, $part->replaces) : $part->body;
-
   // convert html to text/plain
-  if ($part->ctype_secondary=='html' && $plain)
-    {
-    $txt = new html2text($body, false, true);
+  if ($part->ctype_secondary == 'html' && $plain) {
+    $txt = new html2text($part->body, false, true);
     $body = $txt->get_text();
     $part->ctype_secondary = 'plain';
-    }
-    
+  }
   // text/html
-  if ($part->ctype_secondary=='html')
-    {
-    // remove charset specification in HTML message
-    $body = preg_replace('/charset=[a-z0-9\-]+/i', '', $body);
-
-    if (!$safe)  // remove remote images and scripts
-      {
-      $remote_patterns = array('/<img\s+(.*)src=(["\']?)([hftps]{3,5}:\/{2}[^"\'\s]+)(\2|\s|>)/Ui',
-                               '/(src|background)=(["\']?)([hftps]{3,5}:\/{2}[^"\'\s]+)(\2|\s|>)/Ui',
-                               '/(<base.*href=["\']?)([hftps]{3,5}:\/{2}[^"\'\s]+)([^<]*>)/i',
-                               '/(<link.*href=["\']?)([hftps]{3,5}:\/{2}[^"\'\s]+)([^<]*>)/i',
-                               '/url\s*\(["\']?([hftps]{3,5}:\/{2}[^"\'\s]+)["\']?\)/i',
-                               '/url\s*\(["\']?([\.\/]+[^"\'\s]+)["\']?\)/i',
-                               '/<script.+<\/script>/Umis');
-
-      $remote_replaces = array('<img \\1src=\\2./program/blocked.gif\\4',
-                               '',
-                               '',
-                               '',
-                               'none',
-                               'none',
-                               '');
-      
-      // set flag if message containes remote obejcts that where blocked
-      foreach ($remote_patterns as $pattern)
-        {
-        if (preg_match($pattern, $body))
-          {
-          $REMOTE_OBJECTS = TRUE;
-          break;
-          }
-        }
-
-      $body = preg_replace($remote_patterns, $remote_replaces, $body);
-      }
-
-    return Q(rcmail_html_filter($body), 'show', FALSE);
-    }
-
+  else if ($part->ctype_secondary == 'html') {
+    // charset was converted to UTF-8 in rcube_imap::get_message_part() -> change charset specification in HTML accordingly
+    $html = $part->body; 
+    if(preg_match('/(\s+content=[\'"]\w+\/\w+;\s+charset)=([a-z0-9-]+)/i', $html)) 
+      $html = preg_replace('/(\s+content=[\'"]\w+\/\w+;\s+charset)=([a-z0-9-]+)/i', '\\1='.RCMAIL_CHARSET, $html); 
+    else 
+      $html = substr_replace($html, '<meta http-equiv="Content-Type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '</head>')), 0);
+    
+    // clean HTML with washhtml by Frederic Motte
+    $body = washtml::wash($html, array(
+      'show_washed' => false,
+      'allow_remote' => $safe,
+      'blocked_src' => "./program/blocked.gif",
+      'charset' => RCMAIL_CHARSET,
+      'cid_map' => $part->replaces,
+      ), $full_inline);
+
+    $REMOTE_OBJECTS = !$full_inline;
+
+    return $body;
+  }
   // text/enriched
-  if ($part->ctype_secondary=='enriched')
-    {
+  else if ($part->ctype_secondary=='enriched') {
+    $part->ctype_secondary = 'html';
     return Q(enriched_to_html($body), 'show');
-    }
+  }
   else
-    {
-    // make links and email-addresses clickable
-    $convert_patterns = $convert_replaces = $replace_strings = array();
-    
-    $url_chars = 'a-z0-9_\-\+\*\$\/&%=@#:;';
-    $url_chars_within = '\?\.~,!';
+    $body = $part->body;
 
-    $convert_patterns[] = "/([\w]+):\/\/([a-z0-9\-\.]+[a-z]{2,4}([$url_chars$url_chars_within]*[$url_chars])?)/ie";
-    $convert_replaces[] = "rcmail_str_replacement('<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>', \$replace_strings)";
 
-    $convert_patterns[] = "/([^\/:]|\s)(www\.)([a-z0-9\-]{2,}[a-z]{2,4}([$url_chars$url_chars_within]*[$url_chars])?)/ie";
-    $convert_replaces[] = "rcmail_str_replacement('\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\2\\3</a>', \$replace_strings)";
-    
-    $convert_patterns[] = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/ie';
-    $convert_replaces[] = "rcmail_str_replacement('<a href=\"mailto:\\1\" onclick=\"return ".JS_OBJECT_NAME.".command(\'compose\',\'\\1\',this)\">\\1</a>', \$replace_strings)";
-    
-    if ($part->ctype_parameters['format'] != 'flowed')
-      $body = wordwrap(trim($body), 80);
+  /**** assert plaintext ****/
 
-    $body = preg_replace($convert_patterns, $convert_replaces, $body);
+  // make links and email-addresses clickable
+  $convert_patterns = $convert_replaces = $replace_strings = array();
+  
+  $url_chars = 'a-z0-9_\-\+\*\$\/&%=@#:;';
+  $url_chars_within = '\?\.~,!';
 
-    // split body into single lines
-    $a_lines = preg_split('/\r?\n/', $body);
-    $quote_level = 0;
+  $convert_patterns[] = "/([\w]+):\/\/([a-z0-9\-\.]+[a-z]{2,4}([$url_chars$url_chars_within]*[$url_chars])?)/ie";
+  $convert_replaces[] = "rcmail_str_replacement('<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>', \$replace_strings)";
 
-    // colorize quoted parts
-    for($n=0; $n<sizeof($a_lines); $n++)
-      {
-      $line = $a_lines[$n];
-      $quotation = '';
-      $q = 0;
-      
-      if (preg_match('/^(>+\s*)+/', $line, $regs))
-        {
-        $q    = strlen(preg_replace('/\s/', '', $regs[0]));
-        $line = substr($line, strlen($regs[0]));
+  $convert_patterns[] = "/([^\/:]|\s)(www\.)([a-z0-9\-]{2,}[a-z]{2,4}([$url_chars$url_chars_within]*[$url_chars])?)/ie";
+  $convert_replaces[] = "rcmail_str_replacement('\\1<a href=\"http://\\2\\3\" target=\"_blank\">\\2\\3</a>', \$replace_strings)";
+  
+  $convert_patterns[] = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/ie';
+  $convert_replaces[] = "rcmail_str_replacement('<a href=\"mailto:\\1\" onclick=\"return ".JS_OBJECT_NAME.".command(\'compose\',\'\\1\',this)\">\\1</a>', \$replace_strings)";
+  
+//    if ($part->ctype_parameters['format'] != 'flowed')
+//      $body = wordwrap(trim($body), 80);
 
-        if ($q > $quote_level)
-          $quotation = str_repeat('<blockquote>', $q - $quote_level);
-        else if ($q < $quote_level)
-          $quotation = str_repeat("</blockquote>", $quote_level - $q);
-        }
-      else if ($quote_level > 0)
-        $quotation = str_repeat("</blockquote>", $quote_level);
+  // search for patterns like links and e-mail addresses
+  $body = preg_replace($convert_patterns, $convert_replaces, $body);
 
-      $quote_level = $q;
-      $a_lines[$n] = $quotation . Q($line, 'replace', FALSE);
-      }
+  // split body into single lines
+  $a_lines = preg_split('/\r?\n/', $body);
+  $quote_level = 0;
 
-    // insert the links for urls and mailtos
-    $body = preg_replace("/##string_replacement\{([0-9]+)\}##/e", "\$replace_strings[\\1]", join("\n", $a_lines));
+  // colorize quoted parts
+  for ($n=0; $n < sizeof($a_lines); $n++) {
+    $line = $a_lines[$n];
+    $quotation = '';
+    $q = 0;
     
-    return "<div class=\"pre\">".$body."\n</div>";
+    if (preg_match('/^(>+\s*)+/', $line, $regs)) {
+      $q    = strlen(preg_replace('/\s/', '', $regs[0]));
+      $line = substr($line, strlen($regs[0]));
+
+      if ($q > $quote_level)
+        $quotation = str_repeat('<blockquote>', $q - $quote_level);
+      else if ($q < $quote_level)
+        $quotation = str_repeat("</blockquote>", $quote_level - $q);
     }
+    else if ($quote_level > 0)
+      $quotation = str_repeat("</blockquote>", $quote_level);
+
+    $quote_level = $q;
+    $a_lines[$n] = $quotation . Q($line, 'replace', false);  // htmlquote plaintext
   }
 
+  // insert the links for urls and mailtos
+  $body = preg_replace("/##string_replacement\{([0-9]+)\}##/e", "\$replace_strings[\\1]", join("\n", $a_lines));
+  
+  return "<div class=\"pre\">".$body."\n</div>";
+  }
 
 
-// add a string to the replacement array and return a replacement string
+
+/**
+ * add a string to the replacement array and return a replacement string
+ */
 function rcmail_str_replacement($str, &$rep)
   {
   static $count = 0;
@@ -730,200 +631,10 @@ function rcmail_str_replacement($str, &$rep)
   }
 
 
-function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
-  {
-  global $IMAP;
-  static $sa_inline_objects = array();
-
-  // arguments are: (bool)$prefer_html, (string)$get_url
-  extract($arg);
-
-  $a_attachments = array();
-  $a_return_parts = array();
-  $out = '';
-
-  $message_ctype_primary = strtolower($structure->ctype_primary);
-  $message_ctype_secondary = strtolower($structure->ctype_secondary);
-
-  // show message headers
-  if ($recursive && is_array($structure->headers) && isset($structure->headers['subject']))
-    {
-    $c = new stdClass;
-    $c->type = 'headers';
-    $c->headers = &$structure->headers;
-    $a_return_parts[] = $c;
-    }
-
-  // print body if message doesn't have multiple parts
-  if ($message_ctype_primary=='text')
-    {
-    $structure->type = 'content';
-    $a_return_parts[] = &$structure;
-    }
-    
-  // message contains alternative parts
-  else if ($message_ctype_primary=='multipart' && $message_ctype_secondary=='alternative' && is_array($structure->parts))
-    {
-    // get html/plaintext parts
-    $plain_part = $html_part = $print_part = $related_part = NULL;
-    
-    foreach ($structure->parts as $p => $sub_part)
-      {
-      $rel_parts = $attachmnts = null;
-      $sub_ctype_primary = strtolower($sub_part->ctype_primary);
-      $sub_ctype_secondary = strtolower($sub_part->ctype_secondary);
-
-      // check if sub part is 
-      if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='plain')
-        $plain_part = $p;
-      else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='html')
-        $html_part = $p;
-      else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='enriched')
-        $enriched_part = $p;
-      else if ($sub_ctype_primary=='multipart' && ($sub_ctype_secondary=='related' || $sub_ctype_secondary=='mixed'))
-        $related_part = $p;
-      }
-      
-    // parse related part (alternative part could be in here)
-    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);
-
-    // choose html/plain part to print
-    else if ($html_part!==NULL && $prefer_html)
-      $print_part = &$structure->parts[$html_part];
-    else if ($enriched_part!==NULL)
-      $print_part = &$structure->parts[$enriched_part];
-    else if ($plain_part!==NULL)
-      $print_part = &$structure->parts[$plain_part];
-
-    // show message body
-    if (is_object($print_part))
-      {
-      $print_part->type = 'content';
-      $a_return_parts[] = $print_part;
-      }
-    // show plaintext warning
-    else if ($html_part!==NULL && empty($a_return_parts))
-      {
-      $c = new stdClass;
-      $c->type = 'content';
-      $c->body = rcube_label('htmlmessage');
-      $c->ctype_primary = 'text';
-      $c->ctype_secondary = 'plain';
-      
-      $a_return_parts[] = $c;
-      }
-                                
-    // add html part as attachment
-    if ($html_part!==NULL && $structure->parts[$html_part]!==$print_part)
-      {
-      $html_part = &$structure->parts[$html_part];
-      $html_part->filename = rcube_label('htmlmessage');
-      $html_part->mimetype = 'text/html';
-      
-      $a_attachments[] = $html_part;
-      }
-    }
-
-  // message contains multiple parts
-  else if (is_array($structure->parts) && !empty($structure->parts))
-    {
-    for ($i=0; $i<count($structure->parts); $i++)
-      {
-      $mail_part = &$structure->parts[$i];
-      $primary_type = strtolower($mail_part->ctype_primary);
-      $secondary_type = strtolower($mail_part->ctype_secondary);
-
-      // multipart/alternative
-      if ($primary_type=='multipart')
-        {
-        list($parts, $attachmnts) = rcmail_parse_message($mail_part, $arg, TRUE);
 
-        $a_return_parts = array_merge($a_return_parts, $parts);
-        $a_attachments = array_merge($a_attachments, $attachmnts);
-        }
-
-      // part text/[plain|html] OR message/delivery-status
-      else if (($primary_type=='text' && ($secondary_type=='plain' || $secondary_type=='html') && $mail_part->disposition!='attachment') ||
-               ($primary_type=='message' && ($secondary_type=='delivery-status' || $secondary_type=='disposition-notification')))
-        {
-        $mail_part->type = 'content';
-        $a_return_parts[] = $mail_part;
-        }
-
-      // part message/*
-      else if ($primary_type=='message')
-        {
-        list($parts, $attachmnts) = rcmail_parse_message($mail_part, $arg, TRUE);
-          
-        $a_return_parts = array_merge($a_return_parts, $parts);
-        $a_attachments = array_merge($a_attachments, $attachmnts);
-        }
-        
-      // ignore "virtual" protocol parts
-      else if ($primary_type=='protocol')
-        continue;
-
-      // part is file/attachment
-      else if ($mail_part->disposition=='attachment' || $mail_part->disposition=='inline' || $mail_part->headers['content-id'] ||
-               (empty($mail_part->disposition) && $mail_part->filename))
-        {
-        // skip apple resource forks
-        if ($message_ctype_secondary=='appledouble' && $secondary_type=='applefile')
-          continue;
-
-        // part belongs to a related message
-        if ($message_ctype_secondary=='related' && $mail_part->headers['content-id'])
-          {
-          $mail_part->content_id = preg_replace(array('/^</', '/>$/'), '', $mail_part->headers['content-id']);
-          $sa_inline_objects[] = $mail_part;
-          }
-        // is regular attachment
-        else
-          {
-          if (!$mail_part->filename)
-            $mail_part->filename = 'Part '.$mail_part->mime_id;
-          $a_attachments[] = $mail_part;
-          }
-        }
-      }
-
-    // if this was a related part try to resolve references
-    if ($message_ctype_secondary=='related' && sizeof($sa_inline_objects))
-      {
-      $a_replaces = array();
-        
-      foreach ($sa_inline_objects as $inline_object)
-        $a_replaces['cid:'.$inline_object->content_id] = htmlspecialchars(sprintf($get_url, $inline_object->mime_id));
-      
-      // add replace array to each content part
-      // (will be applied later when part body is available)
-      for ($i=0; $i<count($a_return_parts); $i++)
-        {
-        if ($a_return_parts[$i]->type=='content')
-          $a_return_parts[$i]->replaces = $a_replaces;
-        }
-      }
-    }
-
-  // message is single part non-text
-  else if ($structure->filename)
-    $a_attachments[] = $structure;
-
-  return array($a_return_parts, $a_attachments);
-  }
-
-
-
-
-// return table with message headers
+/**
+ * return table with message headers
+ */
 function rcmail_message_headers($attrib, $headers=NULL)
   {
   global $IMAP, $OUTPUT, $MESSAGE;
@@ -941,7 +652,11 @@ function rcmail_message_headers($attrib, $headers=NULL)
 
   // get associative array of headers object
   if (!$headers)
-    $headers = is_object($MESSAGE['headers']) ? get_object_vars($MESSAGE['headers']) : $MESSAGE['headers'];
+    $headers = is_object($MESSAGE->headers) ? get_object_vars($MESSAGE->headers) : $MESSAGE->headers;
+    
+  // add empty subject if none exsists
+  if (empty($headers['subject']))
+    $headers['subject'] = rcube_label('nosubject');
   
   $header_count = 0;
   
@@ -958,11 +673,11 @@ function rcmail_message_headers($attrib, $headers=NULL)
       continue;
 
     if ($hkey=='date' && !empty($headers[$hkey]))
-      $header_value = format_date(strtotime($headers[$hkey]));
+      $header_value = format_date($headers[$hkey]);
     else if (in_array($hkey, array('from', 'to', 'cc', 'bcc', 'reply-to')))
       $header_value = Q(rcmail_address_string($headers[$hkey], NULL, $attrib['addicon']), 'show');
     else
-      $header_value = Q(rcube_imap::decode_mime_string($headers[$hkey], $headers['charset']));
+      $header_value = Q($IMAP->decode_header($headers[$hkey]));
 
     $out .= "\n<tr>\n";
     $out .= '<td class="header-title">'.Q(rcube_label($hkey)).":&nbsp;</td>\n";
@@ -976,103 +691,90 @@ function rcmail_message_headers($attrib, $headers=NULL)
   }
 
 
-
+/**
+ * Handler for the 'messagebody' GUI object
+ *
+ * @param array Named parameters
+ * @return string HTML content showing the message body
+ */
 function rcmail_message_body($attrib)
   {
-  global $CONFIG, $OUTPUT, $MESSAGE, $IMAP, $GET_URL, $REMOTE_OBJECTS;
+  global $CONFIG, $OUTPUT, $MESSAGE, $IMAP, $REMOTE_OBJECTS;
   
-  if (!is_array($MESSAGE['parts']) && !$MESSAGE['body'])
+  if (!is_array($MESSAGE->parts) && empty($MESSAGE->body))
     return '';
     
   if (!$attrib['id'])
     $attrib['id'] = 'rcmailMsgBody';
 
-  $safe_mode = $MESSAGE['is_safe'] || intval($_GET['_safe']);
-  $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
-  $out = '<div '. $attrib_str . ">\n";
+  $safe_mode = $MESSAGE->is_safe || intval($_GET['_safe']);
+  $out = '';
   
   $header_attrib = array();
   foreach ($attrib as $attr => $value)
     if (preg_match('/^headertable([a-z]+)$/i', $attr, $regs))
       $header_attrib[$regs[1]] = $value;
 
-
-  // this is an ecrypted message
-  // -> create a plaintext body with the according message
-  if (!sizeof($MESSAGE['parts']) && $MESSAGE['headers']->ctype=='multipart/encrypted')
-    {
-    $p = new stdClass;
-    $p->type = 'content';
-    $p->ctype_primary = 'text';
-    $p->ctype_secondary = 'plain';
-    $p->body = rcube_label('encryptedmessage');
-    $MESSAGE['parts'][0] = $p;
-    }
-  
-  if ($MESSAGE['parts'])
+  if (!empty($MESSAGE->parts))
     {
-    foreach ($MESSAGE['parts'] as $i => $part)
+    foreach ($MESSAGE->parts as $i => $part)
       {
-      if ($part->type=='headers')
+      if ($part->type == 'headers')
         $out .= rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : NULL, $part->headers);
-      else if ($part->type=='content')
+      else if ($part->type == 'content')
         {
         if (empty($part->ctype_parameters) || empty($part->ctype_parameters['charset']))
-          $part->ctype_parameters['charset'] = $MESSAGE['headers']->charset;
+          $part->ctype_parameters['charset'] = $MESSAGE->headers->charset;
 
         // fetch part if not available
         if (!isset($part->body))
-          $part->body = $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part);
+          $part->body = $MESSAGE->get_part_content($part->mime_id);
 
         $body = rcmail_print_body($part, $safe_mode, !$CONFIG['prefer_html']);
-        $out .= '<div class="message-part">';
         
-        if ($part->ctype_secondary != 'plain')
-          $out .= rcmail_sanitize_html($body, $attrib['id']);
+        if ($part->ctype_secondary == 'html')
+          $out .= html::div('message-htmlpart', rcmail_html4inline($body, $attrib['id']));
         else
-          $out .= $body;
-
-        $out .= "</div>\n";
+          $out .= html::div('message-part', $body);
         }
       }
     }
   else
-    $out .= $MESSAGE['body'];
+    $out .= html::div('message-part', html::div('pre', Q($MESSAGE->body)));
 
 
-  $ctype_primary = strtolower($MESSAGE['structure']->ctype_primary);
-  $ctype_secondary = strtolower($MESSAGE['structure']->ctype_secondary);
+  $ctype_primary = strtolower($MESSAGE->structure->ctype_primary);
+  $ctype_secondary = strtolower($MESSAGE->structure->ctype_secondary);
   
   // list images after mail body
-  if (get_boolean($attrib['showimages']) && $ctype_primary=='multipart' &&
-      !empty($MESSAGE['attachments']) && !strstr($message_body, '<html') && strlen($GET_URL))
-    {
-    foreach ($MESSAGE['attachments'] as $attach_prop)
-      {
-      if (strpos($attach_prop->mimetype, 'image/')===0)
-        $out .= sprintf("\n<hr />\n<p align=\"center\"><img src=\"%s&amp;_part=%s\" alt=\"%s\" title=\"%s\" /></p>\n",
-                        htmlspecialchars($GET_URL), $attach_prop->mime_id,
-                        $attach_prop->filename,
-                        $attach_prop->filename);
-      }
+  if (get_boolean($attrib['showimages']) && $ctype_primary == 'multipart' &&
+      !empty($MESSAGE->attachments) && !strstr($message_body, '<html')) {
+    foreach ($MESSAGE->attachments as $attach_prop) {
+      if (strpos($attach_prop->mimetype, 'image/') === 0) {
+        $out .= html::tag('hr') . html::p(array('align' => "center"),
+          html::img(array(
+            'src' => $MESSAGE->get_part_url($attach_prop->mime_id),
+            'title' => $attach_prop->filename,
+            'alt' => $attach_prop->filename,
+          )));
+        }
     }
+  }
   
   // tell client that there are blocked remote objects
   if ($REMOTE_OBJECTS && !$safe_mode)
     $OUTPUT->set_env('blockedobjects', true);
 
-  $out .= "\n</div>";
-  return $out;
+  return html::div($attrib, $out);
   }
 
 
 
-// modify a HTML message that it can be displayed inside a HTML page
-function rcmail_sanitize_html($body, $container_id)
+/**
+ * modify a HTML message that it can be displayed inside a HTML page
+ */
+function rcmail_html4inline($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);
@@ -1094,26 +796,6 @@ function rcmail_sanitize_html($body, $container_id)
     $last_style_pos = $pos2;
     }
 
-
-  // remove SCRIPT tags
-  foreach (array('script', 'applet', 'object', 'embed', 'iframe') as $tag)
-    {
-    while (($pos = strpos($body_lc, '<'.$tag)) && (($pos2 = strpos($body_lc, '</'.$tag.'>', $pos)) || ($pos3 = strpos($body_lc, '>', $pos))))
-      {
-      $end = $pos2 ? $pos2 + strlen('</'.$tag.'>') : $pos3 + 1;
-      $body = substr($body, 0, $pos) . substr($body, $end, strlen($body)-$end);
-      $body_lc = strtolower($body);
-      }
-    }
-
-  // replace event handlers on any object
-  while ($body != $prev_body)
-    {
-    $prev_body = $body;
-    $body = preg_replace('/(<[^!][^>]*\s)on(?:load|unload|click|dblclick|mousedown|mouseup|mouseover|mousemove|mouseout|focus|blur|keypress|keydown|keyup|submit|reset|select|change)=([^>]+>)/im', '$1__removed=$2', $body);
-    $body = preg_replace('/(<[^!][^>]*\shref=["\']?)(javascript:)([^>]*?>)/im', '$1null:$3', $body);
-    }
-
   // resolve <base href>
   if ($base_url)
     {
@@ -1127,7 +809,8 @@ function rcmail_sanitize_html($body, $container_id)
 
   // add comments arround html and other tags
   $out = preg_replace(array(
-      '/(<!DOCTYPE.+)/i',
+      '/(<!DOCTYPE[^>]*>)/i',
+      '/(<\?xml[^>]*>)/i',
       '/(<\/?html[^>]*>)/i',
       '/(<\/?head[^>]*>)/i',
       '/(<title[^>]*>.*<\/title>)/Ui',
@@ -1136,14 +819,8 @@ function rcmail_sanitize_html($body, $container_id)
     $body);
 
   $out = preg_replace(
-    array(
-      '/<body([^>]*)>/i',
-      '/<\/body>/i',
-    ),
-    array(
-      '<div class="rcmBody"\\1>',
-      '</div>',
-    ),
+    array('/<body([^>]*)>/i', '/<\/body>/i'),
+    array('<div class="rcmBody"\\1>', '</div>'),
     $out);
 
   // quote <? of php and xml files that are specified as text/html
@@ -1153,12 +830,13 @@ function rcmail_sanitize_html($body, $container_id)
   }
 
 
-// parse link attributes and set correct target
+/**
+ * parse link attributes and set correct target
+ */
 function rcmail_alter_html_link($tag, $attrs, $container_id)
   {
-  $in = preg_replace('/=([^("|\'|\s)]+)(\s|$)/', '="\1"', $in);
   $attrib = parse_attrib_string($attrs);
-  
+
   if ($tag == 'link' && preg_match('/^https?:\/\//i', $attrib['href']))
     $attrib['href'] = "./bin/modcss.php?u=" . urlencode($attrib['href']) . "&amp;c=" . urlencode($container_id);
 
@@ -1167,7 +845,7 @@ function rcmail_alter_html_link($tag, $attrs, $container_id)
       "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';
 
@@ -1175,96 +853,13 @@ function rcmail_alter_html_link($tag, $attrs, $container_id)
   }
 
 
-function rcmail_has_html_part($message_parts)
-{
-   if (!is_array($message_parts))
-      return FALSE;
-
-   // check all message parts
-   foreach ($message_parts as $pid => $part)
-   {
-      $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary);
-      if ($mimetype=='text/html')
-      {
-         return TRUE;
-      }
-   }
-    
-   return FALSE;
-}
-
-// return first HTML part of a message
-function rcmail_first_html_part($message_struct)
-  {
-  global $IMAP;
-
-  if (!is_array($message_struct['parts']))
-    return FALSE;
-    
-  $html_part = NULL;
-
-  // check all message parts
-  foreach ($message_struct['parts'] as $pid => $part)
-    {
-    $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary);
-    if ($mimetype=='text/html')
-      {
-      $html_part = $IMAP->get_message_part($message_struct['UID'], $pid, $part);
-      }
-    }
-
-  if ($html_part)
-    {
-    // remove special chars encoding
-    //$trans = array_flip(get_html_translation_table(HTML_ENTITIES));
-    //$html_part = strtr($html_part, $trans);
-
-    return $html_part;
-    }
-
-  return FALSE;
-}
-
-
-// return first text part of a message
-function rcmail_first_text_part($message_struct)
-  {
-  global $IMAP;
-
-  if (empty($message_struct['parts']))
-    return $message_struct['UID'] ? $IMAP->get_body($message_struct['UID']) : false;
-
-  // check all message parts
-  foreach ($message_struct['parts'] as $pid => $part)
-    {
-    $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary);
-
-    if ($mimetype=='text/plain')
-      return $IMAP->get_message_part($message_struct['UID'], $pid, $part);
-
-    else if ($mimetype=='text/html')
-      {
-      $html_part = $IMAP->get_message_part($message_struct['UID'], $pid, $part);
-      
-      // remove special chars encoding
-      $trans = array_flip(get_html_translation_table(HTML_ENTITIES));
-      $html_part = strtr($html_part, $trans);
-
-      // create instance of html2text class
-      $txt = new html2text($html_part);
-      return $txt->get_text();
-      }
-    }
-
-  return FALSE;
-  }
-
-
-// decode address string and re-format it as HTML links
+/**
+ * decode address string and re-format it as HTML links
+ */
 function rcmail_address_string($input, $max=NULL, $addicon=NULL)
   {
   global $IMAP, $PRINT_MODE, $CONFIG, $OUTPUT, $EMAIL_ADDRESS_PATTERN;
-  
+
   $a_parts = $IMAP->decode_address_list($input);
 
   if (!sizeof($a_parts))
@@ -1320,33 +915,27 @@ function rcmail_address_string($input, $max=NULL, $addicon=NULL)
 
 function rcmail_message_part_controls()
   {
-  global $CONFIG, $IMAP, $MESSAGE;
+  global $MESSAGE;
   
   $part = asciiwords(get_input_value('_part', RCUBE_INPUT_GPC));
-  if (!is_array($MESSAGE) || !is_array($MESSAGE['parts']) || !($_GET['_uid'] && $_GET['_part']) || !$MESSAGE['parts'][$part])
+  if (!is_object($MESSAGE) || !is_array($MESSAGE->parts) || !($_GET['_uid'] && $_GET['_part']) || !$MESSAGE->mime_parts[$part])
     return '';
     
-  $part = $MESSAGE['parts'][$part];
-  $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'cellspacing', 'cellpadding', 'border', 'summary'));
-  $out = '<table '. $attrib_str . ">\n";
+  $part = $MESSAGE->mime_parts[$part];
+  $table = new html_table(array('cols' => 3));
   
-  if ($part->filename)
-    {
-    $out .= sprintf('<tr><td class="title">%s</td><td>%s</td><td>[<a href="./?%s">%s</a>]</tr>'."\n",
-                    Q(rcube_label('filename')),
-                    Q($part->filename),
-                    str_replace('_frame=', '_download=', $_SERVER['QUERY_STRING']),
-                    Q(rcube_label('download')));
-    }
-    
-  if ($part->size)
-    $out .= sprintf('<tr><td class="title">%s</td><td>%s</td></tr>'."\n",
-                    Q(rcube_label('filesize')),
-                    show_bytes($part->size));
+  if (!empty($part->filename)) {
+    $table->add('title', Q(rcube_label('filename')));
+    $table->add(null, Q($part->filename));
+    $table->add(null, '[' . html::a('?'.str_replace('_frame=', '_download=', $_SERVER['QUERY_STRING']), Q(rcube_label('download'))) . ']');
+  }
   
-  $out .= "\n</table>";
+  if (!empty($part->size)) {
+    $table->add('title', Q(rcube_label('filesize')));
+    $table->add(null, Q(show_bytes($part->size)));
+  }
   
-  return $out;
+  return $table->show($attrib);
   }
 
 
@@ -1355,7 +944,7 @@ function rcmail_message_part_frame($attrib)
   {
   global $MESSAGE;
   
-  $part = $MESSAGE['parts'][asciiwords(get_input_value('_part', RCUBE_INPUT_GPC))];
+  $part = $MESSAGE->mime_parts[asciiwords(get_input_value('_part', RCUBE_INPUT_GPC))];
   $ctype_primary = strtolower($part->ctype_primary);
 
   $attrib['src'] = Q('./?'.str_replace('_frame=', ($ctype_primary=='text' ? '_show=' : '_preload='), $_SERVER['QUERY_STRING']));
@@ -1367,7 +956,9 @@ function rcmail_message_part_frame($attrib)
   }
 
 
-// clear message composing settings
+/**
+ * clear message composing settings
+ */
 function rcmail_compose_cleanup()
   {
   if (!isset($_SESSION['compose']))
@@ -1389,8 +980,8 @@ function rcmail_deliver_message(&$message, $from, $mailto)
 {
   global $CONFIG;
 
-  $headers = $message->headers();
   $msg_body = $message->get();
+  $headers = $message->headers();
   
   // send thru SMTP server using custom SMTP library
   if ($CONFIG['smtp_server'])
@@ -1406,10 +997,12 @@ function rcmail_deliver_message(&$message, $from, $mailto)
     // clean Bcc from header for recipients
     $send_headers = $headers;
     unset($send_headers['Bcc']);
+    // here too, it because txtHeaders() below use $message->_headers not only $send_headers
+    unset($message->_headers['Bcc']);
 
     // send message
     $smtp_response = array();
-    $sent = smtp_mail($from, $a_recipients, ($foo = $message->txtHeaders($send_headers)), $msg_body, $smtp_response);
+    $sent = smtp_mail($from, $a_recipients, ($foo = $message->txtHeaders($send_headers, true)), $msg_body, $smtp_response);
 
     // log error
     if (!$sent)
@@ -1448,19 +1041,17 @@ function rcmail_deliver_message(&$message, $from, $mailto)
 function rcmail_send_mdn($uid)
 {
   global $CONFIG, $USER, $IMAP;
+
+  $message = new rcube_message($uid);
   
-  $message = array('UID' => $uid);
-  $message['headers'] = $IMAP->get_headers($message['UID']);
-  $message['subject'] = rcube_imap::decode_mime_string($message['headers']->subject, $message['headers']->charset);
-  
-  if ($message['headers']->mdn_to && !$message['headers']->mdn_sent)
+  if ($message->headers->mdn_to && !$message->headers->mdn_sent)
   {
     $identity = $USER->get_identity();
     $sender = format_email_recipient($identity['email'], $identity['name']);
-    $recipient = array_shift($IMAP->decode_address_list($message['headers']->mdn_to));
+    $recipient = array_shift($IMAP->decode_address_list($message->headers->mdn_to));
     $mailto = $recipient['mailto'];
 
-    $compose = new rc_mail_mime(rcmail_header_delm());
+    $compose = new rcube_mail_mime(rcmail_header_delm());
     $compose->setParam(array(
       'text_encoding' => 'quoted-printable',
       'html_encoding' => 'quoted-printable',
@@ -1474,8 +1065,8 @@ function rcmail_send_mdn($uid)
     $headers = array(
       'Date' => date('r'),
       'From' => $sender,
-      'To'   => $message['headers']->mdn_to,
-      'Subject' => rcube_label('receiptread') . ': ' . $message['subject'],
+      'To'   => $message->headers->mdn_to,
+      'Subject' => rcube_label('receiptread') . ': ' . $message->subject,
       'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), rcmail_mail_domain($_SESSION['imap_host'])),
       'X-Sender' => $identity['email'],
       'Content-Type' => 'multipart/report; report-type=disposition-notification',
@@ -1485,30 +1076,30 @@ function rcmail_send_mdn($uid)
       $headers['User-Agent'] = $CONFIG['useragent'];
 
     $body = rcube_label("yourmessage") . "\r\n\r\n" .
-      "\t" . rcube_label("to") . ': ' . rcube_imap::decode_mime_string($message['headers']->to, $message['headers']->charset) . "\r\n" .
-      "\t" . rcube_label("subject") . ': ' . $message['subject'] . "\r\n" .
-      "\t" . rcube_label("sent") . ': ' . format_date(strtotime($message['headers']->date), $CONFIG['date_long']) . "\r\n" .
+      "\t" . rcube_label("to") . ': ' . rcube_imap::decode_mime_string($message->headers->to, $message->headers->charset) . "\r\n" .
+      "\t" . rcube_label("subject") . ': ' . $message->subject . "\r\n" .
+      "\t" . rcube_label("sent") . ': ' . format_date($message->headers->date, $CONFIG['date_long']) . "\r\n" .
       "\r\n" . rcube_label("receiptnote") . "\r\n";
     
     $ua = !empty($CONFIG['useragent']) ? $CONFIG['useragent'] : "RoundCube Webmail (Version ".RCMAIL_VERSION.")";
     $report = "Reporting-UA: $ua\r\n";
     
-    if ($message['headers']->to)
-        $report .= "Original-Recipient: {$message['headers']->to}\r\n";
+    if ($message->headers->to)
+        $report .= "Original-Recipient: {$message->headers->to}\r\n";
     
     $report .= "Final-Recipient: rfc822; {$identity['email']}\r\n" .
-               "Original-Message-ID: {$message['headers']->messageID}\r\n" .
+               "Original-Message-ID: {$message->headers->messageID}\r\n" .
                "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
     
-    $compose->headers($headers, true);
-    $compose->setTXTBody($body);
+    $compose->headers($headers);
+    $compose->setTXTBody(wordwrap($body, 75, "\r\n"));
     $compose->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
 
     $sent = rcmail_deliver_message($compose, $identity['email'], $mailto);
 
     if ($sent)
     {
-      $IMAP->set_flag($message['UID'], 'MDNSENT');
+      $IMAP->set_flag($message->uid, 'MDNSENT');
       return true;
     }
   }
@@ -1528,7 +1119,7 @@ $OUTPUT->add_handlers(array(
   'messagecontentframe' => 'rcmail_messagecontent_frame',
   'messagepartframe' => 'rcmail_message_part_frame',
   'messagepartcontrols' => 'rcmail_message_part_controls',
-  'searchform' => 'rcmail_search_form'
+  'searchform' => array($OUTPUT, 'search_form'),
 ));
 
 ?>
index c5f94804476979aa05773545394a7331717f31cc..27c61c71340963208e46a1a0a2aa84b7388e134b 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/get.inc                                            |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: get.inc 1026 2008-02-07 07:50:37Z thomasb $
+ $Id: get.inc 1400 2008-05-17 17:46:43Z thomasb $
 
 */
 
@@ -23,8 +23,7 @@ require_once('Mail/mimeDecode.php');
 
 
 // show loading page
-if ($_GET['_preload'])
-  {
+if (!empty($_GET['_preload'])) {
   $url = str_replace('&_preload=1', '', $_SERVER['REQUEST_URI']);
   $message = rcube_label('loadingdata');
 
@@ -34,29 +33,24 @@ if ($_GET['_preload'])
         $message .
         "\n</body>\n</html>";
   exit;
-  }
+}
 
 
 // similar code as in program/steps/mail/show.inc
-if ($_GET['_uid'])
-  {
-  $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET));
-  $MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']);
-  $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']);
-  }
+if (!empty($_GET['_uid'])) {
+  $RCMAIL->config->set('prefer_html', true);
+  $MESSAGE = new rcube_message(get_input_value('_uid', RCUBE_INPUT_GET));
+}
 
 
 // show part page
-if ($_GET['_frame'])
-  {
-  parse_template('messagepart');
+if (!empty($_GET['_frame'])) {
+  $OUTPUT->send('messagepart');
   exit;
-  }
+}
 
-else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
-  {
-  if ($part = $MESSAGE['parts'][$pid])
-    {
+else if ($pid = get_input_value('_part', RCUBE_INPUT_GET)) {
+  if ($part = $MESSAGE->mime_parts[$pid]) {
     $ctype_primary = strtolower($part->ctype_primary);
     $ctype_secondary = strtolower($part->ctype_secondary);
     $mimetype = sprintf('%s/%s', $ctype_primary, $ctype_secondary);
@@ -67,25 +61,23 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
     header("Content-Transfer-Encoding: binary");
 
     // send download headers
-    if ($_GET['_download'])
-      {
+    if ($_GET['_download']) {
       header("Cache-Control: private", false);
       header("Content-Type: application/octet-stream");
-      }
+    }
     else
       header("Content-Type: $mimetype");
 
     // We need to set the following headers to make downloads work using IE in HTTPS mode.
-    if (isset($_SERVER['HTTPS']))
-      {
+    if (isset($_SERVER['HTTPS'])) {
       header('Pragma: ');
       header('Cache-Control: ');
-      }
+    }
 
     // deliver part content
-    if ($ctype_primary=='text' && $ctype_secondary=='html')
-      {
+    if ($ctype_primary == 'text' && $ctype_secondary == 'html') {
       // we have to analyze the whole structure again to find inline objects
+      /* what was this good for again ?
       list($new_parts, $new_attachments) =
         rcmail_parse_message($MESSAGE['structure'],
                              array('safe' => intval($_GET['_safe']),
@@ -96,43 +88,33 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
       for ($partix = 0; $partix < sizeof($all_parts); $partix++)
         if ($all_parts[$partix]->mime_id == $pid)
           $part = &$all_parts[$partix];
+      */
 
       // get part body if not available
       if (!$part->body)
-        $part->body = $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part);
+        $part->body = $MESSAGE->get_part_content($part->mime_id);
 
       $OUTPUT = new rcube_html_page();
-      $OUTPUT->write(rcmail_print_body($part, intval($_GET['_safe'])));
-      }
-    else
-      {
+      $OUTPUT->write(rcmail_print_body($part, $MESSAGE->is_safe));
+    }
+    else {
       header(sprintf('Content-Disposition: %s; filename="%s";',
                      $_GET['_download'] ? 'attachment' : 'inline',
                      $part->filename ? abbreviate_string($part->filename, 55) : "roundcube.$ctype_secondary"));
 
       // turn off output buffering and print part content
-      $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part, true);
-      }
+      $IMAP->get_message_part($MESSAGE->uid, $part->mime_id, $part, true);
+    }
 
     exit;
-    }
   }
+}
 
 // print message
-else
-  {
-  $ctype_primary = strtolower($MESSAGE['structure']->ctype_primary);
-  $ctype_secondary = strtolower($MESSAGE['structure']->ctype_secondary);
-  $mimetype = sprintf('%s/%s', $ctype_primary, $ctype_secondary);
-
+else {
   // send correct headers for content type
   header("Content-Type: text/html");
 
-  $cont = ''; 
-  list($MESSAGE['parts']) = rcmail_parse_message($MESSAGE['structure'],
-                                                 array('safe' => intval($_GET['_safe']),
-                                                 'get_url' => $GET_URL.'&_part=%s'));
-
   $cont = "<html>\n<head><title></title>\n</head>\n<body>";
   $cont .= rcmail_message_body(array());
   $cont .= "\n</body>\n</html>";
@@ -141,7 +123,7 @@ else
   $OUTPUT->write($cont);
 
   exit;
-  }
+}
 
 
 // if we arrive here, the requested part was not found
index 2010075fab34307ff11175fc6c42b63ed653096d..d81264a088e8b38b4bad2bd30d5208359831d3aa 100644 (file)
@@ -14,7 +14,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: mark.inc 1019 2008-02-05 21:39:08Z thomasb $
+ $Id: mark.inc 1292 2008-04-12 17:37:22Z alec $
 
 */
 
@@ -29,6 +29,15 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
   $flag = $a_flags_map[$flag] ? $a_flags_map[$flag] : strtoupper($flag);
   $marked = $IMAP->set_flag($uids, $flag);
 
+  if($flag == 'DELETED' && $CONFIG['read_when_deleted'] && !empty($_POST['_ruid']))
+    {
+    $uids = get_input_value('_ruid', RCUBE_INPUT_POST);
+    $read = $IMAP->set_flag($uids, 'SEEN');
+    
+    if ($read != -1)
+      $OUTPUT->command('flag_deleted_as_read', $uids);
+    }
+
   if ($marked != -1)
   {
     $mbox_name = $IMAP->get_mailbox_name();
index 5f518ed56e8f7c6e03e213ec1f24024993a08244..0e4ed17534c7651a92a763541b8eaa2b57d96e84 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: move_del.inc 1019 2008-02-05 21:39:08Z thomasb $
+ $Id: move_del.inc 1359 2008-05-06 16:56:42Z alec $
 
 */
 
@@ -24,62 +24,56 @@ $old_count = $IMAP->messagecount();
 $old_pages = ceil($old_count / $IMAP->page_size);
 
 // move messages
-if ($_action=='moveto' && !empty($_POST['_uid']) && !empty($_POST['_target_mbox']))
-{
-  $count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
-  $target = get_input_value('_target_mbox', RCUBE_INPUT_POST);
-  $moved = $IMAP->move_message($uids, $target, get_input_value('_mbox', RCUBE_INPUT_POST));
+if ($RCMAIL->action=='moveto' && !empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) {
+    $count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
+    $target = get_input_value('_target_mbox', RCUBE_INPUT_POST);
+    $moved = $IMAP->move_message($uids, $target, get_input_value('_mbox', RCUBE_INPUT_POST));
   
-  if (!$moved)
-  {
-    // send error message
-    $OUTPUT->command('list_mailbox');
-    $OUTPUT->show_message('errormoving', 'error');
-    $OUTPUT->send();
-    exit;
-  }
+    if (!$moved) {
+        // send error message
+        $OUTPUT->command('list_mailbox');
+        $OUTPUT->show_message('errormoving', 'error');
+        $OUTPUT->send();
+        exit;
+    }
 }
-
 // delete messages 
-else if ($_action=='delete' && !empty($_POST['_uid']))
-{
-  $count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
-  $del = $IMAP->delete_message($uids, get_input_value('_mbox', RCUBE_INPUT_POST));
+else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) {
+    $count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
+    $del = $IMAP->delete_message($uids, get_input_value('_mbox', RCUBE_INPUT_POST));
   
-  if (!$del)
-  {
-    // send error message
-    $OUTPUT->command('list_mailbox');
-    $OUTPUT->show_message('errordeleting', 'error');
-    $OUTPUT->send();
-    exit;
-  }
+    if (!$del) {
+        // send error message
+        $OUTPUT->command('list_mailbox');
+        $OUTPUT->show_message('errordeleting', 'error');
+        $OUTPUT->send();
+        exit;
+    }
 }
-  
 // unknown action or missing query param
-else
-  exit;
-
+else {
+    exit;
+}
 // refresh saved search set after moving some messages
-if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->search_set)
-  $_SESSION['search'][$search_request] = $IMAP->refresh_search();
-
+if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->search_set) {
+    $_SESSION['search'][$search_request] = $IMAP->refresh_search();
+}
 
-$msg_count = $IMAP->messagecount();
-$pages = ceil($msg_count / $IMAP->page_size);
+$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);
+$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;
+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('messagecount', $msg_count);
 $OUTPUT->set_env('current_page', $IMAP->list_page);
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count));
 
@@ -88,26 +82,23 @@ $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count));
 $mbox = $IMAP->get_mailbox_name();
 $OUTPUT->command('set_unread_count', $mbox, $IMAP->messagecount($mbox, 'UNSEEN'), ($mbox == 'INBOX'));
 
-if ($_action=='moveto' && $target)
-  $OUTPUT->command('set_unread_count', $target, $IMAP->messagecount($target, 'UNSEEN'));
+if ($RCMAIL->action=='moveto' && $target) {
+    $OUTPUT->command('set_unread_count', $target, $IMAP->messagecount($target, 'UNSEEN'));
+}
 
-$OUTPUT->command('set_quota', $IMAP->get_quota());
+$OUTPUT->command('set_quota', rcmail_quota_content($IMAP->get_quota()));
 
 // add new rows from next page (if any)
-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'];
+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);
-  if (!$jump_back)
-    $a_headers = array_slice($a_headers, -$count, $count);
-
-  rcmail_js_message_list($a_headers);
+    $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order);
+    if (!$jump_back) {
+        $a_headers = array_slice($a_headers, -$count, $count);
+    }
+    rcmail_js_message_list($a_headers);
 }
 
-
 // send response
 $OUTPUT->send();
-
-?>
diff --git a/program/steps/mail/quotadisplay.inc b/program/steps/mail/quotadisplay.inc
deleted file mode 100644 (file)
index 62f214a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/mail/quotadisplay.inc                                   |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Remote call to return the quota image or text                       |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Robin Elfrink <robin@15augustus.nl>                           |
- +-----------------------------------------------------------------------+
-
- $Id: quotadisplay.inc 850 2007-10-03 00:13:32Z ihug $
-
-*/
-
-$display = isset($_GET['_display']) ? $_GET['_display'] : 'text';
-$id = isset($_GET['_id']) ? $_GET['_id'] : 'rcmquotadisplay';
-$quota = rcmail_quota_content($display);
-$OUTPUT->remote_response(sprintf("this.gui_objects.%s.innerHTML = '%s';\n", $id, $quota));
-
-exit;
-?>
index f5168dd6f118a894516403abede4ecc54d420ba7..8d850eb3c429f49b3efacb8fbb2ee27a469bacff 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/sendmail.inc                                       |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: sendmail.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: sendmail.inc 1344 2008-04-30 08:21:42Z thomasb $
 
 */
 
 
-//require_once('lib/smtp.inc');
-require_once('lib/html2text.inc');
-require_once('lib/rc_mail_mime.inc');
-
-
 if (!isset($_SESSION['compose']['id']))
   {
   rcmail_overwrite_action('list');
@@ -70,7 +65,7 @@ function rcmail_get_identity($id)
  */
 function rcmail_attach_emoticons(&$mime_message)
 {
-  global $CONFIG, $INSTALL_PATH;
+  global $CONFIG;
 
   $htmlContents = $mime_message->getHtmlBody();
 
@@ -100,7 +95,7 @@ function rcmail_attach_emoticons(&$mime_message)
     if (! in_array($image_name, $included_images))
       {
       // add the image to the MIME message
-      $img_file = $INSTALL_PATH . '/' . $searchstr . $image_name;
+      $img_file = INSTALL_PATH . '/' . $searchstr . $image_name;
       if(! $mime_message->addHTMLImage($img_file, 'image/gif', '', true, '_' . $image_name))
         $OUTPUT->show_message("emoticonerror", 'error');
 
@@ -210,9 +205,6 @@ if (!empty($_POST['_receipt']))
   }
 
 // additional headers
-$headers['Message-ID'] = $message_id;
-$headers['X-Sender'] = $from;
-
 if ($CONFIG['http_received_header'])
 {
   $nldlm = rcmail_header_delm() . "\t";
@@ -223,6 +215,9 @@ if ($CONFIG['http_received_header'])
     69, $nldlm);
 }
 
+$headers['Message-ID'] = $message_id;
+$headers['X-Sender'] = $from;
+
 if (!empty($CONFIG['useragent']))
   $headers['User-Agent'] = $CONFIG['useragent'];
 
@@ -237,7 +232,7 @@ $isHtmlVal = strtolower(get_input_value('_is_html', RCUBE_INPUT_POST));
 $isHtml = ($isHtmlVal == "1");
 
 // create extended PEAR::Mail_mime instance
-$MAIL_MIME = new rc_mail_mime(rcmail_header_delm());
+$MAIL_MIME = new rcube_mail_mime(rcmail_header_delm());
 
 // For HTML-formatted messages, construct the MIME message with both
 // the HTML part and the plain-text part
@@ -318,7 +313,7 @@ $MAIL_MIME->setParam(array(
 ));
 
 // encoding subject header with mb_encode provides better results with asian characters
-if ($MBSTRING && function_exists("mb_encode_mimeheader"))
+if (function_exists("mb_encode_mimeheader"))
 {
   mb_internal_encoding($message_charset);
   $headers['Subject'] = mb_encode_mimeheader($headers['Subject'], $message_charset, 'Q');
index 530dcac4c9ed4eff1665a5a7490b8626e56e4043..191f950c198ebb7b8c1d1434439a32ac09850e82 100644 (file)
@@ -19,8 +19,6 @@
 
 */
 
-require_once('lib/rc_mail_mime.inc');
-
 
 if (!empty($_POST['_uid'])) {
   $sent = rcmail_send_mdn(get_input_value('_uid', RCUBE_INPUT_POST));
index 344ce58b7f6b1e829f6add7775927ce461d985c0..63ebd600cd059162c01676a8f3c90681bae77619 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: show.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: show.inc 1400 2008-05-17 17:46:43Z thomasb $
 
 */
 
-require_once('Mail/mimeDecode.php');
-require_once('lib/rc_mail_mime.inc');
-
-$PRINT_MODE = $_action=='print' ? TRUE : FALSE;
+$PRINT_MODE = $RCMAIL->action=='print' ? TRUE : FALSE;
 
 // similar code as in program/steps/mail/get.inc
-if ($_GET['_uid'])
-  {
-  $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET));
-  $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']);
+if ($_GET['_uid']) {
+  $MESSAGE = new rcube_message(get_input_value('_uid', RCUBE_INPUT_GET));
   
   // set message charset as default
-  if (!empty($MESSAGE['headers']->charset))
-    $IMAP->set_charset($MESSAGE['headers']->charset);
-  
+  if (!empty($MESSAGE->headers->charset))
+    $IMAP->set_charset($MESSAGE->headers->charset);
+
   // go back to list if message not found (wrong UID)
-  if (!$MESSAGE['headers'])
-    {
+  if (empty($MESSAGE->headers)) {
     $OUTPUT->show_message('messageopenerror', 'error');
-    if ($_action=='preview' && template_exists('messagepreview'))
-        parse_template('messagepreview');
-    else
-      {
-      $_action = 'list';
+    if ($RCMAIL->action=='preview' && template_exists('messagepreview'))
+        $OUTPUT->send('messagepreview');
+    else {
+      $RCMAIL->action = 'list';
       return;
-      }
     }
+  }
     
-  // check if safe flag is set
-  if ($MESSAGE['is_safe'] = intval($_GET['_safe']))
-    $_SESSION['safe_messages'][$MESSAGE['UID']] = true;
-  else if ($_SESSION['safe_messages'][$MESSAGE['UID']])
-    $MESSAGE['is_safe'] = 1;
-
+  $mbox_name = $IMAP->get_mailbox_name();
+  
   // calculate Etag for this request
-  $etag = md5($MESSAGE['UID'].$IMAP->get_mailbox_name().session_id().intval($MESSAGE['headers']->mdn_sent).intval($MESSAGE['is_safe']).intval($PRINT_MODE));
+  $etag = md5($MESSAGE->uid.$mbox_name.session_id().intval($MESSAGE->headers->mdn_sent).intval($MESSAGE->is_safe).intval($PRINT_MODE));
 
   // allow caching, unless remote images are present
-  if ((bool)$MESSAGE['is_safe'])
+  if ((bool)$MESSAGE->is_safe)
     send_nocacheing_headers();
   else if (empty($CONFIG['devel_mode']))
-    send_modified_header($_SESSION['login_time'], $etag);
+    send_modified_header($_SESSION['login_time'], $etag, !$MESSAGE->headers->seen);
 
-  $MESSAGE['subject'] = rcube_imap::decode_mime_string($MESSAGE['headers']->subject, $MESSAGE['headers']->charset);
-  $OUTPUT->set_pagetitle($MESSAGE['subject']);
+  $OUTPUT->set_pagetitle($MESSAGE->subject);
   
-  if ($MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']))
-    list($MESSAGE['parts'], $MESSAGE['attachments']) = rcmail_parse_message(
-      $MESSAGE['structure'],
-      array('safe' => $MESSAGE['is_safe'],
-            'prefer_html' => $CONFIG['prefer_html'],
-            'get_url' => $GET_URL.'&_part=%s')
-      );
-  else
-    $MESSAGE['body'] = $IMAP->get_body($MESSAGE['UID']);
-
-
   // mark message as read
-  if (!$MESSAGE['headers']->seen && $_action != 'preview')
-    $IMAP->set_flag($MESSAGE['UID'], 'SEEN');
+  if (!$MESSAGE->headers->seen)
+  {
+    $marked = $IMAP->set_flag($MESSAGE->uid, 'SEEN');
+    if($RCMAIL->action == 'preview' && $marked != -1)
+    {
+      $OUTPUT->command('set_unread_count_from_preview', $mbox_name, $IMAP->messagecount($mbox_name, 'UNSEEN'), ($mbox_name == 'INBOX'));
+      $OUTPUT->command('mark_as_read_from_preview', $MESSAGE->uid);
+    }
+  }
 
   // give message uid to the client
-  $OUTPUT->set_env('uid', $MESSAGE['UID']);
-  $OUTPUT->set_env('safemode', $MESSAGE['is_safe']);
+  $OUTPUT->set_env('uid', $MESSAGE->uid);
+  $OUTPUT->set_env('safemode', $MESSAGE->is_safe);
   
   // check for unset disposition notification
-  if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent && $IMAP->get_mailbox_name() != $CONFIG['drafts_mbox'])
+  if ($MESSAGE->headers->mdn_to && !$MESSAGE->headers->mdn_sent &&
+      $mbox_name != $CONFIG['drafts_mbox'] && $mbox_name != $CONFIG['sent_mbox'])
   {
     if (intval($CONFIG['mdn_requests']) === 1)
     {
-      if (rcmail_send_mdn($MESSAGE['UID']))
+      if (rcmail_send_mdn($MESSAGE->uid))
         $OUTPUT->show_message('receiptsent', 'confirmation');
     }
     else if (empty($CONFIG['mdn_requests']))
@@ -108,21 +93,21 @@ if ($_GET['_uid'])
     // Only if we use custom sorting
     $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']);
  
-    $MESSAGE['index'] = array_search((string)$MESSAGE['UID'], $a_msg_index, TRUE);
-    $prev = isset($a_msg_index[$MESSAGE['index']-1]) ? $a_msg_index[$MESSAGE['index']-1] : -1 ;
+    $MESSAGE->index = array_search((string)$MESSAGE->uid, $a_msg_index, TRUE);
+    $prev = isset($a_msg_index[$MESSAGE->index-1]) ? $a_msg_index[$MESSAGE->index-1] : -1 ;
     $first = count($a_msg_index)>0 ? $a_msg_index[0] : -1;
-    $next = isset($a_msg_index[$MESSAGE['index']+1]) ? $a_msg_index[$MESSAGE['index']+1] : -1 ;
+    $next = isset($a_msg_index[$MESSAGE->index+1]) ? $a_msg_index[$MESSAGE->index+1] : -1 ;
     $last = count($a_msg_index)>0 ? $a_msg_index[count($a_msg_index)-1] : -1;
     }
   else
     {
     // this assumes that we are sorted by date_DESC
-    $seq = $IMAP->get_id($MESSAGE['UID']);
+    $seq = $IMAP->get_id($MESSAGE->uid);
     $prev = $IMAP->get_uid($seq + 1);
     $first = $IMAP->get_uid($IMAP->messagecount());
     $next = $IMAP->get_uid($seq - 1);
     $last = $IMAP->get_uid(1);
-    $MESSAGE['index'] = $IMAP->messagecount() - $seq;
+    $MESSAGE->index = $IMAP->messagecount() - $seq;
     }
   
   if ($prev > 0)
@@ -138,35 +123,35 @@ if ($_GET['_uid'])
 
 
 function rcmail_message_attachments($attrib)
-  {
-  global $CONFIG, $OUTPUT, $PRINT_MODE, $MESSAGE, $GET_URL;
+{
+  global $PRINT_MODE, $MESSAGE;
+  
+  $out = $ol = '';
 
-  if (sizeof($MESSAGE['attachments']))
-    {
-    // allow the following attributes to be added to the <ul> tag
-    $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
-    $out = '<ul' . $attrib_str . ">\n";
-
-    foreach ($MESSAGE['attachments'] as $attach_prop)
-      {
-      if ($PRINT_MODE)
-        $out .= sprintf('<li>%s (%s)</li>'."\n",
-                        $attach_prop->filename,
-                        show_bytes($attach_prop->size));
-      else
-        $out .= sprintf('<li><a href="%s&amp;_part=%s" onclick="return %s.command(\'load-attachment\',{part:\'%s\', mimetype:\'%s\'},this)">%s</a></li>'."\n",
-                        htmlspecialchars($GET_URL),
-                        $attach_prop->mime_id,
-                        JS_OBJECT_NAME,
-                        $attach_prop->mime_id,
-                        $attach_prop->mimetype,
-                        $attach_prop->filename);
+  if (sizeof($MESSAGE->attachments)) {
+    foreach ($MESSAGE->attachments as $attach_prop) {
+      if ($PRINT_MODE) {
+        $ol .= html::tag('li', null, sprintf("%s (%s)", Q($attach_prop->filename), Q(show_bytes($attach_prop->size))));
+      }
+      else {
+        $ol .= html::tag('li', null,
+          html::a(array(
+            'href' => $MESSAGE->get_part_url($attach_prop->mime_id),
+            'onclick' => sprintf(
+              'return %s.command(\'load-attachment\',{part:\'%s\', mimetype:\'%s\'},this)',
+              JS_OBJECT_NAME,
+              $attach_prop->mime_id,
+              $attach_prop->mimetype),
+            ),
+            Q($attach_prop->filename)));
       }
+    }
 
-    $out .= "</ul>";
-    return $out;
-    }  
-  }
+    $out = html::tag('ul', $attrib, $ol, html::$common_attrib);
+  } 
+  
+  return $out;
+}
 
 
 
@@ -198,10 +183,10 @@ $OUTPUT->add_handlers(array(
   'blockedobjects' => 'rcmail_remote_objects_msg'));
 
 
-if ($_action=='print' && template_exists('printmessage'))
-  parse_template('printmessage');
-else if ($_action=='preview' && template_exists('messagepreview'))
-    parse_template('messagepreview');
+if ($RCMAIL->action=='print' && template_exists('printmessage'))
+  $OUTPUT->send('printmessage');
+else if ($RCMAIL->action=='preview' && template_exists('messagepreview'))
+    $OUTPUT->send('messagepreview');
 else
-  parse_template('message');
+  $OUTPUT->send('message');
 ?>
index 9495d9935944f7da265cf343b5e6ee1fa05daf88..5fe285035beabc973a906a075c81264368cb4852 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: upload.inc 1085 2008-02-14 23:49:30Z till $
+ $Id: upload.inc 1434 2008-05-27 14:58:04Z thomasb $
 
 */
 
 
-if (!$_SESSION['compose'])
-  {
-  exit;
-  }
+if (!$_SESSION['compose']) {
+  die("Invalid session var!");
+}
 
 
 // use common temp dir for file uploads
@@ -34,7 +33,8 @@ if (!is_array($_SESSION['compose']['attachments']))
   $_SESSION['compose']['attachments'] = array();
 
 
-$response = '';
+// clear all stored output properties (like scripts and env vars)
+$OUTPUT->reset();
 
 if (is_array($_FILES['_attachments']['tmp_name']))
   {
@@ -78,6 +78,10 @@ if (is_array($_FILES['_attachments']['tmp_name']))
       }
     }
   }
+else if ($_SERVER['REQUEST_METHOD'] == 'POST')
+  { 
+  $OUTPUT->command('display_message', rcube_label('fileuploaderror'), 'error');
+  }
 
 // send html page with JS calls as response
 $OUTPUT->command('show_attachment_form', false);
index 9ad8c142bbe194571c5fa5f70077b2252e6aba57..79de995160bd2201bd224067fed6bd9d755743e8 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: viewsource.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: viewsource.inc 1195 2008-03-21 11:45:46Z thomasb $
 
 */
 
index 30eca4a98e52a7364d5043ffd838e4954a7503dd..ee61e1aeb527e90f224b3e7705332a637d5a3ddc 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: edit_identity.inc 940 2007-12-11 04:20:01Z estadtherr $
+ $Id: edit_identity.inc 1412 2008-05-21 07:45:54Z alec $
 
 */
 
-if (($_GET['_iid'] || $_POST['_iid']) && $_action=='edit-identity')
+$OUTPUT->set_pagetitle(rcube_label('identities'));
+
+if (($_GET['_iid'] || $_POST['_iid']) && $RCMAIL->action=='edit-identity')
   {
   $IDENTITY_RECORD = $USER->get_identity(get_input_value('_iid', RCUBE_INPUT_GPC));
   
   if (is_array($IDENTITY_RECORD))
     $OUTPUT->set_env('iid', $IDENTITY_RECORD['identity_id']);
-
-  $OUTPUT->set_pagetitle(rcube_label('edititem'));
   }
-else
-  $OUTPUT->set_pagetitle(rcube_label('newitem'));
 
 
 $OUTPUT->include_script('list.js');
@@ -37,13 +35,20 @@ $OUTPUT->include_script('list.js');
 
 function rcube_identity_form($attrib)
   {
-  global $IDENTITY_RECORD, $OUTPUT;
+  global $IDENTITY_RECORD, $RCMAIL, $OUTPUT;
+
+  $tinylang = substr($_SESSION['language'], 0, 2);
+  if (!file_exists('program/js/tiny_mce/langs/'.$tinylang.'.js'))
+    {
+      $tinylang = 'en';
+    }
 
-  $OUTPUT->include_script('tiny_mce/tiny_mce_src.js');
-  $OUTPUT->add_script("tinyMCE.init({ mode : 'specific_textareas'," .
+  $OUTPUT->include_script('tiny_mce/tiny_mce.js');
+  $OUTPUT->add_script("tinyMCE.init({ mode : 'textareas'," .
+                                    "editor_selector : 'mce_editor'," .
                                     "apply_source_formatting : true," .
+                                    "language : '$tinylang'," .
                                     "content_css : '\$__skin_path' + '/editor_content.css'," .
-                                    "editor_css : '\$__skin_path' + '/editor_ui.css'," .
                                     "theme : 'advanced'," .
                                     "theme_advanced_toolbar_location : 'top'," .
                                     "theme_advanced_toolbar_align : 'left'," .
@@ -51,7 +56,7 @@ function rcube_identity_form($attrib)
                                     "theme_advanced_buttons2 : 'link,unlink,code,forecolor,fontselect,fontsizeselect'," .
                                     "theme_advanced_buttons3 : '' });");
 
-  if (!$IDENTITY_RECORD && $GLOBALS['_action']!='add-identity')
+  if (!$IDENTITY_RECORD && $RCMAIL->action != 'add-identity')
     return rcube_label('notfound');
 
   // add some labels to client
@@ -69,7 +74,7 @@ function rcube_identity_form($attrib)
                        'reply-to'     => array('type' => 'text', 'label' => 'replyto'),
                        'bcc'          => array('type' => 'text'),
                        'signature'       => array('type' => 'textarea', 'size' => "40", 'rows' => "6"),
-                       'html_signature'=>array('type' => 'checkbox', 'label' => 'htmlsignature', 'onclick' => 'return rcmail.toggle_editor(this, \'_signature\');'),
+                       'html_signature'=>array('type' => 'checkbox', 'label' => 'htmlsignature', 'onclick' => 'return rcmail.toggle_editor(this, \'rcmfd_signature\');'),
                        'standard'     => array('type' => 'checkbox', 'label' => 'setdefault'));
 
 
@@ -80,7 +85,7 @@ function rcube_identity_form($attrib)
     if (is_array($colprop))
       {
       $out = $form_start;
-      $out .= rcmail_get_edit_field($attrib['part'], $IDENTITY_RECORD[$attrib['part']], $attrib, $colprop['type']); 
+      $out .= rcmail_get_edit_field($attrib['part'], $IDENTITY_RECORD[$attrib['part']], $attrib + array('size' => 30), $colprop['type']); 
       return $out;
       }
     else
@@ -104,13 +109,15 @@ function rcube_identity_form($attrib)
       {
       $attrib['size'] = $colprop['size'];
       $attrib['rows'] = $colprop['rows'];
-      $attrib['mce_editable'] = $IDENTITY_RECORD['html_signature'] ? "true" : "false";
+      if ($IDENTITY_RECORD['html_signature'])
+        {
+        $attrib['class'] = "mce_editor";
+        }
       }
     else
       {
-      unset($attrib['size']);
+      $attrib['size'] = 40;
       unset($attrib['rows']);
-      unset($attrib['mce_editable']);
       }
 
     $label = strlen($colprop['label']) ? $colprop['label'] : $col;
@@ -129,8 +136,8 @@ function rcube_identity_form($attrib)
 
 $OUTPUT->add_handler('identityform', 'rcube_identity_form');
 
-if ($_action=='add-identity' && template_exists('addidentity'))
-  parse_template('addidentity');
+if ($RCMAIL->action=='add-identity' && template_exists('addidentity'))
+  $OUTPUT->send('addidentity');
 
-parse_template('editidentity');
+$OUTPUT->send('editidentity');
 ?>
index 80ed8fc877a1ce0cae7171578b3606b4929214e0..2b8631b714157c56fe7709ef9803b289eb920e95 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: func.inc 1448 2008-05-29 07:36:53Z alec $
 
 */
 
-
-if ($USER->ID)
-  $OUTPUT->set_pagetitle(rcube_label('settingsfor') . " ". $USER->get_username());
-
+if (!$OUTPUT->ajax_call)
+  $OUTPUT->set_pagetitle(rcube_label('preferences'));
 
 
 function rcmail_user_prefs_form($attrib)
   {
-  global $DB, $CONFIG, $sess_user_lang;
+  global $RCMAIL;
+  $config = $RCMAIL->config->all();
 
-  $no_override = is_array($CONFIG['dont_override']) ? array_flip($CONFIG['dont_override']) : array();
+  $no_override = is_array($config['dont_override']) ? array_flip($config['dont_override']) : array();
 
   // add some labels to client
   rcube_add_label('nopagesizewarning');
@@ -40,23 +39,23 @@ function rcmail_user_prefs_form($attrib)
   // allow the following attributes to be added to the <table> tag
   $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'cellpadding', 'cellspacing', 'border', 'summary'));
 
-  // return the complete edit form as table
-  $out = "$form_start<table" . $attrib_str . ">\n\n";
+  // return the complete edit form as tables
+  $out = "$form_start<fieldset><legend>" . Q(rcube_label('uisettings')) . "</legend>\n<table" . $attrib_str . ">\n\n";
 
   // show language selection
   if (!isset($no_override['language']))
     {
-    $a_lang = rcube_list_languages();
+    $a_lang = $RCMAIL->list_languages();
     asort($a_lang);
   
     $field_id = 'rcmfd_lang';
-    $select_lang = new select(array('name' => '_language', 'id' => $field_id));
+    $select_lang = new html_select(array('name' => '_language', 'id' => $field_id));
     $select_lang->add(array_values($a_lang), array_keys($a_lang));
   
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('language')),
-                    $select_lang->show($sess_user_lang));
+                    $select_lang->show($_SESSION['language']));
     }
 
 
@@ -64,7 +63,7 @@ function rcmail_user_prefs_form($attrib)
   if (!isset($no_override['timezone']))
     {
     $field_id = 'rcmfd_timezone';
-    $select_timezone = new select(array('name' => '_timezone', 'id' => $field_id));
+    $select_timezone = new html_select(array('name' => '_timezone', 'id' => $field_id));
     $select_timezone->add('(GMT -11:00) Midway Island, Samoa', '-11');
     $select_timezone->add('(GMT -10:00) Hawaii', '-10');
     $select_timezone->add('(GMT -9:30) Marquesas Islands', '-9.5');
@@ -109,82 +108,101 @@ function rcmail_user_prefs_form($attrib)
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('timezone')),
-                    $select_timezone->show((string)$CONFIG['timezone']));
+                    $select_timezone->show((string)$config['timezone']));
     }
 
   // daylight savings
   if (!isset($no_override['dst_active']))
     {
     $field_id = 'rcmfd_dst';
-    $input_dst = new checkbox(array('name' => '_dst_active', 'id' => $field_id, 'value' => 1));
+    $input_dst = new html_checkbox(array('name' => '_dst_active', 'id' => $field_id, 'value' => 1));
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('dstactive')),
-                    $input_dst->show($CONFIG['dst_active']));
+                    $input_dst->show($config['dst_active']));
     }
 
   // show page size selection
   if (!isset($no_override['pagesize']))
     {
     $field_id = 'rcmfd_pgsize';
-    $input_pagesize = new textfield(array('name' => '_pagesize', 'id' => $field_id, 'size' => 5));
+    $input_pagesize = new html_inputfield(array('name' => '_pagesize', 'id' => $field_id, 'size' => 5));
 
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('pagesize')),
-                    $input_pagesize->show($CONFIG['pagesize']));
+                    $input_pagesize->show($config['pagesize']));
     }
 
   // MM: Show checkbox for toggling 'pretty dates' 
   if (!isset($no_override['prettydate']))
     {
     $field_id = 'rcmfd_prettydate';
-    $input_prettydate = new checkbox(array('name' => '_pretty_date', 'id' => $field_id, 'value' => 1));
+    $input_prettydate = new html_checkbox(array('name' => '_pretty_date', 'id' => $field_id, 'value' => 1));
 
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('prettydate')),
-                    $input_prettydate->show($CONFIG['prettydate']?1:0));
+                    $input_prettydate->show($config['prettydate']?1:0));
     }
 
   // show checkbox for HTML/plaintext messages
   if (!isset($no_override['prefer_html']))
     {
     $field_id = 'rcmfd_htmlmsg';
-    $input_pagesize = new checkbox(array('name' => '_prefer_html', 'id' => $field_id, 'value' => 1));
+    $input_pagesize = new html_checkbox(array('name' => '_prefer_html', 'id' => $field_id, 'value' => 1));
 
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('preferhtml')),
-                    $input_pagesize->show($CONFIG['prefer_html']?1:0));
+                    $input_pagesize->show($config['prefer_html']?1:0));
     }
 
   // Show checkbox for HTML Editor
   if (!isset($no_override['htmleditor']))
     {
     $field_id = 'rcmfd_htmleditor';
-    $input_htmleditor = new checkbox(array('name' => '_htmleditor', 'id' => $field_id, 'value' => 1));
+    $input_htmleditor = new html_checkbox(array('name' => '_htmleditor', 'id' => $field_id, 'value' => 1));
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('htmleditor')),
-                    $input_htmleditor->show($CONFIG['htmleditor']?1:0));
+                    $input_htmleditor->show($config['htmleditor']?1:0));
+    }
+
+
+  if (!isset($no_override['mdn_requests']))
+    {
+    $field_id = 'rcmfd_mdn_requests';
+    $select_mdn_requests = new html_select(array('name' => '_mdn_requests', 'id' => $field_id));
+    $select_mdn_requests->add(rcube_label('askuser'), 0);
+    $select_mdn_requests->add(rcube_label('autosend'), 1);
+    $select_mdn_requests->add(rcube_label('ignore'), 2);
+
+    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
+                    $field_id,
+                    Q(rcube_label('mdnrequests')),
+                    $select_mdn_requests->show($config['mdn_requests']));
     }
 
+  $out .= "</table></fieldset>\n<fieldset><legend>" . Q(rcube_label('mailboxview')) . "</legend>\n<table" . $attrib_str . ">\n\n";
+
   // show config parameter for 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));
+    $input_preview = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1));
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('previewpane')),
-                    $input_preview->show($CONFIG['preview_pane']?1:0));
+                    $input_preview->show($config['preview_pane']?1:0));
     }
+
+  $out .= "</table></fieldset>\n<fieldset><legend>" . Q(rcube_label('serversettings')) . "</legend>\n<table" . $attrib_str . ">\n\n";
                   
-  if (!empty($CONFIG['drafts_mbox']) && !isset($no_override['draft_autosave']))
+  if (!empty($config['drafts_mbox']) && !isset($no_override['draft_autosave']))
     {
     $field_id = 'rcmfd_autosave';
-    $select_autosave = new select(array('name' => '_draft_autosave', 'id' => $field_id));
+    $select_autosave = new html_select(array('name' => '_draft_autosave', 'id' => $field_id));
     $select_autosave->add(rcube_label('never'), 0);
     foreach (array(3, 5, 10) as $i => $min)
       $select_autosave->add(rcube_label(array('name' => 'everynminutes', 'vars' => array('n' => $min))), $min*60);
@@ -192,10 +210,52 @@ function rcmail_user_prefs_form($attrib)
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('autosavedraft')),
-                    $select_autosave->show($CONFIG['draft_autosave']));
+                    $select_autosave->show($config['draft_autosave']));
+    }
+
+  if (!isset($no_override['read_when_deleted']))
+    {
+    $field_id = 'rcmfd_read_deleted';
+    $input_readdeleted = new html_checkbox(array('name' => '_read_when_deleted', 'id' => $field_id, 'value' => 1));
+    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
+                    $field_id,
+                    Q(rcube_label('readwhendeleted')),
+                    $input_readdeleted->show($config['read_when_deleted']?1:0));
     }
 
-  $out .= "\n</table>$form_end";
+  if (!isset($no_override['flag_for_deletion']))
+    {
+    $field_id = 'rcmfd_flag_for_deletion';
+    $input_flagfordeletion = new html_checkbox(array('name' => '_flag_for_deletion', 'id' => $field_id, 'value' => 1));
+    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
+                    $field_id,
+                    Q(rcube_label('flagfordeletion')),
+                    $input_flagfordeletion->show($config['flag_for_deletion']?1:0));
+    }
+
+  // Trash purging on logout
+  if (!isset($no_override['logout_purge']))
+    {
+    $field_id = 'rcmfd_logout_purge';
+    $input_purge = new html_checkbox(array('name' => '_logout_purge', 'id' => $field_id, 'value' => 1));
+    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
+                    $field_id,
+                    Q(rcube_label('logoutclear')),
+                    $input_purge->show($config['logout_purge']?1:0));
+    }
+
+  // INBOX compacting on logout
+  if (!isset($no_override['logout_expunge']))
+    {
+    $field_id = 'rcmfd_logout_expunge';
+    $input_expunge = new html_checkbox(array('name' => '_logout_expunge', 'id' => $field_id, 'value' => 1));
+    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
+                    $field_id,
+                    Q(rcube_label('logoutcompact')),
+                    $input_expunge->show($config['logout_expunge']?1:0));
+    }
+
+  $out .= "\n</table></fieldset>$form_end";
 
   return $out;  
   }
@@ -227,22 +287,18 @@ function rcmail_identities_list($attrib)
 // similar function as in /steps/addressbook/edit.inc
 function get_form_tags($attrib, $action, $add_hidden=array())
   {
-  global $OUTPUT, $EDIT_FORM, $SESS_HIDDEN_FIELD;  
+  global $EDIT_FORM, $RCMAIL;
 
   $form_start = '';
   if (!strlen($EDIT_FORM))
     {
-    $hiddenfields = new hiddenfield(array('name' => '_task', 'value' => $GLOBALS['_task']));
+    $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $RCMAIL->task));
     $hiddenfields->add(array('name' => '_action', 'value' => $action));
     
     if ($add_hidden)
       $hiddenfields->add($add_hidden);
     
-    if ($_GET['_framed'] || $_POST['_framed'])
-      $hiddenfields->add(array('name' => '_framed', 'value' => 1));
-    
-    $form_start = !strlen($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
-    $form_start .= "\n$SESS_HIDDEN_FIELD\n";
+    $form_start = !strlen($attrib['form']) ? $RCMAIL->output->form_tag(array('name' => "form", 'method' => "post")) : '';
     $form_start .= $hiddenfields->show();
     }
     
@@ -250,11 +306,11 @@ function get_form_tags($attrib, $action, $add_hidden=array())
   $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form';
 
   if (!strlen($EDIT_FORM))
-    $OUTPUT->add_gui_object('editform', $form_name);
+    $RCMAIL->output->add_gui_object('editform', $form_name);
   
   $EDIT_FORM = $form_name;
 
-  return array($form_start, $form_end);  
+  return array($form_start, $form_end);
   }
 
 
index 73f28cb168ccf7eb4df3a2025ee7dd88bdc343a0..3ea9a9a229bd097a6c5d7df407fc47301b008911 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: identities.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: identities.inc 1412 2008-05-21 07:45:54Z alec $
 
 */
 
-if ($USER_DATA = $DB->fetch_assoc($sql_result))
-  $OUTPUT->set_pagetitle(sprintf('%s (%s@%s)', rcube_label('identities'), $USER_DATA['username'], $USER_DATA['mail_host']));
+$OUTPUT->set_pagetitle(rcube_label('identities'));
 
 $OUTPUT->include_script('list.js');
 
@@ -45,5 +44,5 @@ function rcmail_identity_frame($attrib)
 
 $OUTPUT->add_handler('identityframe', 'rcmail_identity_frame');
 
-parse_template('identities');
+$OUTPUT->send('identities');
 ?>
\ No newline at end of file
index 6e89bebbc2586828280543b0f731316fdf616c6b..b23805bfe032c7124bf4883a562c67ac443c8298 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: manage_folders.inc 1255 2008-04-05 12:49:21Z thomasb $
+ $Id: manage_folders.inc 1455 2008-05-30 11:52:15Z alec $
 
 */
 
-// init IMAP connection
-rcmail_imap_init(TRUE);
-
-$OUTPUT->include_script('list.js');
+// WARNING: folder names in UI are encoded with UTF-8
 
+// init IMAP connection
+$RCMAIL->imap_init(true);
 
 // subscribe to one or more mailboxes
-if ($_action=='subscribe')
+if ($RCMAIL->action=='subscribe')
   {
-  if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST))
+  if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST, false, 'UTF-7'))
     $IMAP->subscribe(array($mbox));
-
-  if ($OUTPUT->ajax_call)
-    $OUTPUT->remote_response('// subscribed');
   }
 
 // unsubscribe one or more mailboxes
-else if ($_action=='unsubscribe')
+else if ($RCMAIL->action=='unsubscribe')
   {
-  if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST))
+  if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST, false, 'UTF-7'))
     $IMAP->unsubscribe(array($mbox));
-
-  if ($OUTPUT->ajax_call)
-    $OUTPUT->remote_response('// unsubscribed');
   }
 
 // create a new mailbox
-else if ($_action=='create-folder')
+else if ($RCMAIL->action=='create-folder')
   {
   if (!empty($_POST['_name']))
-    $create = $IMAP->create_mailbox(trim(get_input_value('_name', RCUBE_INPUT_POST, FALSE, 'UTF-7')), TRUE);
-
+    {
+    $name = trim(get_input_value('_name', RCUBE_INPUT_POST, FALSE, 'UTF-7'));
+    // #1485036 (RFC3501, 5.1.3) TODO: it should be done on read not on write
+    $name = str_replace('&-', '&', $name);
+    $create = $IMAP->create_mailbox($name, TRUE);
+    }
+  
   if ($create && $OUTPUT->ajax_call)
     {
     $delimiter = $IMAP->get_hierarchy_delimiter();
+    $folderlist = $IMAP->list_unsubscribed();
+    $index = array_search($create, $folderlist);
+    $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF-7') : false;
+    
+    $create = rcube_charset_convert($create, 'UTF-7');
     $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();
+    $display_create = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', substr_count($create, $delimiter)) . $foldersplit[count($foldersplit)-1];
+
+    $OUTPUT->command('add_folder_row', $create, $display_create, false, $before);
     }
-  else if (!$create && $OUTPUT->ajax_call)
+  else if (!$create)
     {
     $OUTPUT->show_message('errorsaving', 'error');
-    $OUTPUT->remote_response();
     }
-  else if (!$create)
-    $OUTPUT->show_message('errorsaving', 'error');
   }
 
 // rename a mailbox
-else if ($_action=='rename-folder')
+else if ($RCMAIL->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')));
-    
+    {
+    $name_utf8 = trim(get_input_value('_folder_newname', RCUBE_INPUT_POST));
+    $oldname_utf8 = get_input_value('_folder_oldname', RCUBE_INPUT_POST);
+    $name = rcube_charset_convert($name_utf8, 'UTF-8', 'UTF-7');
+    $oldname = rcube_charset_convert($oldname_utf8, 'UTF-8', 'UTF-7');
+
+    // #1485036 (RFC3501, 5.1.3) TODO: it should be done on read not on write
+    $name = str_replace('&-', '&', $name);
+
+    $rename = $IMAP->rename_mailbox($oldname, $name);
+    }
+
   if ($rename && $OUTPUT->ajax_call)
     {
+    $folderlist = $IMAP->list_unsubscribed();
     $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))
+
+    $regexp = '/^' . preg_quote($rename . $delimiter, '/') . '/';
+
+    // subfolders
+    for ($x=sizeof($folderlist)-1; $x>=0; $x--)
+      {
+      if (preg_match($regexp, $folderlist[$x]))
         {
-        $c_rename = preg_replace('/^'.preg_quote($oldname, '/').'/', $rename, $mbox);
-        $foldersplit = explode($delimiter, $c_rename);
+       $oldfolder = $oldname . $delimiter . preg_replace($regexp, '', $folderlist[$x]);
+        $foldersplit = explode($delimiter, $folderlist[$x]);
         $level = count($foldersplit) - 1;
-        $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
-        $OUTPUT->command('replace_folder_row', $mbox, $c_rename, $display_rename);
+        $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) 
+           . rcube_charset_convert($foldersplit[$level], 'UTF-7');
+
+       $before = isset($folderlist[$x+1]) ? rcube_charset_convert($folderlist[$x+1], 'UTF-7') : false;
+        
+       $OUTPUT->command('replace_folder_row', rcube_charset_convert($oldfolder, 'UTF-7'),
+           rcube_charset_convert($folderlist[$x], 'UTF-7'), $display_rename, $before);
         }
+      }
+
+    $foldersplit = explode($delimiter, $rename);
+    $level = count($foldersplit) - 1;
+    $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
+    $index = array_search($rename, $folderlist);
+    $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF-7') : false;
+
+    $OUTPUT->command('replace_folder_row', $oldname_utf8, rcube_charset_convert($rename, 'UTF-7'),
+       $display_rename, $before);
+
     $OUTPUT->command('reset_folder_rename');
-    $OUTPUT->send();
     }
   else if (!$rename && $OUTPUT->ajax_call)
     {
     $OUTPUT->command('reset_folder_rename');
     $OUTPUT->show_message('errorsaving', 'error');
-    $OUTPUT->send();
     }
   else if (!$rename)
     $OUTPUT->show_message('errorsaving', 'error');
   }
 
 // delete an existing IMAP mailbox
-else if ($_action=='delete-folder')
+else if ($RCMAIL->action=='delete-folder')
   {
-  $a_mboxes = array_merge($IMAP->list_mailboxes(), $IMAP->list_unsubscribed());
+  $a_mboxes = $IMAP->list_unsubscribed();
   $delimiter = $IMAP->get_hierarchy_delimiter();
+  
+  $mboxes_utf8 = get_input_value('_mboxes', RCUBE_INPUT_POST);
+  $mboxes = rcube_charset_convert($mboxes_utf8, 'UTF-8', 'UTF-7');
 
-  if ($mboxes = get_input_value('_mboxes', RCUBE_INPUT_POST))
+  if ($mboxes)
     $deleted = $IMAP->delete_mailbox(array($mboxes));
 
   if ($OUTPUT->ajax_call && $deleted)
     {
-    $OUTPUT->command('remove_folder_row', get_input_value('_mboxes', RCUBE_INPUT_POST));
+    $OUTPUT->command('remove_folder_row', $mboxes_utf8);
     foreach ($a_mboxes as $mbox)
       {
-      $regex = get_input_value('_mboxes', RCUBE_INPUT_POST) . $delimiter;
-      $regex = preg_quote($regex, '/');
-      if (preg_match('/^'. $regex .'/', $mbox))
+      if (preg_match('/^'. preg_quote($mboxes.$delimiter, '/') .'/', $mbox))
         {
-        $OUTPUT->command('remove_folder_row', $mbox);
+        $OUTPUT->command('remove_folder_row', rcube_charset_convert($mbox, 'UTF-7'));
         }
       }
     $OUTPUT->show_message('folderdeleted', 'confirmation');
-    $OUTPUT->send();
     }
-  else if ($OUTPUT->ajax_call)
+  else if (!$deleted)
     {
     $OUTPUT->show_message('errorsaving', 'error');
-    $OUTPUT->send();
     }
   }
 
+if ($OUTPUT->ajax_call)
+  $OUTPUT->send();
 
 
 // build table with all folders listed by server
@@ -147,7 +171,6 @@ function rcube_subscription_form($attrib)
   list($form_start, $form_end) = get_form_tags($attrib, 'folders');
   unset($attrib['form']);
   
-  
   if (!$attrib['id'])
     $attrib['id'] = 'rcmSubscriptionlist';
 
@@ -173,8 +196,8 @@ function rcube_subscription_form($attrib)
   $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)"));
+
+  $checkbox_subscribe = new html_checkbox(array('name' => '_subscribed[]', 'onclick' => JS_OBJECT_NAME.".command(this.checked?'subscribe':'unsubscribe',this.value)"));
   
   if (!empty($attrib['deleteicon']))
     $del_button = sprintf('<img src="%s%s" alt="%s" border="0" />', $CONFIG['skin_path'], $attrib['deleteicon'], rcube_label('delete'));
@@ -197,9 +220,9 @@ function rcube_subscription_form($attrib)
     $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']) ? rcmail_localize_foldername($folder) : $display_folder;
-    
-    if (!$protected)
-      $a_js_folders['rcmrow'.($i+1)] = array($folder, rcube_charset_convert($folder, 'UTF-7'));
+    $folder_utf8 = rcube_charset_convert($folder, 'UTF-7');
+
+    $a_js_folders['rcmrow'.($i+1)] = array($folder_utf8, $display_folder, $protected);
 
     $out .= sprintf('<tr id="rcmrow%d" class="%s"><td class="name">%s</td><td class="msgcount">%d</td>',
                     $i+1,
@@ -210,7 +233,7 @@ function rcube_subscription_form($attrib)
     if ($protected)
       $out .= '<td class="subscribed">&nbsp;'.($subscribed ? '&#x2022;' : '-').'</td>';
     else
-      $out .= '<td class="subscribed">'.$checkbox_subscribe->show($subscribed?$folder:'', array('value' => $folder)).'</td>';
+      $out .= '<td class="subscribed">'.$checkbox_subscribe->show($subscribed?$folder_utf8:'', array('value' => $folder_utf8)).'</td>';
 
     // add rename and delete buttons
     if (!$protected)
@@ -251,12 +274,12 @@ function rcube_create_folder_form($attrib)
   // return the complete edit form as table
   $out = "$form_start\n";
 
-  $input = new textfield(array('name' => '_folder_name'));
+  $input = new html_inputfield(array('name' => '_folder_name'));
   $out .= $input->show();
   
   if (get_boolean($attrib['button']))
     {
-    $button = new input_field(array('type' => 'button',
+    $button = new html_inputfield(array('type' => 'button',
                                     'value' => rcube_label('create'),
                                     'onclick' => JS_OBJECT_NAME.".command('create-folder',this.form)"));
     $out .= $button->show();
@@ -278,7 +301,7 @@ function rcube_rename_folder_form($attrib)
   $out = "$form_start\n";
 
   $a_unsubscribed = $IMAP->list_unsubscribed();
-  $select_folder = new select(array('name' => '_folder_oldname', 'id' => 'rcmfd_oldfolder'));
+  $select_folder = new html_select(array('name' => '_folder_oldname', 'id' => 'rcmfd_oldfolder'));
 
   foreach ($a_unsubscribed as $i => $folder)
     {
@@ -291,12 +314,12 @@ function rcube_rename_folder_form($attrib)
   $out .= $select_folder->show();
 
   $out .= " to ";
-  $inputtwo = new textfield(array('name' => '_folder_newname'));
+  $inputtwo = new html_inputfield(array('name' => '_folder_newname'));
   $out .= $inputtwo->show();
 
   if (get_boolean($attrib['button']))
     {
-    $button = new input_field(array('type' => 'button',
+    $button = new html_inputfield(array('type' => 'button',
                                     'value' => rcube_label('rename'),
                                     'onclick' => JS_OBJECT_NAME.".command('rename-folder',this.form)"));
     $out .= $button->show();
@@ -307,6 +330,8 @@ function rcube_rename_folder_form($attrib)
   return $out;
   }
 
+$OUTPUT->set_pagetitle(rcube_label('folders'));
+$OUTPUT->include_script('list.js');
 
 // register UI objects
 $OUTPUT->add_handlers(array(
@@ -316,7 +341,7 @@ $OUTPUT->add_handlers(array(
 ));
 
 // add some labels to client
-rcube_add_label('deletefolderconfirm','addsubfolderhint');
+rcube_add_label('deletefolderconfirm','addsubfolderhint','forbiddencharacter');
 
 $OUTPUT->send('managefolders');
 ?>
index 787c5d2aea8205e633343184b9643676e2aa4196..73d783c7a58ec91b5187892cdbf6ae18599902e8 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_identity.inc 938 2007-12-10 15:27:19Z thomasb $
+ $Id: save_identity.inc 1407 2008-05-19 17:47:45Z thomasb $
 
 */
 
@@ -76,21 +76,17 @@ if ($_POST['_iid'])
   }
 }
 
-// insert a new contact
+// insert a new identity record
 else
 {
   if ($insert_id = $USER->insert_identity($save_data))
   {
+    $OUTPUT->show_message('successfullysaved', 'confirmation');
+    
     $_GET['_iid'] = $insert_id;
 
     if (!empty($_POST['_standard']))
       $default_id = $insert_id;
-
-    if ($_POST['_framed'])
-    {
-      // add contact row or jump to the page where it should appear
-      // ....
-    }
   }
   else
   {
@@ -107,6 +103,6 @@ if ($default_id)
   $USER->set_default($default_id);
 
 // go to next step
-rcmail_overwrite_action($_framed ? 'edit-identity' : 'identities');
+rcmail_overwrite_action('identities');
 
 ?>
\ No newline at end of file
index a2894d8f2ca105a98639683a8b2dd715e359db10..38bcc59bdcd5d93e007e60e7ba70d08a16c66247 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_prefs.inc 938 2007-12-10 15:27:19Z thomasb $
+ $Id: save_prefs.inc 1403 2008-05-19 08:09:38Z alec $
 
 */
 
 $a_user_prefs = array(
   'timezone'     => isset($_POST['_timezone']) ? floatval($_POST['_timezone']) : $CONFIG['timezone'],
   'dst_active'   => isset($_POST['_dst_active']) ? TRUE : FALSE,
-  'pagesize'     => is_numeric($_POST['_pagesize']) ? intval($_POST['_pagesize']) : $CONFIG['pagesize'],
+  'pagesize'     => is_numeric($_POST['_pagesize']) ? max(2, intval($_POST['_pagesize'])) : $CONFIG['pagesize'],
   'prettydate'   => isset($_POST['_pretty_date']) ? TRUE : FALSE,
   'prefer_html'  => isset($_POST['_prefer_html']) ? TRUE : FALSE,
   'htmleditor'   => isset($_POST['_htmleditor']) ? TRUE : FALSE,
   'preview_pane' => isset($_POST['_preview_pane']) ? TRUE : FALSE,
-  'draft_autosave' => isset($_POST['_draft_autosave']) ? intval($_POST['_draft_autosave']) : 0
+  'read_when_deleted' => isset($_POST['_read_when_deleted']) ? TRUE : FALSE,
+  'flag_for_deletion' => isset($_POST['_flag_for_deletion']) ? TRUE : FALSE,
+  'logout_purge' => isset($_POST['_logout_purge']) ? TRUE : FALSE,
+  'logout_expunge' => isset($_POST['_logout_expunge']) ? TRUE : FALSE,
+  'draft_autosave' => isset($_POST['_draft_autosave']) ? intval($_POST['_draft_autosave']) : 0,
+  'mdn_requests' => isset($_POST['_mdn_requests']) ? intval($_POST['_mdn_requests']) : 0,
   );
 
 // don't override these parameters
@@ -36,11 +41,9 @@ foreach ((array)$CONFIG['dont_override'] as $p)
 
 
 // switch UI language
-if (isset($_POST['_language']))
-  {
-  $sess_user_lang = $_SESSION['user_lang'] = get_input_value('_language', RCUBE_INPUT_POST);
-  rcmail_set_locale($sess_user_lang);
-  }
+if (isset($_POST['_language'])) {
+  $RCMAIL->load_language(get_input_value('_language', RCUBE_INPUT_POST));
+}
 
 // force min size
 if ($a_user_prefs['pagesize'] < 1)
index 4d41b146547887a0ec62d2e42bc1230c5695529c..38aebd5d99423d79e74d21f01412437465af4e63 100644 (file)
@@ -80,6 +80,7 @@ input[type="radio"]
 {
   border: 0;
   padding: 0;
+  background-color: transparent;
 }
 
 input.button
@@ -134,7 +135,7 @@ img
   width: 600px;
   height: 37px;
   background: url(images/taskbar.gif) top right no-repeat;
-  padding: 10px 14px 10px 0px;
+  padding: 10px 4px 10px 0px;
   text-align: right;
   white-space: nowrap;
   z-index: 2;
@@ -147,7 +148,7 @@ img
   font-size: 11px;
   color: #666666;
   text-decoration: none;
-  padding: 6px 16px 6px 30px;
+  padding: 6px 16px 6px 25px;
   background-repeat: no-repeat;
 }
 
@@ -317,7 +318,7 @@ table.records-table tr.unfocused td
 {
   position: absolute;
   top: 60px;
-  right: 30px;
+  right: 20px;
   width: 182px;
   height: 20px;
   text-align: right;
diff --git a/skins/default/editor_ui.css b/skins/default/editor_ui.css
deleted file mode 100644 (file)
index 851837d..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/* 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
index ef561d9f41931485dc516db97446c7d79e74916a..5121ba19b3c356a74708ccdcd9357b5e9fd78817 100644 (file)
@@ -1,3 +1,5 @@
 <div id="tabsbar">
-<span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span><span id="settingstabfolders" class="tablink"><roundcube:button command="folders" type="link" label="folders" title="managefolders" class="tablink" /></span><span id="settingstabidentities" class="tablink"><roundcube:button command="identities" type="link" label="identities" title="manageidentities" class="tablink" /></span>
+<span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span>
+<span id="settingstabfolders" class="tablink"><roundcube:button command="folders" type="link" label="folders" title="managefolders" class="tablink" /></span>
+<span id="settingstabidentities" class="tablink"><roundcube:button command="identities" type="link" label="identities" title="manageidentities" class="tablink" /></span>
 </div>
index 69762b6652c3e9cf77308c054d5287cbf94da0ca..f5d041fd6cf70012daf778aa888500875ef8291a 100644 (file)
@@ -133,7 +133,7 @@ td.formlinks a:visited
 {
   position: absolute;
   bottom: 16px;
-  right: 30px;
+  right: 20px;
   width: 300px;
   height: 20px;
   text-align: right;
@@ -163,13 +163,13 @@ td.formlinks a:visited
   position: absolute;
   top: 85px;
   left: 200px;
-  right: 30px;
+  right: 20px;
   bottom: 40px;
   border: 1px solid #999999;
   background-color: #F9F9F9;
   overflow: auto;
   /* css hack for IE */
-  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-220)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
 }
 
@@ -178,12 +178,12 @@ td.formlinks a:visited
   position: absolute;
   top: 305px;
   left: 200px;
-  right: 30px;
+  right: 20px;
   bottom: 40px;
   border: 1px solid #999999;
   background-color: #F9F9F9;
   /* css hack for IE */
-  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-220)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-135-document.getElementById('mailcontframe').offsetHeight)+'px');
 }
 
@@ -195,7 +195,7 @@ td.formlinks a:visited
   right: 0px;
   bottom: 0px;
   /* css hack for IE */
-  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-220)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-135-document.getElementById('mailcontframe').offsetHeight)+'px');
 }
 
@@ -213,7 +213,10 @@ td.formlinks a:visited
   position: absolute;
   top: 10px;
   left: 220px;
+  right: 20px;
   height: 40px;
+  /* css hack for IE */
+  width: expression((parseInt(document.documentElement.clientWidth)-240)+'px');
 }
 
 #partheader table td
@@ -252,7 +255,7 @@ td.formlinks a:visited
   position: absolute;
   top: 85px;
   left: 20px;
-  width: 160px;
+  width: 170px;
   bottom: 40px;
   border: 1px solid #999;
   background-color: #F9F9F9;
@@ -277,7 +280,7 @@ td.formlinks a:visited
 {
   font-size: 11px;
   background: url(images/icons/folder-closed.png) no-repeat;
-  background-position: 10px 1px;
+  background-position: 5px 1px;
   border-bottom: 1px solid #EBEBEB;
 }
 
@@ -309,7 +312,7 @@ td.formlinks a:visited
 #mailboxlist li a
 {
   display: block;
-  padding-left: 32px;
+  padding-left: 25px;
   padding-top: 2px;
   padding-bottom: 2px;
   text-decoration: none;
@@ -559,14 +562,14 @@ html>body*#messagelist[id$="messagelist"]:not([class="none"]) { table-layout: au
   position: absolute;
   top: 85px;
   left: 200px;
-  right: 30px;
+  right: 20px;
   bottom: 40px;
   border: 1px solid #999;
   background-color: #FFF;
   overflow: auto;
   /* css hack for IE */
   /* margin-bottom: 10px; */
-  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-220)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
 }
 
@@ -616,13 +619,13 @@ table.headers-table tr td.subject
 #attachment-list
 {
   margin: 0px;
-  padding: 0px 0px 0px 68px;
-  min-height: 18px;
+  padding: 0px 0px 0px 72px;
+  min-height: 16px;
   list-style-image: none;
   list-style-type: none;
-  background: url(images/icons/attachment.png) 52px 1px no-repeat #DFDFDF;
-  /* css hack for IE */
-  height: expression(Math.min(18, parseInt(this.clientHeight))+'px');
+  background: url(images/icons/attachment.png) 60px 2px no-repeat #DFDFDF;
+  /* IE6 hack */    
+  _height: expression(Math.min(16, parseInt(document.documentElement.clientHeight))+'px');
 }
 
 #attachment-list:after
@@ -640,7 +643,8 @@ table.headers-table tr td.subject
   float: left;
   height: 18px;
   font-size: 11px;
-  padding: 2px 10px 0px 10px;
+  padding: 2px 0px 0px 15px;
+  white-space: nowrap;
 }
 
 #attachment-list li a
@@ -673,7 +677,8 @@ div.message-part
   border-top: 0;
 }
 
-div.message-part a
+div.message-part a,
+div.message-htmlpart a
 {
   color: #0000CC;
 }
@@ -711,6 +716,16 @@ div.message-part blockquote blockquote blockquote
   border-right: 2px solid #bb0000;
 }
 
+body.iframe div.message-htmlpart
+{
+  margin: 8px;
+}
+
+div.message-htmlpart div.rcmBody
+{
+  margin: 8px;
+}
+
 #remote-objects-message
 {
   display: none;
@@ -745,12 +760,12 @@ div.message-part blockquote blockquote blockquote
   position: absolute;
   top: 90px;
   left: 200px;
-  right: 40px;
-  bottom: 40px;
+  right: 25px;
+  bottom: 30px;
   padding: 0px;
   margin: 0px;
   /* css hack for IE */
-  width: expression((parseInt(document.documentElement.clientWidth)-240)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-220)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-130)+'px');
 }
 
index 9f0c8f3cc0e5d578f3031ac664f641553e8ee2c4..ce67ec41ed42d31f5e651cdc487d872f0fa01d55 100644 (file)
@@ -197,3 +197,15 @@ div.settingspart
 {
   width: 90px;
 }
+
+fieldset 
+{
+  margin-bottom: 0.5em;
+  border: 1px solid #999999;
+}
+
+legend
+{
+  color: #999999;
+}
+  
\ No newline at end of file
index f45c63bcb0598960fc4b1805a5743a1c6c837954..25a3ef91f84ab86dc104dc353b3861a3fabe636a 100644 (file)
@@ -164,10 +164,10 @@ function rcmail_prev_sibling(elm)
 <script type="text/javascript">
 <!--
 
-var cc_field = document.form._cc;
+var cc_field = document.getElementById('rcmcomposecc');
 if (cc_field && cc_field.value!='')
   rcmail_show_header_form('compose-cc', document.getElementById('addcclink'));
-var bcc_field = document.form._bcc;
+var bcc_field = document.getElementById('rcmcomposebcc');
 if (bcc_field && bcc_field.value!='')
   rcmail_show_header_form('compose-bcc', document.getElementById('addbcclink'));
 
index 2c3846b2b22ed116543b115c3a85280886b30677..a0f38fb7937aa24cb22a4a2598f006ce2bb3490e 100644 (file)
@@ -101,7 +101,7 @@ body_keypress: function(evt, p)
 <div id="messagetoolbar">
 <roundcube:button command="checkmail" imageSel="/images/buttons/inbox_sel.png" imageAct="/images/buttons/inbox_act.png" imagePas="/images/buttons/inbox_pas.png" width="32" height="32" title="checkmail" />
 <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="writenewmessage" />
-<roundcube:button id="markreadbutton" image="/images/buttons/markread_act.png" width="32" height="32" title="markmessages" onclick="rcmailUI.show_markmenu();return false" />
+<roundcube:button name="markreadbutton" id="markreadbutton" image="/images/buttons/markread_act.png" width="32" height="32" title="markmessages" onclick="rcmailUI.show_markmenu();return false" />
 <roundcube:button command="reply" imageSel="/images/buttons/reply_sel.png" imageAct="/images/buttons/reply_act.png" imagePas="/images/buttons/reply_pas.png" width="32" height="32" title="replytomessage" />
 <roundcube:button command="reply-all" imageSel="/images/buttons/replyall_sel.png" imageAct="/images/buttons/replyall_act.png" imagePas="/images/buttons/replyall_pas.png" width="32" height="32" title="replytoallmessage" />
 <roundcube:button command="forward" imageSel="/images/buttons/forward_sel.png" imageAct="/images/buttons/forward_act.png" imagePas="/images/buttons/forward_pas.png" width="32" height="32" title="forwardmessage" />
index 7824c7f8f1f2cb21ee5fb9f916fba2423db8edda..1aa92ab9ea174bad4e9673545248b89cd151794c 100644 (file)
 </div>
 
 <div id="messageframe">
+
 <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" addicon="/images/icons/plus.gif" summary="Message headers" />
 <roundcube:object name="messageAttachments" id="attachment-list" />
+
 <roundcube:object name="blockedObjects" id="remote-objects-message" />
 <roundcube:object name="messageBody" id="messagebody" showImages="true" />
+
 </div>
 
 </body>
index 9da9d199cda7356b37d00c32344fb05af639dfba..c524b7f23996f7b5da14633b39197bffd8ec789f 100644 (file)
 
 <div id="partheader">
 <roundcube:object name="messagePartControls" cellpadding="2" cellspacing="0" />
+
+<div style="position:absolute; top:2px; right:0; width:12em; text-align:right">
+  [<a href="#close" class="closelink" onclick="self.close()"><roundcube:label name="close" /></a>]
+</div>
 </div>
 
 
index bb01399179627b692ecdca5a6532d51d9bd40efc..dfb67e05abf7d5ae8d2ee4bd17b2c67e568c75db 100644 (file)
@@ -17,7 +17,7 @@
 <div style="padding:15px">
 <roundcube:object name="userprefs">
 
-<p><br /><roundcube:button command="save" type="input" class="button" label="save" /></p>
+<p><roundcube:button command="save" type="input" class="button" label="save" /></p>
 </div>
 </div>